//预定义的检查模式
var regArray = new Array(
	new Array("int+0","^\\d+$","","需要输入一个非负整数，请重新检查"),	//非负整数（正整数 + 0）
	new Array("int+","^[0-9]*[1-9][0-9]*$","^\\d+$","需要输入一个正整数，请重新检查"),		//正整数
	new Array("int-0","^((-\\d+)|(0+))$","^(-|(-\\d+)|(0+))$","需要输入一个非正整数，请重新检查"),	//非正整数（负整数 + 0）
	new Array("int-","^-[0-9]*[1-9][0-9]*$","^(-|(-\\d+)|(0+))$","需要输入一个负整数，请重新检查"),	//负整数
	new Array("int","^-?\\d+$","^-|(-?\\d+)$","需要输入一个整数，请重新检查"),			//整数
	new Array("double+0","^\\d+(\\.\\d+)?$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个非负浮点数，请重新检查"),	//非负浮点数（正浮点数 + 0）
	new Array("double+","^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个正浮点数，请重新检查"),		//正浮点数
	new Array("double-0","^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","^(-|(-\\d+\\.)|(0+\\.)|(-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","需要输入一个非正浮点数，请重新检查"),	//非正浮点数（负浮点数 + 0）
	new Array("double-","^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$","^(-|(-\\d+\\.?)|(-\\d+\\.\\d+))$","需要输入一个负浮点数，请重新检查"),		//负浮点数
	new Array("double","^(-?\\d+)(\\.\\d+)?$","^(-|((-?\\d+)(\\.\\d+)?)|(-?\\d+)\\.)$","需要输入一个浮点数，请重新检查"),		//浮点数
	new Array("char","^[A-Za-z]+$","","您只能输入英文字母，请重新检查"),		//由26个英文字母组成的字符串
	new Array("upperchar","^[A-Z]+$","","您只能输入英文大写字母，请重新检查"),	//由26个英文字母的大写组成的字符串
	new Array("lowerchar","^[a-z]+$","","您只能输入英文小写字母，请重新检查"),	//由26个英文字母的小写组成的字符串
	new Array("digitchar","^[A-Za-z0-9]+$","","您只能输入数字和英文字母，请重新检查"),	//由数字和26个英文字母组成的字符串
	new Array("digitchar_","^\\w+$","","您只能输入数字、英文字母和下划线，请重新检查"),	//由数字、26个英文字母或者下划线组成的字符串
	new Array("email","^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$","^(([\\w-]+(\\.[\\w-]+)*@?)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+)|([\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+))$","需要输入正确的email地址，请重新检查"),		//email地址
	new Array("url","^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$","^([a-zA-z]+:?)|([a-zA-z]+:/{1,2})|([a-zA-z]+://(\\w+(-\\w+)*))|([a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?)$","需要输入正确的url地址，请重新检查")	,		//url
	new Array("filter","^[^,:\"&']*$","","不能包含特殊字符"),//过滤掉特殊字符 " & '
	new Array("filter2","^[^,:\"&'\$\\\\]*$","","不能包含特殊字符"),//过滤掉特殊字符 " & '\
	new Array("phone","^([0-9]|[ \f\n\r\t\v]){5,45}$","","必须输入正确的电话号码"),//由数字和空格组成的字符串
	new Array("mobile","^\\d+$","^\\d*$","移动电话号码只能由数字组成"),	//非负整数（正整数 + 0）
    new Array("EnName","^([a-z]|[A-Z]|[\f\n\r\t\v]|[0-9]|[ \f\n\r\t\v])*$","","请输入字符与数字"),//由英文字母和数字以及空格组成的字符串
    new Array("ZhName","^[\u4E00-\u9fA5]*$","","请输入中文"),//由中文组成的字符串
    new Array("Name","^(([\u4E00-\u9fA5]{2,9}(\\s[A-Za-z]+){0,1})|([A-Za-z]{2,55}([A-Za-z])*/[A-Za-z]{2,55}(\\s[A-Za-z]+){0,1})|([\u4E00-\u9fA5]{1,5}[A-Za-z]{2,20})(\\s[A-Za-z]+){0,1})$","","姓名的格式错误，请重新输入"),     //姓名格式改为后面字符间可加空格
    new Array("BabyName","^(([\u4E00-\u9fA5]{2,9})|([A-Za-z]{2,55}([A-Za-z])*/[A-Za-z]{2,55}))$","","婴儿姓名格式错误，请重新输入"), 
    new Array("Card","^((\\d[a-zA-Z0-9]{2,})|([a-zA-Z]\\d[a-zA-Z0-9]+)|([a-zA-Z]{2,}\\d[a-zA-Z0-9]*))$","","卡号不合法，请重新输入"),
	new Array("Tel", "^[\\d\\(\\)-/]*$","^[\\d\\(\\)-/]*$" ,"您输入的电话号码格式错误"), 
	new Array("mzcard","^(\\d{8,8}|\\d{12,12})$","^\\d*$","明珠卡号格式错误,应为8位或12位数字"),
	new Array("largecard","^(\\d{7,7})$","^\\d*$","大客户号格式错误,应为7位数字"),
	new Array("childcard","^\\w{3,18}$", "^\\w*$", "儿童证件格式错误, 格式应为 3至18个字符"),
	new Array("groupname","^[a-zA-Z]{2,46}/{0,1}[a-zA-Z]{1,44}$","^[a-zA-Z]*$","团队名只能是英文字母,可用'/'隔开,且'/'前最少2个字符(总共2至47个字符)"),
	new Array("contactname","^([A-Za-z]{2,55})(/?[A-Za-z]{2,55})$","^[a-zA-Z/]*$","联系人姓名只能为英文、且必须按指定格式输入，请检查"),
	new Array("IName","^[a-zA-Z]{2,24}/([a-zA-Z][ ]?){1,23}[a-zA-Z]$","^[a-zA-Z/ ]*$","国际票姓名只能为英文 ming（两个字符以上）/xing（两个字符以上，可用空格分隔，\n但不允许连续空格,空格不能紧跟/,且不允许空格结尾）"),
	new Array("money","^\\d+\\.?\\d{0,2}$","","您输入的金额格式不正确，请重新输入"),
	new Array("_money","(^-?\\d+\\.?\\d{0,2}$)|(^0$)","","此处的金额应为0或负数"),
	new Array("accounts","^([a-zA-Z]|_|[0-9])*$","","登录帐号格式不正确，请重新输入"),
	new Array("money2","^\\d{0,8}(\\.\\d{0,2})?$","","您输入的金额格式不正确(要求小数点后小于等于2位，小数点前小于等于8位)\n\t\t请重新输入!"),
	new Array("farebasic","^[A-Za-z0-9]+(/[A-Za-z0-9]+)?$","","票价级别的格式不对\n(票价级别不能出现除英文字母、数字和'/'以外的其它字符,且不能有两个以上的'/')"),
	new Array("money3","^\\d{0,10}(\\.\\d{0,6})?$","","您输入的金额格式不正确(要求小数点后小于等于6位，小数点前小于等于10位)\n\t\t请重新输入!"),
	new Array("money4","^\\d{0,6}(\\.\\d{0,4})?$","","您输入的金额格式不正确(要求小数点后小于等于4位，小数点前小于等于6位)\n\t\t请重新输入!"),
	new Array("Tel2","^(\\d+)$|^(\\(\\d+\\)((\\d+-)*\\d+))$|^((\\d+-)+\\d+)$","^[\\d+\\(\\)-]*$","您输入的电话号码格式错误,支持的格式:\n{11111111111,(020)11111111,020-11111111,020-11111111-2222,(020)1111111-2222}"),
	new Array("flightno","^[a-zA-Z]{2,2}[0-9]{3,5}$","^[a-zA-Z]{2,2}[0-9]{3,5}$","航班号格式为前2位为字母,后面接着3-5位数字\n例如:CZ3101"),
	new Array("postalcode","^\\d{6,6}$","^\\d*$","邮政编码格式错误,格式应为 6 个数字"),
	new Array("orderno","(^[B-C]{1,1}[0-9]{11,11}$)|(^[B-C]{1,1}[0-9]{11,11}\\/\\w{5}$)","","订单编号格式为第一位为大写字母B或C,后面接着11位数字\n例如:C05121200001"),
	new Array("ticketno","^\\d{10,10}$","^\\d*$","电子客票号格式错误,格式应为 10 个数字"),
	new Array("d-d","^\\d{3}\\-\\d{7}$","^[\\d\\-]*$","单号格式为 数字(3位)-数字(7位)"),
	new Array("farebasic_q","^[0-9]{2}$","","票价级别的格式不对,只能输入两位数字!"),
	new Array("bankaccount","^[0-9]{9,20}$","","银行帐号的格式不对,只能输入9-20位数字!"),
	new Array("creditCardNo","^[A-Za-z0-9]{16,19}$","","信用卡号的格式不正确!"),
	new Array("payBillNo","^[A-Za-z0-9]{1,30}$","","流水号的格式不正确!"),
	new Array("IDcardNo","^[0-9]{14}(\\d{1}|\\d{4}|(\\d{3}[A-Za-z]))$","","身份证号的格式不正确!"),
	new Array("ExpiryDate","(^\\d{2}0[1-9]$)|(^\\d{2}1[0-2]$)","","卡片有效期格式不正确,正确的格式为YYMM"),
	new Array("NoZh","^[^\u4E00-\u9fA5]*$","","请输入非中文"),
	new Array("upperchar2","^[A-Z]{2}$","","您只能输入2位英文大写字母，请重新检查"),//由26个英文字母的大写组成的字符串
    new Array("FName","^[A-Za-z]{2,20}$","","您只能输入2-20位英文字母，请重新检查"),//由26个英文字母组成的字符串
    new Array("LName","^[A-Za-z]{0,30}$","","您只能输入30位英文字母，请重新检查"),//由26个英文字母组成的字符串
    new Array("intlMailNo","^[0-9]{0,17}$","","您只能输入17位的数字，请重新检查"),
    new Array("city","^([a-z]|[A-Z]|[\f\n\r\t\v]|[ \f\n\r\t\v])*$","","请输入英文字符，请重新检查"),//由英文字母和空格组成的字符串
    new Array("intlCard","^[A-Za-z0-9]{5,15}$","","您只能输入5-15位数字和英文字母，请重新检查"),
    new Array("int1","^[1-9]$","","需要输入一个一位正整数，请重新检查"),		//正整数
    new Array("int2","^(([1-4][0-9])|50|[1-9])$","","需要输入一个不大于50的正整数，请重新检查"),		//正整数
	new Array("cabins","^[A-Z]{1,1}[A-Z\/]*$","","需要输入正确的舱位，请重新检查")	,
	new Array("mobilephone","^1[3,5,8]{1}[0-9]{1}[0-9]{8}$","","需要输入正确的移动电话，请重新检查")	,
	new Array("passwd","^[\\S]*$","","需要输入正确的密码，请重新检查"),   //密码不包含空白字符，包括空格、制表符、换页符等等
	new Array("rate","(^[1]$)|(^[0]$)|(^[0]\\.(\\d){0,5}$)","","您输入的费率不正确，请重新输入")   	
);
   
function attachValidateEvent(tagName) { 
	var aryInputs = document.getElementsByTagName(tagName);
	if(aryInputs == null )
		return;
		
	if(aryInputs.length == null) {
		attachValidateEventToControl(aryInputs);
		return;
	}
	
	for(var i = 0; i < aryInputs.length; i++ ) {
		attachValidateEventToControl(aryInputs[i]);
	}
}

function attachValidateEventToControl( input ) {
	if( input.onkeypress == null ) {
		//input.attachEvent("onkeypress", doEvent);
		input.onkeypress = doEvent;
	}
	if( input.onpaste == null ) {
		//input.attachEvent("onpaste", doEvent);
		input.onpaste = doEvent;
	}	
	if( input.onblur == null ) {
		//input.attachEvent("onblur", doEvent);
		input.onblur = doEvent;
	}
	//让输入法失效，直接输入英文字母
	if( typeof(input.upper) != "undefined") {
		input.style.imeMode ="disabled";
		input.onblur = trim;
	}
}


//受控元素默认的事件处理程序
function doEvent() {
	//得到触发事件的类型
	var type = window.event.type;
	//得到触发元素的值。
	var value = window.event.srcElement.value;
	if (type == "keypress") {	//如果是键盘按下事件，得到键盘按下后的值
		var keyCode = window.event.keyCode;
		if (typeof(window.event.srcElement.upper) != "undefined") {	//如果定义了转换大写
			if (keyCode >= 97 && keyCode <= 122)
				keyCode = window.event.keyCode = keyCode - 32;
		}
		else if (typeof(window.event.srcElement.lower) != "undefined") {	//如果定义了转换小写
			if (keyCode >= 65 && keyCode <= 90)
				keyCode = window.event.keyCode = keyCode + 32;
		}
		value += String.fromCharCode(keyCode);
	}
	else if (type == "paste") {
		if(typeof(window.event.srcElement.upper) != "undefined")
		{
			var tempStr = window.clipboardData.getData("Text").toUpperCase();
			window.clipboardData.setData("Text",tempStr);
		}
		
		if(typeof(window.event.srcElement.lower) != "undefined")
		{
			var tempStr = window.clipboardData.getData("Text").toLowerCase();
			window.clipboardData.setData("Text",tempStr);
		}
	}
	//如果触发元素的值为空，则表示用户没有输入，不接受检查。
	if (value == "") return;
	//如果触发元素没有设置reg属性，则返回不进行任何检查。
	if (typeof(window.event.srcElement.reg) == "undefined") return;
	//如果触发元素没有定义check属性，则在按键和粘贴事件中不做检查
	if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.check) == "undefined") return;
	//如果没有通过检查模式，出现的错误信息
	var msg = "";
	//得到检查模式
	var reg = window.event.srcElement.reg;
	//正则表达式对象
	var regExp = null;
	//从预定义的检查模式中查找正则表达式对象
	for (var i=0;i<regArray.length;i++) {
		if (regArray[i][0] == reg) {
			if ((type == "keypress" || type == "paste") && regArray[i][2] != "")
				regExp = new RegExp(regArray[i][2]);	//查找到预定义的检查模式
			else
				regExp = new RegExp(regArray[i][1]);	//查找到预定义的检查模式
			msg = regArray[i][3];					//定义预定义的报错信息
			break;	//查找成功，退出循环
		}
	}
	if (regExp == null) {	//如果没有查找到预定义的检查模式，说明reg本身就为正则表达式对象。
		if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.regcheck) != "undefined")
			regExp = new RegExp(window.event.srcElement.regcheck);	//按照用户自定义的正则表达式生成正则表达式对象。
		else
			regExp = new RegExp(reg);	//按照用户自定义的正则表达式生成正则表达式对象。
		msg = "输入错误，请重新检查";		//错误信息
	}
	//检查触发元素的值符合检查模式，直接返回。
	if (regExp.test(value))
	{
		//处理最大值和最小值的范围
		if(typeof(window.event.srcElement.min) != "undefined" && typeof(window.event.srcElement.max) != "undefined" && window.event.srcElement.min>window.event.srcElement.max)
			return;
		if(typeof(window.event.srcElement.min) != "undefined")
		{
			if(window.event.srcElement.value*1 < window.event.srcElement.min*1)
				window.event.srcElement.value = window.event.srcElement.min;
		}
		if(typeof(window.event.srcElement.max) != "undefined")
		{
			if(window.event.srcElement.value*1 > window.event.srcElement.max*1)
				window.event.srcElement.value = window.event.srcElement.max;
		}
		return;
	}
	if (type == "blur") {	//如果是失去焦点并且检查不通过，则需要出现错误警告框。
		//判断用户是否自己定义了错误信息
		if (typeof(window.event.srcElement.msg) != "undefined")
			msg = window.event.srcElement.msg;
		//显示错误信息
		alert(msg);
		//将焦点重新聚回触发元素
		window.event.srcElement.focus();
		window.event.srcElement.select();
	}
	else {	//如果是键盘按下或者粘贴事件并且检查不通过，则取消默认动作。
		//取消此次键盘按下或者粘贴操作
		window.event.returnValue = false;
	}
}

function attachBodyReadyState() {
	if (document.readyState=="complete") {	
		attachAllControls();
	}
}

function attachAllControls() {
	attachValidateEvent("INPUT");
	attachValidateEvent("SELECT");
	attachValidateEvent("Textarea");
}

document.attachEvent("onreadystatechange", attachBodyReadyState);

function trim(){
	window.event.srcElement.value = window.event.srcElement.value.toString().replace(/\s/g,"");
}
//下面是大客户号的校验函数，由于涉及到计算没有写成正则表达式
function checkLargeClientNO(object)
{
	var str,v1,v2,i;
	str=object.value;
	if(str.length!=0){
		
		if(isNaN(str) || str.length !=7){
			alert("请你必须输入七位数字。");object.focus();return ;
		}
	 	
//		v2=str.substr(0,6);
	 	v1=str.substr(6,1)*1;
		if(v1>=7) 	{alert("大客户号输入错误，请正确输入。");object.focus();return ;}
		for(i=0,v2=0;i<str.length-1;i++)
		{
			v2+=str.substr(i,1)*1;
		}
	 	if (v2 % 7 !=v1)
		{
			alert("大客户号输入错误，请正确输入。");object.focus();return ;
		}
	}
}

//校验“是否支付代理费”选项
function checkAgentFee(object){
	var str;
	str = object.value;
	if(str==""||str==null)alert("是否支付代理费 不能为空");
}



//下面校验明珠卡号
function checkFpcardNo(obj){
	var cardno;
	cardno = obj.value + "";
	if(cardno.length==12){
		var arr = cardno.split("");
		var n = 0;
		for(var j=1; j<arr.length; j++) n+= arr[j] * 1;
		if( n%7 != arr[0] * 1) {
			alert("明珠卡号错误。");
			obj.select();
			return false;
		}
	}else if(cardno.length==8){
	}else if(cardno.length > 0){
		alert("明珠卡号格式错误,应为8位或12位数字。");
		obj.select();
		return false;
	}else{
		return true;
	}
	return true;
}
