/**********************************************************************************/
// PISX WOLF JavaScript 通用表单检证（GFV）  VERSION 1.0
// COPYRIGHT PISX 2006  ALLRIGHT RESERVED
// 开发组成员：Bardo QI, HUANG JIA, MEI JIE
// 说明: 本通用表单检单代码为开发框架PISX WOLF即Web Object Light Framework的一部分.
// 本代码网为开源BSD授权,即,你可以免费自由使用本代码,但必须保留本代码的版本声明.
// 同时，你需要在使用本代码的站点页面中添加 POWERED BY PISX GFV 链接. 链接网址是:
// http://www.pisx.com
// 使用说明: 在使用时,您需要将表单的INPUT和TEXTAREA添加以下自定义属性:
// A> gfvtype: 声明表单控件要检证的变量类型
// B> gfvtitle: 声明表单控件要检证的变量的名称
// C> gfvminlenb: 声明表单控件要检证的变量的最小字节长度,如果为0,则可以为空,否则不可以
//	为空
// D> gfvmaxlenb: 声明表单控件要检证的变量的最大字节长度,如果为0,则不验证最大长度
// E> gfvvfrom: 声明录入条件的FROM
// E> gfvto: 声明录入条件的TO,程序自动要求将gfvvfrom与gfvto相等的控件FORM<TO. 如果类
// 型是GFVPASSWORD,则自动要求二者必须相同。	
// gfvtype具有以下类型, GFVSTRING,GFVMAIL,GFVINTEGER,GFVDOUBLE,GFVCURRENCY,GFVNUMBER,
// GFVZIPCODE,GFVENGLISH,GFVCHINESE,GFVUSERNAME,GFVCOLOR,GFVURL,GFVPHONE,GFVMOBILE,
// GFVDATE,GFVIPADDRESS,GFVBLANKLINE,GFVHTML,GFVIDCARD,GFVPASSWORD
// 示例:<input type=text vtype='GFVMAIL' gfvminlenb=1>
// 由此,使用此代码,只要给INPUT和TEXTAREA添加自定义属性,然后,只要在表单的FORM标签中
// 添加 Onsubmit="JavaScript:return checktheform(this);" 即可，相当易用，不再需要编
// 写更多的JAVASCRIPT表单验证代码了。
// 我们清楚很多AJAX框架会自动生成表单，但不能同时自动生成客户表单验证，相信这一代码
// 对您一定有用处。
// 如果有什么问题，或报告BUG请用以下联系方式：
// EMAIL：Bardo@pisx.com
// WEB: http://www.pisx.com
// MSN: BardoOn@hotmail.com
// 有关本程序的中文手册请访问:
// http://www.pisx.com/index_pss.php/pagename-product-artid-101.htm
/**********************************************************************************/
function checktheform(theform)
{
	var elementType;
	vld=new validator();
	var cfromto=new ctlfromto();
	for (i=0;i<theform.length;i++)
	{
		etype=(theform.elements[i].type).toLowerCase();	
		if(vld.checktype.indexOf(etype)>=0);
		{
			
			if (theform.elements[i].gfvmaxlenb!=null)
				emaxlenb=theform.elements[i].gfvmaxlenb.trim();
			else
				emaxlenb=0;
			if (theform.elements[i].gfvminlenb!=null)			
				eminlenb=theform.elements[i].gfvminlenb.trim();
			else
				eminlenb=0;
			
			if (theform.elements[i].gfvtype!=null)
				evtype=theform.elements[i].gfvtype.toUpperCase().trim();
			else
				evtype="";
			
			if (theform.elements[i].gfvtitle!=null)
				evtitle=theform.elements[i].gfvtitle.trim();
			else
				evtitle="";
			if(theform.elements[i].value!=null)
				evalue=theform.elements[i].value.trim();
			else
				evalue="";
			if (theform.elements[i].gfvfrom!=null)
			{
				var bfound=false;				
				for (j=0;j<cfromto.to.length;j++)
				{
					if (cfromto.to[j].gfvto==theform.elements[i].gfvfrom)
					{
						cfromto.from[j]=theform.elements[i];
						bfound=true;
						break;
					}
				}
				if (bfound==false)
				{
					cfromto.from[cfromto.from.length]=theform.elements[i];
				}
			}
			if (theform.elements[i].gfvto!=null)
			{
				var bfound=false;
				for (j=0;j<cfromto.from.length;j++)
				{
					if (cfromto.from[j].gfvfrom==theform.elements[i].gfvto)
					{
						cfromto.to[j]=theform.elements[i];
						bfound=true;
						break;
					}
				}
				if (bfound==false)
				{
					cfromto.to[cfromto.to.length]=theform.elements[i];
				}
			}
			try
			{
				vld.check(evalue,etype,evtype,evtitle,eminlenb,emaxlenb);
			}
			catch(e)
			{
				alert(e);
				return false
			}
			if (vld.result==false)
			{
				alert(vld.msgtext);
				return false;
			}
		}

	}
	for (j=0;j<cfromto.from.length;j++)
	{
		var numtype="GFVINTEGER,GFVDOUBLE,GFVCURRENCY,GFVNUMBER,GFVZIPCODE";
		if (numtype.indexOf(cfromto.from[j].gfvtype)>=0)
		{
			if(parseFloat(cfromto.to[j].value)-parseFloat(cfromto.from[j].value)<0)
			{
				alert(cfromto.to[j].gfvtitle+"应当大于"+cfromto.from[j].gfvtitle+"！")
				return false;
			}
			
		}
		if (cfromto.from[j].gfvtype=="GFVDATE")
		{
			datefrom=cfromto.from[j].value;
			dateto=cfromto.to[j].value;
			var x=dateto.split("-");     
        	var y=datefrom.split("-");
            var datet=new Date(x[0],(x[1]-1),x[2]);
            var datef=new Date(y[0],(y[1]-1),y[2]);
			if (datet-datef<0)
			{
				alert(cfromto.to[j].gfvtitle+"应当大于"+cfromto.from[j].gfvtitle+"！")
				return false;
			}
		}
		
		if (cfromto.from[j].gfvtype=="GFVTIME")
		{
			datefrom=cfromto.from[j].value;
			dateto=cfromto.to[j].value;
			var x=dateto.split(":");     
        	var y=datefrom.split(":");
            var datet=new Date(1971,0,1,x[0],x[1],x[2]);
            var datef=new Date(1971,0,1,y[0],y[1],y[2]);
			if (datet-datef<0)
			{
				alert(cfromto.to[j].gfvtitle+"应当大于"+cfromto.from[j].gfvtitle+"！")
				return false;
			}
		}
		
		if (cfromto.from[j].gfvtype=="GFVDATETIME")
		{
			datefrom=cfromto.from[j].value;
			dateto=cfromto.to[j].value;
			var x=dateto.split(" ");     
        	var y=datefrom.split(" ");
			var xd=x[0].split("-");     
        	var yd=y[0].split("-");
			var xt=x[1].split(":");     
        	var yt=y[1].split(":");
            var datet=new Date(xd[0],xd[1],xd[2],xt[0],xt[1],xt[2]);
            var datef=new Date(yd[0],yd[1],yd[2],yt[0],yt[1],yt[2]);
			if (datet-datef<0)
			{
				alert(cfromto.to[j].gfvtitle+"应当大于"+cfromto.from[j].gfvtitle+"！")
				return false;
			}
		}
		
		var passtype="GFVPASSWORD";
		if (cfromto.from[j].gfvtype==passtype)
		{
			if(cfromto.to[j].value!=cfromto.from[j].value)
			{
				alert(cfromto.to[j].gfvtitle+"与"+cfromto.from[j].gfvtitle+"不一致！")
				return false;
			}			
		}
	}
	return true;
}

//去左右空格; 
String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}


//计算混合字节字串的字节长度

String.prototype.lenB = function()
{
    var arr=this.match(/[^\x00-\xff]/ig);
    return this.length+(arr==null?0:arr.length);

}

function ctlfromto()
{
	this.from=new Array();
	this.to=new Array();
}

function validator()
{
	 this.value="";
	 this.etype="";
	 this.gfvtype="";
	 this.gfvtitle="";
	 this.gfvminlenb=0;
	 this.gfvmaxlenb=0;
	 this.result=false;
	 this.msgtext="";
	 this.allowhtml=true;   								//这里为配置,确定是否允许用户输入HTML
	 this.vfilter="zip,rar,pdf,jpg,gif,doc,xls"; 			//这里配置允许上传的文件的扩展名
	 this.checktype="text,textarea,file,password";			//配置要验证的控件类型
}

validator.prototype.check = function(value,etype,vtype,vtitle,minlenb,maxlenb)
{
	 this.value=value;
	 this.etype=etype;
	 this.gfvtype=vtype;
	 this.gfvtitle=vtitle;
	 this.gfvminlenb=minlenb;
	 this.gfvmaxlenb=maxlenb;
	 this.result=false;
	 this.msgtext="";
	 if (this.gfvtype.length!=0)
	 {
		 if(isEmpty(this)==false)
			 return;
		 if(CheckLength(this)==false)
			 return;
		 if (this.allowhtml==false)
		 {
			 if (this.isHTML()==false)
			 {
				 this.msgtext=this.vtitle+"不允许HTML！";
				 this.result=false;
				 return;
			 }
		 }
		 if ((this.value.length==0)&&(this.gfvminlenb==0))
		 {
			this.result=true;
			return true;
		 } 
		 try
		 {
		 	eval(this.gfvtype+"(this)");
		 }
		 catch(e)
		 {
		 	alert(e+"function name: "+gfvtype);
		 }
		return;
		
	 }
	 
	 if (this.etype=="file")
	 {
		if (this.value.length!=0)
		{
			if(this.DoFilter()==false)
			{
				this.result=false;
				this.msgtext="您所选文件不允许上传，允许上传的扩展名仅有："+this.vfilter;
				return;
			}
		}
	 }
	 this.result=true;
	 return true;
}

//过滤扩展名，检测是否有允许
validator.prototype.DoFilter = function()
{
  	return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, this.vfilter.split(/\s*,\s*/).join("|")), "gi").test(this.value);
}

//是否为HTML文本; 
validator.prototype.isHTML = function()
{ 
	 var tmp_str = trim(this.value); 
	 var pattern = /<(.*)>.*<\/\1>/;  
	 return pattern.test(tmp_str);   
}

validator.prototype.isDate = function(s)
{
	var reExp=/^(19|20)\d{2}[\-](0[1-9]|1[0-2])[\-](0[1-9]|[12][0-9]|3[01])$/;
	return (reExp.exec(s)!= null);
}

//是否为空值; 
function isEmpty (v)
{ 
	if (v.gfvminlenb==0)
		return true;
	var tmp_str = v.value.trim(); 
 	if (tmp_str.length == 0)
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"不允许为空！";
		return false;
	}
	v.result=true;
	return true;
} 

//检查长度有有效性

function CheckLength (v)
{ 
	if (v.gfvminlenb==0)
	{
		if (v.gfvmaxlenb==0)
			return true;
	}

	var tmp_str = v.value; 
 	if (tmp_str.lenB() < v.gfvminlenb)
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"长度不够，至少为"+v.gfvminlenb.toString()+"字节！";
		return false;
	}
	
	if (v.gfvmaxlenb==0)
		return true;

	if (tmp_str.lenB()> v.gfvmaxlenb)
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"长度太长了，最多为"+v.gfvmaxlenb.toString()+"字节！";
		return false;
	}
	v.result=true;
	return true;
}

//普通字串，不验证
function GFVSTRING(v)
{
	 v.result=true;
	 return true;  
}

//是否有效的Email; 
function GFVMAIL(v)
{ 
 	var tmp_str = v.value.trim(); 
 	var pattern = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	}
	v.result=true;
	return true;
}

//是否有效的整数; 
function GFVINTEGER(v)
{ 
 	var tmp_str = v.value.trim(); 
	var pattern = /^[-\+]?\d+$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	}
	v.result=true;
	return true;
}

function GFVDOUBLE(v)
{ 
 	var tmp_str = v.value.trim(); 
 	var pattern = /^[-\+]?\d+(\.\d+)?$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;
}

//是否有效的币值数; 
function GFVCURRENCY(v)
{ 
 	var tmp_str = v.value.trim(); 
 	var pattern = /^\d+(\.\d+)?$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	}
	v.result=true;
	return true;
}

//是否有效的数字; 
function GFVNUMBER(v)
{ 
 	var tmp_str = v.value.trim(); 
 	var pattern = /^\d+$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;
} 

//是否有效的邮政编码; 
function GFVZIPCODE(v)
{ 
 	var tmp_str = v.value.trim();  
 	var pattern =  /^[1-9]\d{5}$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;
}

//是否为字母字串; 
function GFVENGLISH(v)
{ 
 	var tmp_str = v.value.trim();  
 	var pattern = /^[A-Za-z]+$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;  
}

//是否为汉字字串; 
function GFVCHINESE(v)
{ 
 	var tmp_str = v.value.trim();  
 	var pattern = /^[\u0391-\uFFE5]+$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true; 
}

//是否为有效的用户名; 
function GFVUSERNAME(v)
{ 
 	var tmp_str = v.value.trim();  
	var pattern = /^[a-z]\w{3,}$/i; 
	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确，不可以少于3个字符！";
		return false;
	} 
	v.result=true;
	return true;   
}

//是否有效的颜色值; 
function GFVCOLOR(v)
{ 
 	var tmp_str = v.value.trim();  
 	if (tmp_str.length!=7) 
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
 	if (tmp_str.search(/\#[a-fA-F0-9]{6}/) == -1)
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true; 
} 

//是否有效的链接（不仅限于HTTP，同时可FTP或其它）; 
function GFVURL(v)
{ 
 	var pattern=/[a-zA-z]+:\/\/[^\s]*/;
	//alert(v.value);
 	if(!pattern.test(v.value))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	
	v.result=true;
	return true;  
} 

//是否有效的电话号码 
function GFVPHONE(v)
{ 
 	var pattern= /\d{3}-\d{8}|\d{4}-\d{7}/;
 	if(!pattern.test(v.value))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;    
} 

//是否有效的手机号码(支持新的159开头的号); 
function GFVMOBILE(v)
{ 
 	var tmp_str = v.value.trim();   
 	var pattern = /^13[0-9]{9,9}$|159[0-9]{8,8}$/; 
 	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true; 
}

//是否为有效的日期(日期格式为YYYY-MM-DD); 
function GFVDATE(v)
{
	var reExp=/^(19|20)\d{2}[\-](0[1-9]|1[0-2])[\-](0[1-9]|[12][0-9]|3[01])$/;
	if (reExp.exec(v.value))
	{
	  	v.result=true;
		return true; 
	}	
	else
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！应当为：1974-01-01";
		return false;
	} 

}

//是否为有效的时间(时间格式为hh:mm:ss); 
function GFVTIME(v)
{
	var reExp=/^(20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/;
	if (reExp.exec(v.value))
	{
	  	v.result=true;
		return true; 
	}	
	else
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！正确格式为：00:00:00";
		return false;
	} 

}

function GFVDATETIME(v)
{
	var reExp=/^(19|20)\d{2}[\-](0[1-9]|1[0-2])[\-](0[1-9]|[12]\d|3[01]) ([0-1]\d|2[0-3]):[0-5]?\d:[0-5]?\d$/;

	if (reExp.exec(v.value))
	{
	  	v.result=true; 
		return true; 
	}	
	else
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！格式应为1974-01-01 00:00:00";
		return false;
	} 

}

//是否为有效的日期(日期格式为YYYY-MM); 
function GFVYEARMONTH(v)
{
	var reExp=/^(19|20)\d{2}[\-](0[1-9]|1[0-2])[\-](0[1-9]|[12][0-9]|3[01])$/;
	if (reExp.exec(v.value+'-01'))
	{
	  	v.result=true;
		return true; 
	}	
	else
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！应当为：1974-01";
		return false;
	} 

}

//是否有效的IP地址（仅对数字型IP地址有用）; 
function GFVIPADDRESS(v)
{ 
	v.result=true;
	return true; 
	var tmp_str = v.value.trim();   
	var pattern = /\d+\.\d+\.\d+\.\d+/; 
	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;  
}

//是否为空白行; 
function GFVBLANKLINE(v){ 
	var tmp_str = v.value.trim();   
	var pattern = /\n\s*\r/; 
	if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true; 
}

//是否为HTML文本; 
function GFVHTML(v){ 
	 var tmp_str = v.value.trim(); 
	 var pattern = /<(.*)>.*<\/\1>|<(.*) \/>/;  
	 if (!pattern.test(tmp_str))
	{
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	} 
	v.result=true;
	return true;   
}

//是否为有效的身份证号（18或15位均可）
function GFVIDCARD(v)
{
	 var date, Ai;
	 var verify = "10x98765432";
	 var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
	 var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
	 var re = v.value.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);

	 if(re == null) 
	 {
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	 }
	 if(re[1] >= area.length || area[re[1]] == "") 
	 {
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	 } 
	 if(re[2].length == 12){
		  Ai = v.value.substr(0, 17);
		  date = [re[9], re[10], re[11]].join("-");
	 }
	 else{
		  Ai = v.value.substr(0, 6) + "19" + this.value.substr(6);
		  date = ["19" + re[4], re[5], re[6]].join("-");
	 }

	 if(!v.isDate(date)) 
	 {
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	 } 
	 var sum = 0;
	 for(var i = 0;i<=16;i++){
	  	sum += Ai.charAt(i) * Wi[i];
	 }
	 Ai +=  verify.charAt(sum%11);
	 if (!(v.value.length ==15 || v.value.length == 18 && v.value == Ai))
	 {
		v.result=false;
		v.msgtext=v.gfvtitle+"格式不正确！";
		return false;
	 }
	 v.result=true;
	 return true;  
}

//这里可以客制化你对口令的要求
function GFVPASSWORD(v)
{
	 v.result=true;
	 return true;  
}




