﻿<!--
//<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
function isDateTime(iv){
	if (typeof(iv) != 'string') return false;
	var m_31 = ',1,3,5,7,8,10,12,';
	var m_30 = ',4,6,9,11,';
	var rex	 = /^(\d{2,4})[-\/](\d{1,2})[-\/](\d{1,2})(?:(\d{1,2}):(\d{1,2}):(\d{1,2}))?$/;
	var result = iv.match(rex);
	if (result == null) return false;
	for (var i = 1; i < result.length; i++) if (result[i].toString() == '') result[i] = '0';
	
	if (parseInt(result[2], 10) < 1 || parseInt(result[2], 10) > 12) return false;
	if (parseInt(result[3], 10) < 1 || parseInt(result[3], 10) > 31) return false;
	if (parseInt(result[4], 10) < 0 || parseInt(result[4], 10) > 59) return false;
	if (parseInt(result[5], 10) < 0 || parseInt(result[5], 10) > 59) return false;
	if (parseInt(result[6], 10) < 0 || parseInt(result[6], 10) > 59) return false;

	if (m_31.indexOf(','+parseInt(result[2], 10)+',') == -1){
		if(m_30.indexOf(','+parseInt(result[2], 10)+',') == -1){
			if (parseInt(result[1], 10) < 21){
				result[1] = '20' + result[1];
			}else{
				result[1] = '19' + result[1];
			}
			if (parseInt(result[1], 10)%4 == 0){
				if (parseInt(result[3], 10) > 29) return false;
			}else{
				if (parseInt(result[3], 10) > 28) return false;
			}
		}else{
			if (parseInt(result[3], 10) > 30) return false;
		}
	}
	return true;
}

function isMatchDateTime(date1, date2){
	if (isDateTime(date1) != isDateTime(date2)) return false;
	var rex	 = /^(\d{2,4})[-\/](\d{1,2})[-\/](\d{1,2})(?:(\d{1,2}):(\d{1,2}):(\d{1,2}))?$/;
	date1 = date1.match(rex);
	date2 = date2.match(rex);
	for (var i = 1; i < date1.length; i++) if (date1[i].toString() == '') date1[i] = '0';
	for (var i = 1; i < date2.length; i++) if (date2[i].toString() == '') date2[i] = '0';	
	if (parseInt(date1[1], 10) == parseInt(date2[1], 10) &&
		parseInt(date1[2], 10) == parseInt(date2[2], 10) &&
		parseInt(date1[3], 10) == parseInt(date2[3], 10) &&
		parseInt(date1[4], 10) == parseInt(date2[4], 10) &&
		parseInt(date1[5], 10) == parseInt(date2[5], 10) &&
		parseInt(date1[6], 10) == parseInt(date2[6], 10))
		return true;
	else
		return false;
}

function isValidator(handle,dataType,min,max,desc,allowNull){
	handle.datatype = dataType  || 'string';
	handle.min		= min;
	handle.max		= max;
	handle.desc		= desc;
	handle.allownull= allowNull || 'true';
	return isValidInput(handle);
}

function isValidSubmit(){
	var inputs	= document.getElementsByTagName('INPUT');
	var areas	= document.getElementsByTagName('TEXTAREA');
	if (inputs.length > 0){
		for (var i = 0; i < inputs.length; i++){
			if (!isValidInput(inputs[i])) return false;
		}
	}
	if (areas.length > 0){
		for (var i = 0; i < areas.length; i++){
			if (!isValidInput(areas[i])) return false;
		}
	}
	return true;
}

function isValidInput(handle){
	var rex_integer	= /^[-+]?\d+$/;
	var rex_decimal	= /^[-+]?\d+(\.\d+)?$/;
	var rex_email	= /^[0-9a-zA-Z]+([-_\.][0-9a-zA-Z]+)*@[0-9a-zA-Z]+([-_]\w+)*(\.[0-9a-zA-Z]+([-_\.][0-9a-zA-Z]+)*)+$/;
	var rex_url		= /^(http|ftp|mms|https):\/\/[0-9a-zA-Z]+(-[0-9a-zA-Z]+)*(\.[0-9a-zA-Z]+(-[0-9a-zA-Z]+)*)+(:\d+)?(\/.+)?$/;

	var desc		= null;
	var match		= null;
	var max			= null;
	var min			= null;

	if (handle.desc && handle.desc != '')
	    desc = handle.desc;
	else if(handle.id && handle.id != '')
	    desc = handle.id;
	else if(handle.name && handle.name != '')
	    desc = handle.name;
	else
        desc = '默认控件';
	try{
		//if (handle.tagName != 'TEXTAREA' && (handle.tagName == 'INPUT' && handle.type != 'text')) return true;
		if (!handle.datatype || handle.datatype == '') return true;
		if (handle.allownull == 'false'){
			if (handle.value == '') throw '* 说明: '+desc+'\n* 描述: 输入值不能为空!';
		}else{
			if (handle.value == '') return true;
		}
		//check data
		var datatype = handle.datatype;
		switch (datatype){
			case 'datetime':
				if (handle.max && isDateTime(handle.max)) max = new Date(max.replace(/\-/g,'/'));
				if (handle.min && isDateTime(handle.min)) min = new Date(min.replace(/\-/g,'/'));
				break;
			case 'ip':
				if (handle.max && isIp(handle.max)) max = handle.max;
				if (handle.min && isIp(handle.min)) min = handle.min;
				break;
			case 'decimal':
				if (handle.max && handle.max.match(rex_decimal)) max = parseFloat(handle.max, 10);
				if (handle.min && handle.min.match(rex_decimal)) min = parseFloat(handle.min, 10);
				break;
			default:
				if (handle.max && handle.max.match(rex_integer)) max = parseInt(handle.max, 10);
				if (handle.min && handle.min.match(rex_integer)) min = parseInt(handle.min, 10);
				break;
		}
		switch (datatype){
			case 'integer':
				match = handle.value.match(rex_integer);
				if (match == null)
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: -+0123456789';
				if (max != null && parseInt(match[0], 10) > max)
					throw '* 控件: '+desc+'\n* 描述: 输入值不能大于'+max+'!';
				if (min != null && parseInt(match[0], 10) < min)
					throw '* 控件: '+desc+'\n* 描述: 输入值不能小于'+min+'!';
				break;
			case 'decimal':
				match = handle.value.match(rex_decimal);
				if (match == null)
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: -+012345.789';
				if (max != null && parseFloat(match[0], 10) > max)
					throw '* 控件: '+desc+'\n* 描述: 输入值不能大于'+max+'!';
				if (min != null && parseFloat(match[0], 10) < min)
					throw '* 控件: '+desc+'\n* 描述: 输入值不能小于'+min+'!';
				break;
			case 'mail':
				match = handle.value.match(rex_email);
				if (match == null)
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: xxx@xxx.xxx';
				if (max != null && match[0].length > max)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能多于'+max+'!';
				if (min != null && match[0].length < min)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能少于'+min+'!';
				break;
			case 'url':
				match = handle.value.match(rex_url);
				if (match == null)
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: http://xxx.xxx.xxx';
				if (max != null && match[0].length > max)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能多于'+max+'!';
				if (min != null && match[0].length < min)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能少于'+min+'!';
				break;
			case 'datetime':
				if (!isDateTime(handle.value))
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: 1999-12-31 11:59:59';
				match = new Date(handle.value.replace(/\-/g,'/'));
				if (max && match > max){
					max = max.getFullYear()+'-'+(max.getMonth()+1)+'-'+max.getDate()+' '+max.getHours()+':'+max.getMinutes()+':'+max.getSeconds();
					throw '* 控件: '+desc+'\n* 描述: 输入值不能大于'+max+'!';
				}
				if (min && match < min){
					min = min.getFullYear()+'-'+(min.getMonth()+1)+'-'+min.getDate()+' '+min.getHours()+':'+min.getMinutes()+':'+min.getSeconds();
					throw '* 控件: '+desc+'\n* 描述: 输入值不能小于'+min+'!';
				}
				break;
			case 'ip':
				if (!isIp(handle.value))
					throw '* 控件: '+desc+'\n* 描述: 输入值格式错误!\n* 示例: 0.0.0.0 - 255.255.255.255';
				if (max && isMatchIp(handle.value,max))
					throw '* 控件: '+desc+'\n* 描述: 输入值不能大于'+max+'!';
				if (min && isMatchIp(min,handle.value))
					throw '* 控件: '+desc+'\n* 描述: 输入值不能小于'+min+'!';
				break;
			default:
				var result= handle.value;
				var count = result.length;
					match = 0;
				for(var i = 0; i < count; i++) if(result.charCodeAt(i) > 255) match += 2; else match += 1;
				if (max && match > max)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能多于'+max+'!';
				if (min && match < min)
					throw '* 控件: '+desc+'\n* 描述: 输入值字节长度不能少于'+min+'!';
				break;
		}
		return true;
	}catch(e){
		alert('错误信息\n\n'+e);
		try{
			handle.focus();
			handle.select();
		}catch(c){
			//
		}
		return false;
	}
}

function isIp(ip) {
	var rex_ip = '^\d+{1,3}\.\d+{1,3}\.\d+{1,3}\.\d+{1,3}$';
	var result = ip.match(rex_ip);
	if (result == null  ||
		RegExp.$1 > 255 ||
		RegExp.$1 < 0   ||
		RegExp.$2 > 255 ||
		RegExp.$2 < 0   ||
		RegExp.$3 > 255 ||
		RegExp.$3 < 0   ||
		RegExp.$4 > 255 ||
		RegExp.$4 < 0){
		return false;
	}else{
		return true;
	}
}

function isMatchIp(ip1, ip2){
	var ips1 = ip1.split('.');
	var ips2 = ip2.split('.');
	var ip1 = ips1[0]*1000000000+ips1[1]*1000000+ips1[2]*1000+ips1[3];
	var ip2 = ips2[0]*1000000000+ips2[1]*1000000+ips2[2]*1000+ips2[3];
	if (ip1 > ip2) return true; else return false;
}
//-->