// Password policy 
var minChars = 8 ;
var lettersAllowed = true ;
var numbersAllowed = true ;
var specialAllowed = true ;
var minLetters = 1 ;
var minNumbers = 1 ;
var minSpecial = 1 ;

//function checkPassword(formName,passwordFieldName) { 
function checkPassword(pw) {
	//pw = window.document.forms[formName].elements[passwordFieldName].value ;
	if(!checkPasswordLength(pw)) {
		return false; 
	}
	
	if(!checkPasswordCharsAllowed(pw)) {
		return false;
	}
	
	if(!checkMinPasswordChars(pw)) {
		return false;
	}
	
	return true;
} 

// Check to make sure the password is at least minChars characters long. 
function checkPasswordLength(pw) { 
	if(pw.length < minChars) {
		alert("密码不能小于 "+minChars+" 位!");
		return false ;
	} 
	return true ;
} 

// Check to make sure that all of the characters in the password are allowed. 
function checkPasswordCharsAllowed(pw) { 
	for(var i=0;i<= pw.length;i++){
		var ch = pw.charAt(i)
		if(isSpecial(ch) && !specialAllowed) { 
			alert("密码包含不允许的特殊字符!") 
			return false ;
		}
	} 
	return true ;
} 

// Check to make sure the password has the required number of alphabetic, numeric, and 
// special characters. 
function checkMinPasswordChars(pw) { 
	var alpha = 0 ;
	var numeric = 0 ;
	var special = 0 ;
	var ch;

	for(var i=0;i<=pw.length;i++){
		ch = pw.charAt(i) ;
		if(isAlpha(ch)) ++alpha;
		else if(isNumber(ch)) ++numeric ;
		//else if(isSpecial(ch)) ++special ;
	} 
	
	var errMsg = "密码必须至少包含"; 
	if(alpha < minLetters) { 
		errMsg += "(" + minLetters + ") "; 
		errMsg += "位字母!" ;
		alert(errMsg) ;
		return false ;
	}else if(numeric < minNumbers) { 
		errMsg += "(" + minNumbers + ") " ;
		errMsg += "位数字!" ;
		alert(errMsg); 
		return false 
	}
	//else if(special < minSpecial) { 
	//	errMsg += "(" + minSpecial + ") " ;
	//	errMsg += "位特殊字符!" ;
	//	alert(errMsg) ;
	//	return false ;
	//} 
	
	return true ;
} 

// Functions used for character identification. 
function isAlpha(ch) { 
	if(ch >= "a" && ch <= "z") return true ;
	if(ch >= "A" && ch <= "Z") return true ;
	return false ;
} 

function isNumber(ch) { 
	if(ch >= "0" && ch <= "9") return true ;
	return false ;
} 

function isSpecial(ch) { 
    var special = new Array("!","@","~","#","$","%","^","&","*","(",")","_","+","-","=","{","[","}","]",";","|","<",">",",",".","?","`",":","'","/","\"");
	for(var i=0;i< 30;i++){
		if(ch == special[i]) {
			return true ;
		}
	}
	return false ;
} 

/**
 * 检查日期
 * 
 * e.g. :  checkDate('20060505')    // 返回true
 *         checkDate('yakfafff')    // 返回false
 * 		   checkDate('2006-13-01')    // 返回false
 */
function checkDate(dtValue) {
	var ch,s,d;
	s=new String("");
   
   	for(var i=0;i<=dtValue.trim().length-1;i++){
   		ch = dtValue.trim().charAt(i) ;
   		if(ch == "-" || ch == "/" || ch == "."){
   			continue;
   		} else {
   			if(isNumber(ch) == false) return false;
   			s = s + ch;
   		}	
   	}
   	
   	if(s.length != 8) {
        return false;
    }
    
   	var year = s.substring(0,4);
   	var month = s.substring(4,6);
   	var day = s.substring(6);
	if(isValidDate(day,month,year) == false) return false;
	
    return true;
}

/**
 *验证日期有效性
 *
 */
function isValidDate(day, month, year) {
   if (month < 1 || month > 12)
      return false;

   if (day < 1 || day > 31)
      return false;

   if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
      return false;

   if (month == 2) {
      var leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
      if (day>29 || (day == 29 && !leap))
         return false;
   }

   return true;
}

/**
 * 功能：检查页面必输项
 * 用法：this.aa = new Array("txtName", "出错提示信息【例如：txtName不能为空！】"[, "0.00"]);
 * 说明：数组的第一项为'需要检验的控键的名称'、数组的第二项为'出错的提示信息'、数组的第三项可选，为'该控键的初始值'，若填了该项，则初始值也作为空处理
 */
function validateRequired(form) {
	if (!form) {
		form = document.forms[0];
	}
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRequired = new required();
    for (x in oRequired) {
        var obj,obj1;

        eval("obj = form['"+oRequired[x][0]+"']");

        if ((obj.type == 'text' ||
            obj.type == 'textarea' ||
            obj.type == 'select-one' ||
            obj.type == 'radio' ||
            obj.type == 'password') &&
            ((obj.value.trim() == '' && oRequired[x][2] == undefined) ||
            (oRequired[x][2] != undefined && obj.value == oRequired[x][2] || obj.value.trim() == ''))) {

            //myMistakeColor(obj);
            if (i == 0) {
                focusField = obj;
            }
            fields[i++] = oRequired[x][1];
            bValid = false;
        }  else {
            //myRigthColor(obj);
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

//检查页面是否整形
function validateInteger(form) {
	var bValid = true;
	var focusField = null;
	var i = 0;
	var fields = new Array();
	oInteger = new IntegerValidations();

	for (x in oInteger) {
		if ((form[oInteger[x][0]].type == 'text' || 
		form[oInteger[x][0]].type == 'textarea' || 
		form[oInteger[x][0]].type == 'select-one' || 
		form[oInteger[x][0]].type == 'password' || 
		form[oInteger[x][0]].type == 'radio') && form[oInteger[x][0]].value.length > 0) {
		   var _value = form[oInteger[x][0]].value;

		   //var iValue = parseInt(_value);

		   //if (checkInteger(_value) == false || !iValue || !(iValue >= -2147483648 && iValue <= 2147483647)) {
		   if (checkInteger(_value) == false) {
			  if (i == 0)
				 focusField = form[oInteger[x][0]];

			  fields[i++] = oInteger[x][1];

			  bValid = false;
		   }
		}
	}

	if (fields.length > 0) {
	   alert(fields.join('\n'));
	   setFocus(focusField);
	}

	return bValid;
}

/**
 * 校验多个控件的值的数据类型 
 * 属性：_dataType(String):date 日期格式、int 整型、posInt 正整型 
 * 返回值：boolean， true：校验通过；false：校验失败； 
 *           
 * e.g. :  <input type="text" name="as[0].bs[0].test" style="ShadeD-Validator:score,dataType;">
 *         function beforeSubmit() {Validator.checkDataType(); form.submit();}
 *         Validator.dataType = function() {
 *             this.aa = new Array("birthday", "<bean:message key="E0004"/>", "date");
 *             this.ab = new Array("age", "<bean:message key="E0005"/>", "posInt");
 *			   this.ac = new Array("money", "<bean:message key="E0005"/>", "posFloat",3,2);
 *					正浮点校验,表示有效数字3，小数位2
 *			   this.ac = new Array("money", "<bean:message key="E0005"/>", "float",3,2);
 *					浮点校验,表示有效数字3，小数位2
 *			   this.score = new Array(null, "<bean:message key="E0006"/>", "int");
 *					整形验证
 *			   this.score = new Array(null, "<bean:message key="E0006"/>", "time");
 *					时间验证
 *		   };
 */
validateDataType = function(form) {

    var _bValid = true;
    var _focusField = null;
    var _imsg = 0;
    var _msgs = new Array();
    var _oDataType = new dataType();
    
    var _obj;
    for (x in _oDataType) {
    	_obj = form[_oDataType[x][0]];

        //检查是否日期型 
        if (_oDataType[x][2].toLowerCase() == 'date') {
            if(!verifyDate(_obj.value)) {
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            }
            
        	//检查整型 
        } else if (_oDataType[x][2].toLowerCase() == 'int') {
            if(!verifyInteger(_obj.value)) {
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            }
            
            //检查正整型 
        } else if (_oDataType[x][2].toLowerCase() == 'posint') {
            if(!verifyPosInteger(_obj.value)) {
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            }
            
            //检查正浮点型 
        } else if (_oDataType[x][2].toLowerCase() == 'posfloat') {
            if(_obj.value != '' && !verifyPosFloat(_obj.value, _oDataType[x][3], _oDataType[x][4])){
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            }
            
            //检查浮点型 
        } else if (_oDataType[x][2].toLowerCase() == 'float') {
            if(_obj.value != '' && !verifyFloat(_obj.value, _oDataType[x][3], _oDataType[x][4])){
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            }
            
            //时间验证
        } else if (_oDataType[x][2].toLowerCase() == 'time') {
            if(_obj.value != '' && !this.verifyTime(_obj)){
                this.highlight(_obj);
                if (_imsg == 0) {
              		_focusField = _obj;
          		}
                _msgs[_imsg++] = _oDataType[x][1];
                _bValid = false;
            } else {
                this.highlight(_obj, false);
            }
        } 
        
        //...
    }

    if (_msgs.length > 0) {
    	alert(_msgs.join('\n'));
        setFocus(_focusField);
    }
    return _bValid;

}
            
function checkIdNumbyBirthday(_id, _date) {
	if ("string" == typeof(_id)) {
        _id = document.getElementById(_id);
    }

    //如果没填或不是身份证号则不做该校验
    if (checkIdcard(_id.value) != "true") {
    	return true;
    }

    if ("string" == typeof(_date)) {
        _date = document.getElementById(_date);
    }

	if (_id.value && _date.value) {
		var _idBirthday = null;
		if (_id.value.length == 18) {
			_idBirthday = _id.value.substring(6,14);
		} else {
			_idBirthday = _id.value.substring(6,12);
			_idBirthday = "19" + _idBirthday;
		}
		
		if (_idBirthday == _date.value) {
			nextFocus(_date);
			return true;
		} else {
			alert("顾客生日与身份证不一致，请重新输入！");
			setFocus(_date);
		}
	} else {
		nextFocus(_date);
	} 
	return false;
}

/**
 * 判断中英文长度是否超过最大长度限制
 */
var CHAR_BYTES = 2; // 数据库 中文字符所占字节数
function checkByteLength(_obj, _maxLength, _autoCut,tipNameVal) {
	if ("string" == typeof(_obj)) {
		_obj = document.getElementById(_obj);
	}

    var _charLength = 0;
    var _charUnicode = 0;
    var _objValue = _obj.value;

    for (var i = 0; i < _objValue.length; i++) {
        _charUnicode = _objValue.charCodeAt(i);
        if (_charUnicode > 255) {
            _charLength += CHAR_BYTES;
        } else {
            _charLength++;
        }
    }
    if (_charLength > _maxLength) {
        alert(tipNameVal+"的长度不能多于"+_maxLength/CHAR_BYTES+"个汉字或者"+_maxLength+"个字符。");
        if (_autoCut) {
        	_obj.value = _objValue.substring(0, i);
        }
        setFocus(_obj);
        return false;
    }
    return true;
}

//****++++验证身份证号码+++**********
function checkIdcard(idcard){
	var Errors=new Array(
					"true",
					"身份证号码不是18位或15位!",
					"身份证号码出生日期超出范围或含有非法字符!",
					"身份证号码校验位错误!",
					"身份证地区非法!"
					);
	
	if (!idcard || (idcard.length !=18 && idcard.length !=15)) {
		return Errors[1];
	}

	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
	
	var idcard,Y,JYM;
	var S,M;
	var idcard_array = new Array();
	idcard_array = idcard.split("");
	//地区检验
	if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
	//身份号码位数及格式检验
	switch(idcard.length){
		case 15:
			if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
			} else {
			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
			}
			if(ereg.test(idcard)) return Errors[0];
			else return Errors[2];
			break;
		case 18:
		//18位身份号码检测
		//出生日期的合法性检查 
		//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
		//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
		if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
			ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
		} else {
			ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
		}
		if(ereg.test(idcard)){//测试出生日期的合法性
			//计算校验位
			S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
			+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
			+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
			+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
			+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
			+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
			+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
			+ parseInt(idcard_array[7]) * 1 
			+ parseInt(idcard_array[8]) * 6
			+ parseInt(idcard_array[9]) * 3 ;
			Y = S % 11;
			M = "F";
			JYM = "10X98765432";
			M = JYM.substr(Y,1);//判断校验位
			if(M == idcard_array[17].toUpperCase()) return Errors[0]; //检测ID的校验位
			else return Errors[3];
		} else return Errors[2];
		break;
		default:
		return Errors[1];
		break;
	}
}

/**
 * 功能：检查两个日期相差天数是否在指定的天数内
 * 用法：checkTwoDateRange("20070401","20070408",7)
 * 说明：在指定天数内返回true，不在返回false
 * 作者：鲍利兵
 * 日期：20070412
 */
function checkTwoDateRange(startDate, endDate, days){
	var isInRange = false;
	//得到实际天数
	var factDays = getTwoDateDays(startDate, endDate);
	if(factDays <= days){
		isInRange = true;
	}
	return isInRange;
}

//验证email
function validateEmail(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oEmail = new email();

    for (x in oEmail) {
        if ((form[oEmail[x][0]].type == 'text' || form[oEmail[x][0]].type == 'textarea') && form[oEmail[x][0]].value.length > 0) {
           if (!checkEmail(form[oEmail[x][0]].value)) {
              if (i == 0)
                 focusField = form[oEmail[x][0]];

              fields[i++] = oEmail[x][1];

              bValid = false;
           }
        }
    }

    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }

    return bValid;
}

/**
 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
 * http://javascript.internet.com
*/
function checkEmail(emailStr) {
   if (emailStr.length == 0)
      return true;
   var emailPat=/^(.+)@(.+)$/;
   var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
   var validChars="\[^\\s" + specialChars + "\]";
   var quotedUser="(\"[^\"]*\")";
   var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
   var atom=validChars + '+';
   var word="(" + atom + "|" + quotedUser + ")";
   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
   var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
   var matchArray=emailStr.match(emailPat);

   if (matchArray == null)
      return false;

   var user=matchArray[1];
   var domain=matchArray[2];

   if (user.match(userPat) == null)
       return false;

   var IPArray = domain.match(ipDomainPat);
   if (IPArray != null) {
       for (var i = 1; i <= 4; i++) {
          if (IPArray[i] > 255)
             return false;
       }

       return true;
   }

   var domainArray=domain.match(domainPat);
   if (domainArray == null)
       return false;

   var atomPat=new RegExp(atom,"g");
   var domArr=domain.match(atomPat);
   var len=domArr.length;

   if (domArr[domArr.length-1].length < 2 || domArr[domArr.length-1].length > 3)
      return false;

   if (len < 2)
      return false;

   for (i=0;i<emailStr.length;i++){
		if (emailStr.charCodeAt(i)>255){	
			return false;
		}
   }
   return true;
}

//验证最小长度
function validateMinLength(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMinLength = new minlength();

    for (x in oMinLength) {
        if (form[oMinLength[x][0]].type == 'text' || form[oMinLength[x][0]].type == 'textarea' || form[oMinLength[x][0]].type == 'password') {
           var iMin = parseInt(oMinLength[x][2]("minlength"));
           if (!(form[oMinLength[x][0]].value.length >= iMin)) {
              if (i == 0)
                 focusField = form[oMinLength[x][0]];

              fields[i++] = oMinLength[x][1];

              bValid = false;
           }
        }
    }

    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }

    return bValid;
}

//验证最大长度
function validateMaxLength(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMaxLength = new maxlength();

    for (x in oMaxLength) {
        if (form[oMaxLength[x][0]].type == 'text' || form[oMaxLength[x][0]].type == 'textarea') {
           var iMax = parseInt(oMaxLength[x][2]("maxlength"));

           if (!(form[oMaxLength[x][0]].value.length <= iMax)) {
              if (i == 0)
                 focusField = form[oMaxLength[x][0]];

              fields[i++] = oMaxLength[x][1];

              bValid = false;
           }
        }
    }

    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }

    return bValid;
}

/**
 * 功能：检查是否为正整型(包括0)
 * 用法：verifyPosInteger(form.txtName.value)
 * 说明：
 */
function verifyPosInteger(inputVal)
{
    var inputStr = inputVal.toString();

    if (inputStr == '0') {
       // return false;
    }

    for (var i = 0; i < inputStr.length; i ++ )
    {
        var oneChar = inputStr.charAt(i);
        if (i == 0 && oneChar == "+")
        {
            if (inputStr.length == 1 )
            {
                return false;
            }else{
                continue;
            }
        }

        if(oneChar == ",")
        {
            continue;
        }

        if (oneChar < "0" || oneChar > "9")
            return false;
    }
    return true;
}