﻿/****************************************************************
        模块：	通用web页面检查程序
        输入：  
        说明：  使用前在页面上构造好要检查的页面元素及要求即可
        作者：	sammi
        时间：	2002-7-2 9:44
        版权：  未经授权或许可，任何人不得以任何形式进行复制、分发、使用。
                All rights reserved。
****************************************************************/
////////////////////////////////////////////
// common function 
////////////////////////////////////////////
var INT_MAX_LENGTH = 14;
var obj = new Array();
function validate(f){
    if(typeof(f)=='undefined') f = document.aspnetForm;
	for(var i=0;i<f.elements.length;i++){
		var e = f.elements[i];
		for(var j=0;j<obj.length;j++){
			if(e.name==obj[j].objname){
				var elem = document.all(obj[j].objname);
				obj[j].value = elem.value;
				//alert(elem.name+'='+elem.value+','+obj[j].realname+'='+obj[j].value);
				if(isBlank(obj[j].value) && obj[j].empty!=true){
					alert('对不起，您忘了给‘'+obj[j].realname+'’输入(选择)内容了，请输入后再提交。');
					e.focus();
					return false;
				}
				if(!isBlank(obj[j].value))
				{
				    if(obj[j].type=='TXT'){
					    //if(hasBlank(obj[j].value)){
					    //	alert('对不起，您在‘'+obj[j].realname+'’中输入的内容中含有空格，请检查删除后再提交。');
					    //	return false;
					    //}
					    if(!validateSpe(obj[j].value)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容中不能含有 \', <, > 等非法字符，请检查删除后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='TXT_NOSC'){
					    //if(hasBlank(obj[j].value)){
					    //	alert('对不起，您在‘'+obj[j].realname+'’中输入的内容中含有空格，请检查删除后再提交。');
					    //	return false;
					    //}
					    if(!validateSpe(obj[j].value)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容中含有非法字符，请检查删除后再提交。');
						    e.focus();
						    return false;
					    }
					    if(checkSC(obj[j].value)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容中只能为数字和英文字母，请检查删除后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='INT'){
					    if(!checkInteger(obj[j].value,1)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是整数，请重新输入并确认后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='DEC'){
					    if(!checkNumber(obj[j].value,1)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是数字，请重新输入并确认后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='DEC_DIGITS'){
					    if(!checkNumber(obj[j].value,1)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是数字，请重新输入并确认后再提交。');
						    e.focus();
						    return false;
					    }
					    var decLen = checkDecDigits(obj[j].value,obj[j].decLen);
					    if(decLen == -1){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字格式有错误，请修正后再提交。');
						    e.focus();
						    return false;
					    }else if(decLen == 1){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字，其中的小数位超出规定的长度\n'+
								    '规定的小数位数长度为'+obj[j].decLen+'，请修正后再提交。');
							e.focus();
						    return false;
					    }
					    if(checkIntLen(obj[j].value)>INT_MAX_LENGTH){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字超过系统支持的最大长度。\n'+
								    '输入数字的整数部分最大长度为'+INT_MAX_LENGTH+'，请修正后提交。');
						    e.focus();
						    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;
								    e.focus();
								    return false;
							    }
						    }
					    }
					    if(parseFloat(obj[j].value)==0){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数值为0，请修正后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='DEC_DIGIT'){
					    if(!checkNumber(obj[j].value,1)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是数字，请重新输入并确认后再提交。');
						    e.focus();
						    return false;
					    }
					    var decLen = checkDecDigits(obj[j].value,obj[j].decLen);
					    if(decLen == -1){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字格式有错误，请修正后再提交。');
						    e.focus();
						    return false;
					    }else if(decLen == 1){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字，其中的小数位超出规定的长度\n'+
								    '规定的小数位数长度为'+obj[j].decLen+'，请修正后再提交。');
						    e.focus();
						    return false;
					    }
					    if(checkIntLen(obj[j].value)>INT_MAX_LENGTH){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的数字超过系统支持的最大长度。\n'+
								    '输入数字的整数部分最大长度为'+INT_MAX_LENGTH+'，请修正后提交。');
						    e.focus();
						    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;
								    e.focus();
								    return false;
							    }
						    }
					    }
				    }else if(obj[j].type=='SEL'){
					    if(obj[j].value=='null'){
						    alert('对不起，您忘了对页面中的‘'+obj[j].realname+'’做选择，请选择后再提交。');
						    e.focus();
						    return false;
					    }else if(obj[j].value==''){
						    alert('对不起，您选择的‘'+obj[j].realname+'’的值有错误，请刷新后再选择。');
						    e.focus();
						    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+'’个，请您修正后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='MAIL'){
					    if(!isMailAddress(obj[j].value)){
						    alert('对不起，您输入的‘'+obj[j].realname+'’不是正确的邮件地址，请修正后再提交。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='PWD'){
					    var oldPwd = document.all(obj[j].realname);
					    if(!comparePwd(oldPwd.value,obj[j].value)){
						    alert('对不起，您输入的新密码与旧密码的内容不一致，请重新输入。');
						    e.focus();
						    return false;
					    }
				    }else if(obj[j].type=='MOBILE'){
					    if(!checkMobilePhone(obj[j].value)){
						    //alert('对不起，您在‘'+obj[j].realname+'’中输入的内容只能是数字，请重新输入并确认后再提交。');
						    return false;
					    }					
				    }
				    else if(obj[j].type=='PHONE'){
					    if(!isPhone(obj[j].value)){
						    //alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是正确的数字，请重新输入并确认后再提交。');
						    return false;
					    }					
				    }else if(obj[j].type=='IDCARD'){
					    if(!checkIdcard(obj[j].value)){
						    //alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是正确的数字，请重新输入并确认后再提交。');
						    return false;
					    }					
				    }
				    else if(obj[j].type=='DATE'){
					    if(!checkDateFat(obj[j].value)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是正确的日期类型，正确的应该为yyyy-mm-dd(1900-2-21)，请重新输入。');
						    e.focus();
						    return false;
					    }					
				    }
				    else if(obj[j].type=='TIME'){
					    if(!checkTimeFat(obj[j].value)){
						    alert('对不起，您在‘'+obj[j].realname+'’中输入的内容不是正确的时间类型，正确的应该为hh:mm:ss(24:60:60)，请重新输入。');
						    e.focus();
						    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+'’，请您修正后再提交。');
				    e.focus();
					return false;
				}
			}
		}
	}
	return true;
}

///////////////////////////////////////////////
// type:
//	TXT				文本内容
//	INT				整数
//	DEC				浮点数
//	DEC_DIGITS			浮点数_要求小数位数
//	SEL				单项选择框
//	MSEL				多项选择框
//	MAIL				邮件地址
//	PWD				密码
//  TXT_NOSC			不能为中文
//	MOBILE				手机号码
//	PHONE				电话号码
//	IDCARD				身份证号码
//	DATE yyyy-MM-dd			日期类型
//	TIME hh-mm-ss			时间类型
function pageElement(realname, objname, type, length, declen , empty){
	this.realname = realname;
	this.objname = objname;
	this.value = '';
	this.type = type.toUpperCase();
	this.length = length;
	this.upperlimit = -1;
	this.decLen = declen;
	this.empty = empty;
}

function comparePwd(newPwd,oldPwd){
	if(newPwd!=oldPwd)
		return false;
	else
		return true;
}

////////////////////////////////////////////
//判断是否为中文
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++;
	}
	if(x==y){
		return true;
	}else{
		return false;
	}
}
////////////////////////////////////////////////
//校验输入的特殊字符
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_aspnetFormat = ".";
	var check_char;
	check_char = object_value.indexOf(decimal_aspnetFormat);
    if (check_char < 1)
		return checkNumber(object_value,flag);
    else
		return false;
}
////////////////////////////////////////////////////////
//检查输入值是否为数字，flag为1时不允许包含正负号
function checkNumber(object_value,flag){
    if (object_value.length == 0)return true;
	var start_aspnetFormat;
	if (flag == 0)
		start_aspnetFormat = " .+-0123456789";
	else
		start_aspnetFormat = ".0123456789";	
	var number_aspnetFormat = " .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_aspnetFormat.indexOf(object_value.charAt(0))
    //Was it a decimal?
	if (check_char == 0)
	    return false;//decimal = true; Can not be decimal;
	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_aspnetFormat.indexOf(object_value.charAt(i))
		if (check_char < 0)
			return false;
		else if (check_char == 1){
			if (decimal)		// Second decimal.
				return false;
			else
				decimal = true;
		}else if (check_char == 0){
			if (decimal || digits)	
				trailing_blank = true;// ignore leading blanks
		}else if (trailing_blank)
			return false;
		else
			digits = true;
	}//All tests passed, so...
    return true;
}

/////////////////////////////////////////
// check mail address aspnetFormat
function isMailAddress(address){
	var j=0;
	if(address == '')return false;
	if(address.length < 3)return false;//only: a@b
	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)=='@') ){
			return false;//leading and last character cannot be @
		}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){
		return false;//no blank
	}
	return true;//blank
}
//////////////////////////////////////
//日期检查，开始时间是否大于结束时间
function compareDate(sy,sm,sd,ey,em,ed){
	var syObj = document.all(sy);
	var smObj = document.all(sm);
	var sdObj = document.all(sd);
	var eyObj = document.all(ey);
	var emObj = document.all(em);
	var edObj = document.all(ed);
	var startDate = new Date(syObj.value,smObj.value,sdObj.value);
	var endDate = new Date(eyObj.value,emObj.value,edObj.value);
	if(startDate>end)return false;
	return;
}

//////////////////////////////////////
//电话号码检查
function isPhone(phone)
{
	if(phone!=""&&phone.length<8)
	{
		alert("电话号码至少为8位!");
		return false;
	}
	hasNumericChar=true;  
	for (i = 0; i <  phone.length ; i++)
	{
		if( (phone.charAt(i)<'0' || phone.charAt(i)>'9') && phone.charAt(i)!='-'
		&& phone.charAt(i)!=')'
		&& phone.charAt(i)!='(')
		{
			alert("电话号码只能由数字和'-,(,)'构成!");
			return false;
		}
		if(hasNumericChar&&phone.charAt(i)>'0' && phone.charAt(i)<'9')
	  		hasNumericChar=false;
		if(hasNumericChar&&(i>=phone.length-1))
		{
	 		alert("电话号码只能由数字和'-,(,)'构成!");
	  		return false;
		}
	}
	return true;
}

//////////////////////////////////////
//手机号码检查
function checkMobilePhone(phone)
{
	if(phone!=""&&phone.length<11)
	{
		alert("对不起，手机号码至少为11位，请重新输入!");
		return false;
	}
	hasNumericChar=true;  
	for (i = 0; i <  phone.length ; i++)
	{
		if( phone.charAt(i)<'0' || phone.charAt(i)>'9')
		{
			alert("对不起，电话号码只能由数字组成，请重新输入!");
			return false;
		}
		if(hasNumericChar&&phone.charAt(i)>'0' && phone.charAt(i)<'9')
	  		hasNumericChar=false;
		if(hasNumericChar&&(i>=phone.length-1))
		{
	 		alert("对不起，电话号码只能由数字组成，请重新输入!");
	  		return false;
		}
	}
	return true;
}

//////////////////////////////////////
//身份证检查
function checkIdcard(idcard)
{
	BirthYear  =  document.aspnetForm.year.value ;
 BirthMonth =  document.aspnetForm.month.value ;
 BirthDay   =  document.aspnetForm.day.value ;
	IDCardLenth = idcard.length;
//先判断身份证号的位数是否则正确。
 if  (!((IDCardLenth==15) ||  (IDCardLenth==18)))
   {
     window.alert("您所输入的身份证号码位数不对，应该为15位或18位！");
	 document.aspnetForm.idcard.focus();
	 return false;
   }
 //如果身份证号是15位，则判断是否全是数字，且与出生日期相符
 if (IDCardLenth==15)
  {
    if (isNaN(idcard))
	  {
	  window.alert("身份证号为15位，应该全部为数字")
	  document.aspnetForm.idcard.focus();
	  return false;	  
	  }
	else  //把出生年月日与身份证号比较！
	  {  
	  IDBirth=BirthYear.substr(2,2) + BirthMonth + BirthDay;
	  if (IDBirth!=idcard.substr(6,6))
         {
		   window.alert("身份证号为15位，与出生日期不符")
		   document.aspnetForm.idcard.focus();
	       return false;	  
		 }  
      }
  }
 if  (IDCardLenth==18)
  {
   if (isNaN(idcard.substr(0,17)))
      {
	   window.alert("身份证号为18位，前17应该全部为数字")
	   document.aspnetForm.idcard.focus();
	   return false;	  
	  }
    else
	  {
	  	IDBirth=BirthYear + BirthMonth + BirthDay;  
		if (IDBirth!=idcard.substr(6,8))
         {
		   window.alert("身份证号为18位，与出生日期不符")
		   document.aspnetForm.idcard.focus();
	       return false;	  
		 }  
 
      }  
  }
  return true;
}
//////////////////////////////////////
//日期类型检查
function checkDateFat(timeStr)
{
// Checks if time is in yyyy-MM-dd aspnetFormat.
	var timePat = /^(\d{4})-(\d{1,2})-(\d{1,2})?$/;
	
	var matchArray = timeStr.match(timePat);
	if (matchArray == null) {
		//alert("Time is not in a valid aspnetFormat.");
		return false;
	}
	year = matchArray[1];
	month = matchArray[2];
	day = matchArray[3];
		
	if (year > 2560  || year < 1600) {
		//alert("year must be between 1800 and 2200. (or 0 and 23 for military time)");
		return false;
	}
	//}
	if (month>12 || month < 1) {
		//alert ("month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		//alert ("day must be between 1 and 31.");
		return false;
	}
	return true;
}


//////////////////////////////////////
//时间类型检查
function checkTimeFat(timeStr)
{
// Checks if time is in HH:MM:SS AM/PM aspnetFormat.
// 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 aspnetFormat.");
		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;
}

