/*------------------------------------------------------------------------------
用途：javascript 通用验证函数
Filename: CommFunc.js
编制：Ouyangjin Yantai Lande
调试环境：IE5
最后修改日期:2002-12-25

 1.Rtrim(str)					去掉尾部空格							完成
 2.HaveSpace(str)				检查是否含有空格						完成
 3.isDate(datestr)				是否是日期								完成
 4.validPwd(checkstr)			密码是否合法							完成
 5.validInput(checkstr)			输入是否合法							完成
 6.isEmail(emailStr,callmode)	Email是否合法							完成
 7.isTEL(TEL)					是否为电话号码							完成
 8.StrLth(strTemp)				计算字符串的长度						完成
 9.StrLth_UC(strTemp)			计算字符串的长度						完成
 10.isChineseChar(inchr)		检查是否汉字							完成
 11.HaveChinese(checkstr)		检查是否包含汉字						完成
 12.isAllChinese(checkstr)		检查是否全为汉字						完成
 13.validUserName(checkstr)		用户名是否合法							完成
 14.splitEmail(EmailList[,...])	从字符串中提取Email存放到数组中			完成
 15.AllTrim(str)				去掉首、尾空格							完成
 16.isWWW(str)					网址是否合法							完成
 -----------------------------------------------------------------------------*/

//函数名：Rtrim
//功能介绍：移去尾部空格
//参数说明：要移去尾部空格的字符串
//返回值:尾部空格被移去后的字符串
function Rtrim(str)
{
	var myString = new String(str);
	while (myString.length>0 && myString.lastIndexOf(" ")==myString.length-1)
	{
		myString=myString.substring(0,myString.length-1);
	}
	return myString;
}

//------------------------------------------------------------------

//函数名：HaveSpace
//功能介绍：检查是否含有空格
//参数说明：要检查的字符串
//返回值：true：含有  false：不含
function HaveSpace(str)
{
	var myString = new String(str);
	if (myString.search(" ")==-1) return false;
	else return true;
}

//------------------------------------------------------------------

//函数名：isDate
//功能介绍：检查是否为日期(格式为yyyy-mm-dd)
//参数说明：要检查的字符串
//返回值：false：不是日期  true：是日期
function isDate(datestr)
{
	var myDatestr = datestr+"";
	var aryDate  = myDatestr.split('-');
	if (aryDate.length!=3) return false; 
	var myYear  = parseInt(aryDate[0]);
	var myMonth = parseInt(aryDate[1]);
	var myDay   = parseInt(aryDate[2]);
	if ((aryDate[0].length!=4)||(aryDate[1].length>2)||(aryDate[2].length>2)) return false;
	if ((aryDate[1].length<1)||(aryDate[2].length<1)) return false;
	if (isNaN(myYear)||isNaN(myMonth)||isNaN(myDay)) return false;
	if ((myMonth>12)||(myMonth<1))   return false;
	if (Date_getDay(myYear,myMonth)<myDay) return false;//调用自定义函数判断某年某月的天数是否有效
	return true;
}

//函数名：Date_getDay
//功能介绍：返回某年某月的天数
//参数说明：传入年、月
//返回值：该年月的天数
function Date_getDay(inYear,inMonth)
{
	var aryDay = [0,31,28,31,30,31,30,31,31,30,31,30,31];
	if (inYear%4==0) aryDay[2] = 29;//此处为闰年的判断
	return aryDay[inMonth];
}

//------------------------------------------------------------------

//函数名：validPwd
//功能介绍：检查密码是否包含非法字符';
//参数说明：被检查的字符串
//返回值：false：含有非法字符 true：不含非法字符
function validPwd(checkstr) 
{
	var compStr="';";//该变量保存非法字符集
	for (i=0;i<compStr.length;i++)
	{
		if (checkstr.indexOf(compStr.charAt(i))!=-1) return false;
	}
	return true;
}

//------------------------------------------------------------------

//函数名：validInput
//功能介绍：判断其他输入（非密码）是否含有非允许字符
//参数说明：被检查的字符串
//返回值：false：含有非法字符 true：不含非法字符
function validInput(checkstr) 
{
	var compStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz _-1234567890.";//该变量保存合法字符集，其他视为非法字符
	for (i=0;i<checkstr.length;i++)
	{
		if (compStr.indexOf(checkstr.charAt(i))==-1) return false;
	}
	return true;
}

//------------------------------------------------------------------

//函数名：isEmail
//功能介绍：判断Email是否合法
//参数说明：
//	Emailstr-被检查的Email字符串
//	callmode-调用模式(true-弹出错误信息;false-不弹出错误信息;默认值为false)
//返回值：false：不合法 true：合法
function isEmail(emailStr,callmode)
{
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	//列出所有已知的后缀，可以更新
	var validChars="\[^\\s\\(\\)><@,;:\\\\\\\"\\.\\[\\]\]";
	//所有合法字符,不知是否完整,如!等....
	var atom=validChars + '+';//至少包含1个有效字符
	//var word="(" + atom + "|" + quotedUser + ")";
	//var userPat=new RegExp("^" + word + "(\\." + word + ")*$");//此句不知与下面句有什么不同,暂时屏蔽
	var userPat=new RegExp("^"+atom+"$");//用于判断用户名合法性
	var emailPat=/^(.+)@(.+)$/;//用于分离用户名和域名
	var matchArray=emailStr.match(emailPat);//将邮件分为2部分（以@为分界点）
	if (matchArray==null)//没有@
	{
		if (callmode) alert("邮件地址错误！");
		return false;
	}
	var user=matchArray[1];//储存@前部分,即用户名称
	var domain=matchArray[2];//储存@后部分,即邮件域名
	for (i=0; i<user.length; i++)//判断用户名称是否含非法字符
	{
		if (user.charCodeAt(i)>127)
		{
			if (callmode) alert("邮件包含非法字符！");
			return false;
		}
	}
	for (i=0; i<domain.length; i++)//判断邮件域名是否含非法字符
	{
		if (domain.charCodeAt(i)>127)
		{
			if (callmode) alert("域名包含非法字符！");
			return false;
		}
	}
	if (user.match(userPat)==null)
	{
		if (callmode) alert("邮件地址错误！");
		return false;
	}
	var ipDomainPat=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null)
	{
		for (var i=1;i<=4;i++)
		{
			if (IPArray[i]>255)
			{
				if (callmode) alert("邮件域名不正确！");
				return false;
			}
		}
		return true;
	} 
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++)
	{
		if (domArr[i].search(atomPat)==-1)
		{
			if (callmode) alert("邮件域名不正确！");
			return false;
		}
	}
	if (domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1)
	{
		if (callmode) alert("邮件域名不正确！");
		return false;
	}
	return true;
}


//------------------------------------------------------------------

//函数名：isTEL
//功能介绍：检查是否为电话号码
//参数说明：要检查的字符串
//返回值：true为是合法，false为不合法
function isTEL(TEL)
{
	if (TEL.length<=5)	return false;

	var leftn,rightn,strTemp;
	leftn=0;
	rightn=0;
	strTemp="0123456789-()# ";//电话号码可能包含字符
	for (i=0;i<TEL.length;i++)
	{
		if (strTemp.indexOf(TEL.charAt(i))==-1)	return false;//包含非法字符
		if (TEL.charAt(i)=='(') leftn++;
		if (TEL.charAt(i)==')') rightn++;
	}
	if (rightn!=leftn) return false;//左右括号不对称
	return true;//正确号码
}

//------------------------------------------------------------------

//函数名：StrLth
//功能介绍：计算字符串的长度（汉字、双字节字符作为两个字符长度计算）
//参数说明：要计算的字符串
//返回值：长度值
function StrLth(strTemp)
{
	var i,sum;
	strTemp=Rtrim(strTemp);//Rtrim为自定义函数
	sum=0;
	for (i=0;i<strTemp.length;i++)
	{
		if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255))
			sum=sum+1;
		else
			sum=sum+2;
	}
	return sum;
}

//------------------------------------------------------------------

//函数名：StrLth_UC
//功能介绍：计算字符串的长度（汉字、双字节字符作为一个字符长度计算）
//参数说明：要检查的字符串
//返回值：长度值
function StrLth_UC(strTemp)
{
	strTemp=Rtrim(strTemp);
	return strTemp.length;
}

//------------------------------------------------------------------

//opt1 小数     opt2   负数
//当opt2为1时检查num是否是负数
//当opt1为1时检查num是否是小数
//返回1是正确的，0是错误的
function chknbr(num,opt1,opt2)
{
	var i=num.length;
	var staus;
//staus用于记录.的个数
	status=0;
	if ((opt2!=1) && (num.charAt(0)=='-'))
	{
		//alert("You have enter a invalid number.");
		return 0;
	
	}
//当最后一位为.时出错
	if (num.charAt(i-1)=='.')
	{
		//alert("You have enter a invalid number.");
		return 0;
	}

	for (j=0;j<i;j++)
	{
		if (num.charAt(j)=='.')
		{
			status++;
		}
		if (status>1) 
		{
		//alert("You have enter a invalid number.");
		return 0;		
		}
		if (num.charAt(j)<'0' || num.charAt(j)>'9' )
		{
			if (((opt1==0) || (num.charAt(j)!='.')) && (j!=0)) 
			{
				//alert("You have enter a invalid number.");
				return 0;
			}
		}
	}
	return 1;
}

//------------------------------------------------------------------

//函数名：isChineseChar
//功能介绍：检查传入字符是否汉字，如为字符串则只判断第一个字符
//参数说明：要检查的字符
//返回值：true：是汉字  false：不是汉字
function isChineseChar(inchr)
{ 
	var ChinesePat=/^[\u4E00-\u9FA5]/g;
	if (inchr.match(ChinesePat)==null) return false;
	return true;
}

//------------------------------------------------------------------

//函数名：HaveChinese
//功能介绍：检查传入字符串是否包含汉字
//参数说明：要检查的字符串
//返回值：true：包含  false：不包含
function HaveChinese(checkstr)
{
	for(var i=0;i<checkstr.length;i++)
	{
		if(isChineseChar(checkstr.charAt(i))) return true;//isChineseChar为自定义的判断是否汉字的函数
	}
	return false;
}

//------------------------------------------------------------------

//函数名：isAllchinese
//功能介绍：检查传入字符串是否全为汉字
//参数说明：要检查的字符串
//返回值：true：是  false：不是
function isAllChinese(checkstr)
{
	if (checkstr.length==0) return false;
	for (var i=0;i<checkstr.length;i++)
	{
		if(!isChineseChar(checkstr.charAt(i))) return false;//isChineseChar为自定义的判断是否汉字的函数
	}
	return true;
}

//------------------------------------------------------------------

//函数名：validUserName
//功能介绍：判断输入用户名是否含有非允许字符
//			允许字符包括：ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-.~_
//参数说明：被检查的字符串
//返回值：false：含有非法字符 true：不含非法字符
function validUserName(checkstr)
{
	var compStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-.~_";//该变量保存合法字符集，其他视为非法字符;
	for (i=0;i<checkstr.length;i++)
	{
		if (compStr.indexOf(checkstr.charAt(i))==-1) return false;
	}
	return true;
}

//------------------------------------------------------------------

//函数名：splitEmail
//功能介绍：从字符串中提取出合法的以某种符号或格式分隔开的邮件，并返回合法邮件数组
//			（如无合法邮件则返回false）
//参数说明：参数个数不固定,如参数个数为1则以逗号和空格为分隔符号
//		1、包含邮件列表的字符串
//		2、指定的第1个分隔符号
//		3、指定的第2个分隔符号
//		...
//		n、指定的第n个分隔符号
//返回值：包含合法邮件的数组，如未找到任何合法邮件则返回false
function splitEmail(EmailList)
{
	if (arguments.length==1)
		var RegSplit=/ |,|，/;
	else
	{
		var RegStr="";
		for (i=1;i<arguments.length;i++)
		{
			RegStr+=arguments[i]+'|';
		}
		RegStr=RegStr.substr(0,RegStr.length-1);
		var RegSplit=new RegExp(RegStr);
	}
	var EmailAry=EmailList.split(RegSplit);
	var validStr='';
	for (i=0;i<EmailAry.length;i++)
	{
		if (isEmail(EmailAry[i])) validStr+=EmailAry[i]+',';
	}
	if (validStr.length==0) return false;
	validStr=validStr.substr(0,validStr.length-1);
	return validStr.split(',');
}

//------------------------------------------------------------------

//函数名：AllTrim
//功能介绍：去掉首、尾空格
//参数说明：要移去首、尾空格的字符串
//返回值:处理后的字符串
function AllTrim(str)
{
	while (str.charAt(0)==' ')
	{
		str=str.substring(1,str.length);
	}
	return Rtrim(str);//Rtrim为自定义函数
}

//------------------------------------------------------------------

//函数名：isWWW
//功能介绍：网址是否合法,不能包含如下字符:;!@,\=+)(*&^%$|?和双字节字符（参数除外）
//参数说明：要判断的字符串
//返回值:合法--处理后的网址；不合法:false
//使用时要这样使用：if (isWWW("dadsf")==false);//非法网址
function isWWW(str)
{
	var oldStr=str;
	if (str.indexOf('?')!=-1) str=str.substr(0,str.indexOf('?'));//去除?后的URL参数
	if (str.length==0) return false;
	
	str=str.toLowerCase();//为下面的查找http:[//]转化为小写
	if (str.indexOf('http://')==0)//去掉http://头
	{
		str=str.substring(7,str.length);
		oldStr=oldStr.substring(7,oldStr.length);
	}
	if (str.indexOf('http:')==0)
	{
		str=str.substring(5,str.length);
		oldStr=oldStr.substring(5,oldStr.length);
	}
	
	var UnValidStr=":;!@,\=+)(*&^%$|?";//非法字符集
	for (i=0;i<UnValidStr.length;i++)
	{
		if (str.indexOf(UnValidStr.charAt(i))!=-1) return false;//遇到非法字符返回false
		if (str.charCodeAt(i)<0 || str.charCodeAt(i)>127) return false;
	}
	
	var str1='',str2='';//str1保存主机域名或地址信息，str2保存后面信息
	
	if (str.indexOf('/')==-1) str+='/';
	
	if (str.indexOf('/')!=str.length-1)
	{
		str1=str.substring(0,str.indexOf('/')+1);
		str2=str.substring(str.indexOf('/')+1,str.length);
	}
	else str1=str;
	
	str1=str1.substring(0,str1.length-1);//将最后的/符号去掉
	
	//开始检测str1
	if (str1.length==0) return false;
	
	if (str1.indexOf('.')!=-1)//两端不能存在.号，且.号不能连续出现
	{
		var ary1=str1.split('.');
		for (i=0;i<ary1.length;i++)
		{
			if(ary1[i].length==0) return false;
		}
	}
	
	if (str2!='')
	{
		//开始检测str2,/号不能出现在最左或连续出现
		if (str2.indexOf('.')!=-1) return false;
		if (str2.charAt(str2.length-1)=='/')
		{
			if (str2.length==1) return false;
			str2=str2.substring(0,str2.length-1);
		}
		var ary2=str2.split('/');
		for (i=0;i<ary2.length;i++)
		{
			if(ary2[i].length==0) return false;
		}
	}
	
	return "http://"+oldStr;
}

//------------------------------------------------------------------

/*
用户名不能输入特殊字符（大小写字母、数字、-、~、.）
密码的输入限制(应删除字符';)
其他内容的输入限制

输出的格式
	1、html编码
	2、采用<pre></pre>，替换<、>
	3、替换回车、制表、空格、<、>
url编码（Server.URLEncode）
asp的字符屏蔽：(在server处理)
	1、sql语句中的'需要这样转换:''
	2、用like查询时%[]*_|都可能引起问题，最好将所有字符用[]包含。
	3、提交的数据是先存入后编码输出（Server.HTMLEncode）
*/
