/****************************************************************
        模块：	通用web页面检查程序
        输入：  
        说明：  使用前在页面上构造好要检查的页面元素及要求即可
        作者：	sammi
        时间：	2002-7-2 9:44
        版权：  未经授权或许可，任何人不得以任何形式进行复制、分发、使用。
                All rights reserved。
****************************************************************/

var INT_MAX_LENGTH = 14;
var obj = new Array();

function validate()
{
	for ( var j = 0; j < obj.length; j++ )
	{
		var elem = document.getElementById(obj[j].objID);
		obj[j].value = elem.value;				
		
		if ( isBlank(obj[j].value) )
		{
			alert('对不起，您忘了给[' + obj[j].realname + ']输入(选择)内容了，请输入后再提交。');
			return false;
		}
		
		if ( obj[j].type == 'TXT' )
		{
		}
		else if ( obj[j].type == 'TXT_NOSC' )
		{
			if ( ! validateSpe(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容中含有非法字符，请检查删除后再提交。');
				return false;
			}
			
			if ( checkSC(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容中只能为数字和英文字母，请检查删除后再提交。');
				return false;
			}
		}
		else if ( obj[j].type == 'INT' )
		{
			if ( ! checkInteger(obj[j].value,1) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是整数，请重新输入并确认后再提交。');
				return false;
			}
		}
		else if ( obj[j].type == 'DEC' )
		{
			if ( ! checkNumber(obj[j].value, 1) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是数字，请重新输入并确认后再提交。');
				return false;
			}
		}
		else if ( obj[j].type == 'DEC_DIGITS' )
		{
			if ( ! checkNumber(obj[j].value, 1) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是数字，请重新输入并确认后再提交。');
				return false;
			}
			
			var decLen = checkDecDigits(obj[j].value, obj[j].decLen);
			
			if ( decLen == -1 )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字格式有错误，请修正后再提交。');
				return false;
			}
			else if ( decLen == 1 ) 
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字，其中的小数位超出规定的长度\n' + '规定的小数位数长度为' + obj[j].decLen + '，请修正后再提交。');
				return false;
			}
			
			if ( checkIntLen(obj[j].value) > INT_MAX_LENGTH )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字超过系统支持的最大长度。\n' + '输入数字的整数部分最大长度为' + INT_MAX_LENGTH + '，请修正后提交。');
				return false;
			}
			
			// 检查上限
			var required = obj[j].length;
			
			if ( required.length > 0 )
			{
				var commaPos = required.indexOf(',');
				
				if ( commaPos > 0 )
				{
					obj[j].length = parseFloat(required.substring(0,commaPos));
					obj[j].upperlimit = parseFloat(required.substring(commaPos+1,required.length));
				
					if ( obj[j].upperlimit != -1 && (obj[j].value > obj[j].upperlimit) )
					{
						alert('对不起，您在[' + obj[j].realname + ']中输入的数值超过了指定的大小，\n' +	'此处录入的数据指定的上限为[' + obj[j].upperlimit + ']，请修正后提交。');
						obj[j].length = required;
						obj[j].upperlimit = -1;
						return false;
					}
				}
			}
			
			if ( parseFloat(obj[j].value) == 0 )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数值为0，请修正后再提交。');
				return false;
			}
		}
		else if ( obj[j].type == 'DEC_DIGIT' )
		{
			if ( ! checkNumber(obj[j].value, 1) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是数字，请重新输入并确认后再提交。');
				return false;
			}
			
			var decLen = checkDecDigits(obj[j].value, obj[j].decLen);
			
			if ( decLen == -1 )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字格式有错误，请修正后再提交。');
				return false;
			}
			else if ( decLen == 1)
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字，其中的小数位超出规定的长度\n' + '规定的小数位数长度为' + obj[j].decLen + '，请修正后再提交。');
				return false;
			}
			
			if ( checkIntLen(obj[j].value) > INT_MAX_LENGTH )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的数字超过系统支持的最大长度。\n' + '输入数字的整数部分最大长度为' + INT_MAX_LENGTH + '，请修正后提交。');
				return false;
			}
			
			// 检查上限
			var required = obj[j].length;
			
			if ( required.length > 0 )
			{
				var commaPos = required.indexOf(',');
				
				if ( commaPos > 0 )
				{
					obj[j].length = parseFloat(required.substring(0,commaPos));
					obj[j].upperlimit = parseFloat(required.substring(commaPos+1,required.length));
					
					if ( obj[j].upperlimit != -1 && (obj[j].value > obj[j].upperlimit) )
					{
						alert('对不起，您在[' + obj[j].realname + ']中输入的数值超过了指定的大小，\n' +	'此处录入的数据指定的上限为[' + obj[j].upperlimit + ']，请修正后提交。');
						obj[j].length = required;
						obj[j].upperlimit = -1;
						return false;
					}
				}
			}
		}
		else if ( obj[j].type == 'SEL' )
		{
			if ( obj[j].value == 'null' )
			{
				alert('对不起，您忘了对页面中的[' + obj[j].realname + ']做选择，请选择后再提交。');
				return false;
			}
			else if ( obj[j].value == '' )
			{
				alert('对不起，您选择的[' + obj[j].realname + ']的值有错误，请刷新后再选择。');
				return false;
			}
		}
		else if ( obj[j].type == 'MSEL' )
		{
			var selLen = 0;
			
			for ( var x = 0; x < elem.length; x++ )
			{
				if ( elem.options[x].selected )
				{
					selLen++;
				}
			}
			
			if ( obj[j].length != 0 && selLen > obj[j].length )
			{
				alert('对不起，多选框[' + obj[j].realname + ']只允许选择[' + obj[j].length + ']个，请您修正后再提交。');
				return false;
			}
		}
		else if ( obj[j].type == 'MAIL' )
		{
			if ( ! isMailAddress(obj[j].value) )
			{
				alert('对不起，您输入的[' + obj[j].realname + ']不是正确的邮件地址，请修正后再提交。');
				return false;
			}
		}
		// else if ( obj[j].type == 'PWD' )
		// {
		// 	var oldPwd = document.all(obj[j].realname);
		// 	
		// 	if ( ! comparePwd(oldPwd.value,obj[j].value) )
		// 	{
		// 		alert('对不起，您输入的新密码与旧密码的内容不一致，请重新输入。');
		// 		return false;
		// 	}
		// }
		else if ( obj[j].type == 'TIME' )
		{
			if ( ! checkTimeFat(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是正确的时间类型，正确的应该为hh:mm:ss(24:60:60)，请重新输入。');
				return false;
			}					
		}
		else if ( obj[j].type == 'DATE' )
		{
			if ( ! checkDateFat(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是正确的日期类型，正确的应该为YYYY-MM-DD(2003-01-01)，请重新输入。');
				return false;
			}					
		}
		else if ( obj[j].type == 'DATETIMESEL' )
		{
			if ( ! checkDateTimeFat(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中选择的内容不是正确的日期类型，请重新选择。');
				return false;
			}					
		}					
		else if ( obj[j].type == 'DATETIME' ) 
		{
			if ( ! checkDateTimeFat(obj[j].value) )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容不是正确的日期时间类型，正确的应该为YYYY-MM-DD HH:MM:SS(2003-01-01 00:00:00)，请重新输入。');
				return false;
			}					
		}
						
		if ( obj[j].type!='SEL' && obj[j].type != 'MAIL' && obj[j].type!='PWD' && obj[j].type!='MSEL' )
		{
			if ( checkLen(obj[j].value) > obj[j].length )
			{
				alert('对不起，您在[' + obj[j].realname + ']中输入的内容超过了要求的长度，\n' + '要求输入的最大长度为[' + obj[j].length + ']，请您修正后再提交。');
				return false;
			}
		}

		if ( obj[j].type == 'RADIO' )
		{
			// Add By RQ 2006-03-23 16:15 增加单选按钮组选择判断,为什么不属于 document.Form1.elements 系列?? 
			var radioGroup = document.getElementById(obj[j].objID).getElementsByTagName("INPUT");			
			
			if ( ! checkRadioGroup(radioGroup) )
			{
				alert('对不起，您忘了给[' + obj[j].realname + ']输入(选择)内容了，请输入后再提交。');
				return false;
			}
		}
	}
	
	return true;
}

// 类型：
// TXT				文本内容
// TXT_NOSC			只能是英文
// INT				整数
// DEC				浮点数
// DEC_DIGITS		浮点数_要求小数位数
// SEL				单项选择框
// MSEL				多项选择框
// MAIL				邮件地址
// PWD				密码
// TXT_NOSC			不能为中文
// MOBILE			手机号码
// PHONE			电话号码
// IDCARD			身份证号码
// DATE
// TIME hh-mm-ss	时间类型
// RADIO			单选按钮数组

// 参数说明
// realname 指标题
// objID 指控件id
// type 见上
// length 指最大长度
// declen 指小数点长度
function pageElement(realname, objID, type, length, declen)
{
    // (realname, objname, type, length, declen)
	this.realname   = realname;
	// this.objname = objname;
	this.objID	    = objID; // Edit By RQ：改用id做判断
	this.value      = '';
	this.type       = type.toUpperCase();
	this.length     = length;
	this.upperlimit = -1;
	this.decLen     = declen;
}

// function comparePwd(newPwd,oldPwd)
// {		
// 	return ( newPwd == oldPwd );
// }

// 判断是否为中文
function checkSC(value)
{
	for ( var i = 0; i < value.length; i++ )
	{
		if ( value.charCodeAt(i) > 255 )
		{
			return true;
		}
	}
	
	return false;
}

// 检查输入值的长度，一个汉字的长度计算为2
function checkLen(value)
{
	var len = 0;
	
	for ( var i = 0; i < value.length; i++ )
	{
		// 双字节
		if ( value.charCodeAt(i) > 255 )
		{
			len = len + 2;
		}
		else
		{
			len++;
		}
	}
	
	return len;
}

// 检查数字中的整数位长度
function checkIntLen(value)
{
	var dotPos =  value.indexOf('.');
	
	if ( dotPos = -1 )
	{
		return value.length;
	}
	else
	{
		return dotPos;
	}
}

// 检查输入值是否为空
function isBlank(value)
{
	var x = value.length;
	var y = 0;
	
	if ( x == 0 )
	{
		return true;
	}
	
	for ( var i = 0; i < x; i++ )
	{
		if ( value.charAt(i) == ' ' )
		{
			y++;
		}
	}
	
	return ( x == y );	
}

// 校验输入的特殊字符
function validateSpe(value)
{
	for ( var i = 0; i < value.length; i++ )
	{
	  	if (// (value.charAt (i) == '\"')
	     	// || (value.charAt (i) == '^')
	   		( ( value.charAt(i) > '&' ) && ( value.charAt(i) < '(' ) )   //"'" 	
	     	// ||((value.charAt(i)>'[')&&(value.charAt(i)<']')) //"\"
	     	// || (value.charAt (i) == '/')
	     	// || (value.charAt (i) == '&')
	     	// || (value.charAt (i) == '#')
	     	// || (value.charAt (i) == '$')
	     	// || (value.charAt (i) == '%')
	     	// || (value.charAt (i) == '|')
	     	// || (value.charAt (i) == '+')
	     	// || (value.charAt (i) == '*') 
	     	|| ( value.charAt (i) == '<' ) 
	     	|| ( value.charAt (i) == '>' ) )
	    {
  			return false;
  		}
 	}
 	
 	return true;
}

// 指定浮点数的小数点后N位，超出则出错
function checkDecDigits(value,digit)
{
	var j = 0;
	var pos = 0;
	
	for ( var i = 0; i < value.length; i++ )
	{
		if ( value.charAt(i)=='.' )
		{
			j++;
			pos = i;
		}
	}
	
	if ( j == 1 )
	{
		if ( ( value.length - ( pos + 1 ) ) <= digit )
		{
			// 正确
			return 0;
		}
		else
		{
			// 超出
			return 1;
		}
	}
	else if ( j > 1 )
	{
		// 数字格式有错误
		return -1;
	}
	
	return;
}

// 检查输入值是否为integer,flag表示是否可以包含+-号
function checkInteger(object_value,flag)
{
    if ( object_value.length == 0 ) 
    {
		return true;
	}
	
	var decimal_format = ".";
	var check_char;
	check_char = object_value.indexOf(decimal_format);
	
    if ( check_char < 1 )
    {
		return checkNumber(object_value,flag);
	}
    
	return false;
}

// 检查输入值是否为数字，flag为1时不允许包含正负号
function checkNumber(object_value,flag)
{
    if ( object_value.length == 0 )
    {
		return true;
	}
	
	var start_format;
	
	if ( flag == 0 )
	{
		start_format = " .+-0123456789";
	}
	else
	{
		start_format = ".0123456789";	
	}
	
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;
    // The first character can be + - .  blank or a digit.
	check_char = start_format.indexOf(object_value.charAt(0))
    
    // Was it a decimal?
	if ( check_char == 0 )
	{
		// decimal = true; Can not be decimal;
	    return false;
	}
	else if ( check_char < 1 )
	{
		return false;
	}
	
	// Remaining characters can be only . or a digit, but only one decimal.
	for ( var i = 1; i < object_value.length; i++ )
	{
		check_char = number_format.indexOf(object_value.charAt(i))
		
		if ( check_char < 0 )
		{
			return false;
		}
		else if (check_char == 1)
		{
			// Second decimal.
			if ( decimal )
			{
				return false;
			}
			else
			{
				decimal = true;
			}
		}
		else if (check_char == 0)
		{
			// ignore leading blanks
			if ( decimal || digits )
			{
				trailing_blank = true;
			}
		}
		else if ( trailing_blank )
		{
			return false;
		}
		else
		{
			digits = true;
		}
	}
	
    return true;
}

// check mail address format
function isMailAddress(address)
{
	var j = 0;
	
	if ( address == '' )
	{
		return false;
	}
	
	// only: a@b
	if ( address.length < 3 )
	{
		return false;
	}
	
	if ( hasBlank(address) )
	{
		return false;
	}
	
	if ( address.indexOf('@') >= 1 )
	{
		for ( var i = 0; i < address.length; i++ )
		{
			if ( address.charAt(i) == '@' )
			{
				j++;
			}
		}
		
		if ( j > 1 ) 
		{
			return false;
		}
		
		if ( ( address.charAt(0) == '@' ) || ( address.charAt(address.length - 1) == '@' ) )
		{
			// leading and last character cannot be @
			return false;
		}
		else
		{
			if ( ! validateSpe(address) )
			{
				return false;
			}
			
			return true;
		}
	}
	else
	{
		return false;
	}
	
	return true;
}


// 检查输入值中是否有空格
function hasBlank(value)
{
	var i = 0;
	
	for ( var j = 0; j < value.length; j++ )
	{
		if ( value.charAt(j) == ' ')
		{
			i++;
		}
	}
	
	if ( i == 0 )
	{
		// no blank
		return false;
	}
	
	// blank
	return true;
}

// 时间类型检查
function checkTimeFat(timeStr)
{
	// Checks if time is in HH:MM:SS AM/PM format.
	// The seconds and AM/PM are optional.
	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;	
	var matchArray = timeStr.match(timePat);
	
	if ( matchArray == null ) 
	{
		// alert("Time is not in a valid format.");
		return false;
	}
	
	hour   = matchArray[1];
	minute = matchArray[2];
	second = matchArray[4];
	
	if ( second=="" ) 
	{ 
		second = null; 
	}
		
	if ( hour < 0  || hour > 23 ) 
	{
		// alert("Hour must be between 1 and 12. (or 0 and 23 for military time)");
		return false;
	}
		
	if ( minute<0 || minute > 59 ) 
	{
		// alert ("Minute must be between 0 and 59.");
		return false;
	}
	
	if ( second != null && ( second < 0 || second > 59 ) ) 
	{
		// alert ("Second must be between 0 and 59.");
		return false;
	}
	
	return true;
}

// 日期类型检查
function checkDateFat(dateStr)
{
	// Checks if date is YYYY-MM-DD format.
	var datePat = /^(\d{4})-(\d{2})(-(\d{2}))$/;	
	var matchArray = dateStr.match(datePat);
	
	if ( matchArray == null ) 
	{
		return false;
	}
	
	syear  = matchArray[1];
	smonth = matchArray[2];
	sday   = matchArray[4];
		
	if ( syear < 1900  || syear > 2100 ) 
	{
		return false;
	}
	
	if ( smonth < 0 || smonth > 12 ) 
	{
		return false;
	}
	
	if ( sday < 0 || sday > 31 ) 
	{
		return false;
	}
	
	if ( sday == 31 )
	{
		if ( smonth != 1 && smonth != 3 && smonth != 5 && smonth != 7 && smonth != 8 && smonth != 10 && smonth != 12 )
		{
			return false;
		}
	}
	
	if ( sday > 29 && smonth == 2 )
	{
		return false;
	}
	
	if ( sday == 29 && smonth == 2 )
	{
		if ( syear % 4 != 0 )
		{
			return false;
		}
	}
	
	return true;
}

// 日期时间类型检查
function checkDateTimeFat(datetimeStr)
{
	// Checks if date is YYYY-MM-DD format.
	var datetimePat = /^(\d{4})-(\d{2})(-(\d{2}))( (\d{2}))(:(\d{2}))(:(\d{2}))$/;	
	var matchArray = datetimeStr.match(datetimePat);
	
	if ( matchArray == null ) 
	{
		return false;
	}
	
	syear   = matchArray[1];
	smonth  = matchArray[2];
	sday    = matchArray[4];
	shour   = matchArray[6] ;
	smin    = matchArray[8] ;
	ssecond = matchArray[10] ;
		
	if ( syear < 1998  || syear > 2100 ) 
	{
		return false;
	}
	
	if ( smonth < 0 || smonth > 12 ) 
	{
		return false;
	}
	
	if ( sday < 0 || sday > 31 )
	{
		return false;
	}
	
	if ( sday == 31 )
	{
		if ( smonth != 1 && smonth != 3 && smonth != 5 && smonth != 7 && smonth != 8 && smonth != 10 && smonth != 12 )
		{
			return false;
		}
	}
	
	if ( sday > 29 && smonth == 2 )
	{
		return false;
	}
	
	if ( sday == 29 && smonth == 2 )
	{
		if ( syear % 4 != 0 )
		{
			return false;
		}
	}
	
	if ( shour < 0 || shour > 23 || smin < 0 || smin > 59 || ssecond < 0 || ssecond > 59 )
	{
		return false ;
	}
	
	return true;
}

// 检查单选按钮组
function checkRadioGroup(radioGroup)
{
	for ( var i = 0; i < radioGroup.length; i++ )
	{
		if ( radioGroup[i].checked )
		{
			return true;
		}
	}
	
	return false;
}