////////////////////////////////////////////////////////////////////////////////
//	name: formValidate.js
//	version: 1.0
//	author:黄宝颖
//	description: Check form inputs at client side before submit a form to server side.
//	note: 使用时需要在被判断的Input对象中加入属性值。
//			must="true"									说明该Input对象必填。
//			isNumeric="true"							说明该Input对象必须填写数字类型的值（不要求必填）。
//			isDate="true"								说明该Input对象必须填写日期类型（YYYY-MM-DD）的值（不要求必填）。默认2002-02-01,2002-2-1均可
//			isIntegral="true"							说明该Input对象必须填写日期类型（YYYY-MM-DD）的值必须是完整的，如2002-02-01,而2002-2-1就不允许
//			maxlength="22"								最大长度
//			minlength="6"								最小长度
//		此处还提供了另外几个函数：
//			isDate(objTgt)							判断传入对象objTgt中填写的值（objTgt.value）是否为日期类型。
//			judgeLeapYear(yearStr)					是否为闰年。
//			judgeSmallMonth(monthStr)				是否为小月。
//			isInt(objNumber)						是否为整数。
//			isEmail(email)							判断是否email地址有效
//			isModified(eForm)						页面是否有过修改。
////////////////////////////////////////////////////////////////////////////////


// 表单提交之前，在页面上判断输入的合法性（必填must、数字isNumeric、日期isDate等等）。
function formValidate(formName){
	var isLeapYear=false; /*闰年[二月为29天]*/
	var isSmallMonth=false; /*小月[该月为30天]*/

	if (!document.forms(formName)) return false;

	for (i=0;i<document.forms(formName).length;i++)	{
		objTgt = document.forms(formName).item(i);
		//alert(objTgt.type);
		// 对于所有 Text 输入框中的值进行去空操作。
		//if(objTgt.type=="text")objTgt.value=objTgt.value.trim();

		if (objTgt.must=='true'&&objTgt.value==''){
			if (objTgt.disabled==true){
				return true;
			}else{
				if(objTgt.title!=""){
					errAlert ("必填项 ["+objTgt.title+"] 未填写 !","为了保证数据的完整性，系统要求某些值必须填写，\n现在您没有填写其中的 ["+objTgt.title+"] 这一项。","重新填写 ["+objTgt.title+"] 这一项。");
				}else{
					errAlert("必填项未填写 !","为了保证数据的完整性，系统要求某些值必须填写，\n现在您没有填写其中的某几项。","返回重新填写。");
				}
				if(objTgt.type!="select-one"){
					focusItem(objTgt);
				}
				return false;
			}
		}
		//判断最大长度
		if(objTgt.value==null){continue;}
		var formValidate_valueLength=objTgt.value.length;
		var formValidate_maxlength=objTgt.maxlength;
		if(formValidate_maxlength!=""){
			if(parseFloat(formValidate_maxlength)<parseFloat(formValidate_valueLength)){
					if(objTgt.title!=""){
						errAlert ("["+objTgt.title+"] 项中长度超过最大值:"+formValidate_maxlength+"!","为了保证数据的准确性，系统要求某些长度不超过最大值，\n现在您在 ["+objTgt.title+"] 项中长度超过最大值。","重新填写 ["+objTgt.title+"] 这一项。");
					}else{
						errAlert ("应该长度不超过最大值:"+formValidate_maxlength+"!","为了保证数据的准确性，系统要求某些长度不超过最大值，\n现在您在某几项中长度超过最大值。","重新填写。");
					}

					focusItem(objTgt);
					return false;
			}
		}
		var formValidate_minlength=objTgt.minlength;
		if(formValidate_minlength!=""){
			if(parseFloat(formValidate_minlength)>parseFloat(formValidate_valueLength)){
					if(objTgt.title!=""){
						errAlert ("["+objTgt.title+"] 项中长度不够最小值:"+formValidate_minlength+"!","为了保证数据的准确性，系统要求某些长度超过最小值，\n现在您在 ["+objTgt.title+"] 项中长度未超过最小值。","重新填写 ["+objTgt.title+"] 这一项。");
					}else{
						errAlert ("应该长度超过最小值:"+formValidate_minlength+"!","为了保证数据的准确性，系统要求某些长度超过最小值，\n现在您在某几项中长度不超过最小值。","重新填写。");
					}

					focusItem(objTgt);
					return false;
			}
		}

		if(objTgt.value!=''){
			//开始各种判断
			//判断是数字和数字在一定的范围
			if (objTgt.isNumeric=='true'){
				if (isNaN(objTgt.value)){
					if(objTgt.title!=""){
						errAlert ("["+objTgt.title+"] 项中应该填写数字 !","为了保证数据的准确性，系统要求某些值必须填写数字，\n现在您在 ["+objTgt.title+"] 项中没有填写数字。","重新填写 ["+objTgt.title+"] 这一项。");
					}else{
						errAlert ("应该填写数字 !","为了保证数据的准确性，系统要求某些值必须填写数字，\n现在您在某几项中没有填写数字。","重新填写。");
					}

					focusItem(objTgt);
					return false;
				}

				var objTgtValue=new Number(objTgt.value);
				var maxV=objTgt.maxValue;
				var minV=objTgt.minValue;

				if(objTgt.isPow==1){
					if (Math.abs(objTgtValue)>=Math.pow(10,maxV)||Math.abs(objTgtValue)<Math.pow(10,(minV-1))){
						errAlert ("所填数字超出规定范围!\n数字范围从\""+minV+"\"到\""+maxV+"\"");

						focusItem(objTgt);
						return false;
					}
				}else{
					if(objTgtValue.valueOf()>maxV||objTgtValue.valueOf()<minV){
						errAlert ("所填数字超出规定范围!\n数字范围从\""+minV+"\"到\""+maxV+"\"");

						focusItem(objTgt);
						return false;
					}
				}
			}
			//合法邮件地址检测
			if (objTgt.isEmail=="true"){
				if(isEmail(objTgt.value)==false){
					if(objTgt.title!=""){
						errAlert ("["+objTgt.title+"] 项中应该填写有效的电子邮件地址 !","为了保证数据的准确性，系统要求某些值必须填写电子邮件地址，\n现在您在 ["+objTgt.title+"] 项中没有填写电子邮件地址。","重新填写 ["+objTgt.title+"] 这一项。");
					}else{
						errAlert ("应该填写有效的电子邮件地址 !","为了保证数据的准确性，系统要求某些值必须填写有效的电子邮件地址，\n现在您在某几项中没有填写有效的电子邮件地址。","重新填写。");
					}
						focusItem(objTgt);
						return false;
				}
			}
			//整数类型
			if (objTgt.isInt=="true"){
				if(isInt(objTgt.value)==false){
					if(objTgt.title!=""){
						errAlert ("["+objTgt.title+"] 项中应该填写整数!","为了保证数据的准确性，系统要求某些值必须填写整数，\n现在您在 ["+objTgt.title+"] 项中没有填写整数。","重新填写 ["+objTgt.title+"] 这一项。");
					}else{
						errAlert ("应该填写整数 !","为了保证数据的准确性，系统要求某些值必须填写整数，\n现在您在某几项中没有填写整数。","重新填写。");
					}
					focusItem(objTgt);
					return false;
				}
			}
			//日期类型
			if (objTgt.isDate=="true"){
				if(isDate(objTgt)==false){
					focusItem(objTgt);
					return false;
				}
			}
                      if (objTgt.isStartDate=="true"){
                      var objTgtValue=new String(objTgt.value);
				if(isStartDate(objTgtValue)==false){
                                focusItem(objTgt);
					return false;
				}
			}
		}

	}
	return true;
}

// 判断是否是日期。
function isDate(objTgt){
	var inDate=objTgt.value;
	var isIntegral=objTgt.isIntegral;
	//alert(isIntegral);

	if (inDate.length>=6 && inDate.length<=10 && inDate.indexOf("-")!=-1 && inDate.indexOf("-")!=inDate.lastIndexOf("-") && inDate.substring(inDate.indexOf("-")+1,inDate.lastIndexOf("-")).indexOf("-")==-1){
		var inYear=parseInt(inDate.substring(0,inDate.indexOf("-")));
		var inMonth=inDate.substring(inDate.indexOf("-")+1,inDate.lastIndexOf("-"));
			if(isIntegral=="true"){
				if(inMonth.length!=2){
					errAlert("月份填写有误 !表示月份的数字必须是完整的，如1月用01表示.","表示月份的数字必须是完整的，如一月用01表示，可是您在 ["+objTgt.title+"] 项中填写的 "+inMonth+" 显然不在这个范围内。","重新填写 ["+objTgt.title+"] 这一项。");
					return false;
				}
			}
			if (inMonth.substring(0,1)=="0" && inMonth.length>1)
				inMonth=inMonth.substring(1,inMonth.length);
			inMonth=parseInt(inMonth);
		var inDay=inDate.substring(inDate.lastIndexOf("-")+1,inDate.length);
			if(isIntegral=="true"){
				if(inDay.length!=2){
					errAlert("日期填写有误 !表示日期的数字必须是完整的，如1日用01表示.","表示日期的数字必须处于1到31之间，而且必须满足闰年和大小月规则，\n可是您在 ["+objTgt.title+"] 项中填写的 "+inDay+" 显然不满足要求。","重新填写 ["+objTgt.title+"] 这一项。");
					return false;
				}
			}
			if (inDay.substring(0,1)=="0" && inDay.length>1)
				inDay=inDay.substring(1,inDay.length);
			inDay=parseInt(inDay);

		//alert(inYear+"-"+inMonth+"-"+inDay);
		if (inYear && !(isNaN(inYear)) && inYear.toString().length==4){
			var year=inYear;
			isLeapYear=judgeLeapYear(inYear);
		}else if(inYear.toString().length!=4){
			errAlert("对不起，系统需要四位年 !","为了保证日期存储的准确性，系统要求所有的日期输入都使用四位数字表示年份，\n可是您在 ["+objTgt.title+"] 项中没有使用四位年输入。","重新输入 ["+objTgt.title+"] 这一项。");

			focusItem(objTgt);
			return false;
		}else{
			errAlert("年份填写有误 !","","");

			focusItem(objTgt);
			return false;
		}

		if (inMonth && !(isNaN(inMonth)) && inMonth<=12 && inMonth >=1){
			var month=inMonth;
			isSmallMonth=judgeSmallMonth(inMonth);

		}else{
			errAlert("月份填写有误 !","表示月份的数字必须处于1到12之间，可是您在 ["+objTgt.title+"] 项中填写的 "+inMonth+" 显然不在这个范围内。","重新填写 ["+objTgt.title+"] 这一项。");

			focusItem(objTgt);
			return false;
		}

		if (inDay && !(isNaN(inDay)) && inDay>=1 && (month==2?(isLeapYear?inDay<=29:inDay<=28):(isSmallMonth?inDay<=30:inDay<=31))){
			var day=inDay;

		}else{
			errAlert("日期填写有误 !","表示日期的数字必须处于1到31之间，而且必须满足闰年和大小月规则，\n可是您在 ["+objTgt.title+"] 项中填写的 "+inDay+" 显然不满足要求。","重新填写 ["+objTgt.title+"] 这一项。");

			focusItem(objTgt);
			return false;
		}

		var inputDate=new Date();
		if (!(Date.parse(month + "-" + day + "-" + year))){
			errAlert("日期填写有误 !","为了保证日期存储的准确性，系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入，\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。");

			focusItem(objTgt);
			return false;
		}

	}else{
		errAlert("您输入的不是一个完整的日期值 !","为了保证日期存储的准确性，系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入，\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。");

		focusItem(objTgt);
		return false;
	}
}

// 判断闰年。
function judgeLeapYear(yearStr){
	if(!(isNaN(yearStr)) && yearStr.toString().length==4 && (yearStr%100==0?yearStr%400==0:yearStr%4==0))
		return true;
	return false;
}

// 判断小月。
function judgeSmallMonth(monthStr){
	if(monthStr==4||monthStr==6||monthStr==9||monthStr==11)
		return true;
	return false;
}

// 是否整数。
function isInt(objNumber){
	if(!isNaN(objNumber)){
		if(Math.round(objNumber)==objNumber){
			return true;
		}else{
			return false;
		}
	}else{
		return false;
	}
}

// 使INPUT对象获取焦点。
function focusItem(objTgt){
	objTgt.select();
	objTgt.focus();
}

// 判断页面是否修改过。
// 传入要判断页面的对象 -- eForm。
// 返回值：
// true -- 曾经修改过
// false -- 没有修改过
function isModified(eForm){
	var iNumElems = eForm.elements.length;
	for (var i=0;i<iNumElems;i++){
		var eElem = eForm.elements[i];
		// 输入框是否修改。
		if ("text" == eElem.type || "TEXTAREA" == eElem.tagName){
			if (eElem.value != eElem.defaultValue) return true;
		}
		// checkBox和radioBox是否修改。
		else if ("checkbox" == eElem.type || "radio" == eElem.type){
			if (eElem.checked != eElem.defaultChecked) return true;
		}
		// select是否修改。
		else if ("SELECT" == eElem.tagName){
			var cOpts = eElem.options;
			var iNumOpts = cOpts.length;
			for (var j=0;j<iNumOpts;j++){
				var eOpt = cOpts[j];
				if (eOpt.selected != eOpt.defaultSelected) return true;
			}
		}
	}
	return false;
}
/**
 * 合法邮件地址检测
 */
 function isEmail(email) {
	//var regu = "^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|NET|com|COM|gov|GOV|mil|MIL|org|ORG|edu|EDU|int|INT)$";
	//var isFomatMail = new RegExp(regu);

	var isFomatMail = new RegExp('^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$','');

	if (email.search(isFomatMail) >= 0) {
		return true;
	}
	return false;
}
function errAlert(errContent,errReason,errSolve){
	var errAlertString="";
	if(errContent!=""&&errContent!="undefined"){
		errAlertString="错误：\n"+errContent+"\n";

		if(errReason!=""&&errReason!="undefined")
			errAlertString+="\n错误原因：\n"+errReason;

		if(errSolve!=""&&errSolve!="undefined")
			errAlertString+="\n\n解决方法：\n"+errSolve;

		errAlertString+="\n";

		alert(errAlertString);

	}else{
		alert("调试期间错误 !\n\n错误内容为空 !");
	}
}


// 警告信息。
function warnAlert(warnContent){
	var warnAlertString="";

	if(warnContent!=""){
		warnAlertString="警告：\n"+warnContent+"\n";

		alert(warnAlertString);

	}else{
		alert("警告内容为空!");
	}
}
// 是否规范发车时间。
function isStartDate(dateStr){
	if(dateStr.length!=5)
{
alert ("请填写规范的发车时间,例如09:00");
return false;
}
else{
for (j=0;j<5;j++){
var strlen = dateStr.substr(j,1);
if(j==0 || j==1 || j==3 || j==4)
{
if(strlen<"0" || strlen>"9")
{
alert ("输入时间含非法字符,请按格式填写");
return false;
}
}

if(j==2)
{
if(strlen!=":")
{
alert ("输入时间含非法字符，请按格式填写");
return false;
}
}
}
}
}