// JavaScript Document

/*
索引
UserName()         用户名
PassWord()         密码
reg(sReg,Msg)      自定义正则 (正则,提示语句)
notBlank()         不能为空也不能有空格
required()         不能为空
isDate(fmt)        时间格式 (时间格式)
isString(min,max)  字符串 如min设为"'#'",表示字数不能大于max ,如max设为"'#'",表示字数不能小于min
strStartsWith(str) 必须以str开头
strEndsWith(str)   必须以str结尾
isContains(str)    必须包含str
isEmail()           Email格式
onlyZh()           只能是中文
onlyEn()           只能是英文
enOrNum()          只能是英文和数字
isInt(type)        整数的判定   type为空任意整数,'0+'非负整数,+'正整数,'-0'非正整数,'-'负整数
isFloat(type)      浮点数判定  type同上
setNumber(min,max) 数字大小判定 min最小值,max最大值 min为# 那么不能大于max,max为#那么不能小于min
isPhone()          电话座机
isMobile()         电话手机
isUrl()            网页地址
isZip()            邮政编码
select(num)        至少要选择num项
*/







//主函数
function CheckForm(oForm)
{
	var err_ele = null;
	var ele = oForm.elements;
	var haserror = false;
	//遍历所有表元素
	for(var i=0;i<ele.length;i++)
	{
		//过滤元素类型
		if(ele.type != 'submit' && ele.type != 'hidden' && ele.type != 'button')
		{
			//是否需要验证标签
			var required = ele[i].getAttribute('required');
			if(required!="undefined" && (required==""||required=="true"||required=="yes") )
			{
				if(!validate(ele[i]))
				{	
					if(err_ele==null)
						err_ele = ele[i];
					haserror = true;	
				}
			}
		}
	}
	//判断是否有没有通过验证的项目
	if(haserror)
	{
		err_ele.focus();
		return false;
	}
	else
	{
		return true;
	}
}


//生成<span>警告标签函数
function CreatSpan(ele,Msg)
{
	var span = document.createElement("span");
	span.className = 'checkspan';
	//设定名称属性,防止与其他span标签重复
	span.setAttribute('name','formcheck');
	span.innerHTML = Msg;
	//如果有父节点
	if(ele.parentNode)
	{
		//去除多余的span标签
		RemoveSpan(ele);
		//加入新span标签
		ele.parentNode.appendChild(span);
	}
}

function RemoveSpan(ele)
{
	//非第一次验证时,去除前一次验证显示的span标签
	//得到父节点下所有子节点
	var parent = ele.parentNode;
	var child  = parent.childNodes;
	for(i=0;i<child.length;i++)
	{
		//容错,子节点可能不含有tagName属性
		try
		{
			//得到name的属性,兼容IE和火狐
            var tagname    = child[i].tagName.toLowerCase();
			var name    = child[i].getAttribute('name');
			if(name != 'undefined' && tagname == 'span')
			{
				if(name == 'formcheck' )
				{
					parent.removeChild(child[i]);
				}
			}
		}
		catch(e)
		{ 
			continue;
		}
	}
}

//检测函数
function validate(ele)
{
	var fun = ele.getAttribute('fun');	
	this.value = ele.value;
	if(fun!=null)
	{
		var checkarr = executeFunc(fun);
		if(!regValidate(ele.value,checkarr[0]))
		{
			CreatSpan(ele,checkarr[1]);
			return false;
		}
		else
		{
			RemoveSpan(ele);
		}
	}
	return true;
}

//运行函数
function executeFunc(name)
{
	if(name.indexOf("(") == -1){
		return eval(name+"()");
	}else{
		return eval(name);
	}
}

//
//判定某个值与表达式是否相符
function regValidate(value,sReg)
{
	//字符串->正则表达式,不区分大小写
	var reg = new RegExp(sReg ,"i");
	if(reg.test(value)){
		return true;
	}else{
		return false;
	}
}



//////////////////////////////////验证规则定义///////////////////////////////





function UserName()
{
	var rt = new Array();
	rt[0] = '^([a-zA-Z0-9]|[._]){4,19}$';
	rt[1] = "用户名必须为4-19个字母和数字组成";
	return rt;
}

function PassWord()
{
	var rt = new Array();
	rt[0] = '^([a-zA-Z0-9]|[._]){6,19}$';
	rt[1] = "密码必须为6-19个字母和数字组成";
	return rt;
}

function reg(sReg,Msg){
	var rt = new Array();
	rt[0] = sReg;
	rt[1] = Msg;
	return rt;
}

function notBlank(){
	var rt = new Array();
	rt[0] = "^\\S+$";
	rt[1] = "该项不能为空,且不能含有空格!";
	return rt;
}

function required(){
	var rt = new Array();
	rt[0] = "^\\S";
	rt[1] = "该项不能为空!"
	return rt;
}

function isDate(fmt){
	var regex = new Array("-",".","/");
	var regex0 = "";
	for (var i=0;i<regex.length ;i++ ){
		if(fmt.indexOf(regex[i])!=-1){
			regex0 = regex[i];
			break;
		}
	}
	var y = 0;
	var m = 0;
	var d = 0;
	var number = new Array(0,0,0);
	var ch = '';
	var index = 0;
	for (var i=0;i<fmt.length ;i++ )
	{
		if(ch==''||fmt.charAt(i)==ch){
			number[index] = number[index]+1;
		}else if(fmt.charAt(i)!=regex0){
			index++;
			number[index] = number[index]+1;
		}
		ch = fmt.charAt(i);
		if(fmt.charAt(i)=='Y'||fmt.charAt(i)=='y'){
			y++;
		}
		if(fmt.charAt(i)=='M'||fmt.charAt(i)=='m'){
			m++;
		}
		if(fmt.charAt(i)=='D'||fmt.charAt(i)=='d'){
			d++;
		}
	}
	
	var rt = new Array();
	var sreg = "";
	for(i in number){
		if(number[i]!=0){
			if(sreg!=""){
				sreg += regex0;	
			}
			sreg += "\\d{"+number[i]+"}"; 
		}
	}
	sreg = "^"+sreg+"$";
	rt[0] = sreg;
	rt[1] = "该项格式应为"+fmt;
	return rt;
}

/**
 * 字符串判定
 * 如min设为"'#'",表示字数不能大于max
 * 如max设为"'#'",表示字数不能小于min
 */
function isString(min,max){
	var rt = new Array();
	if(min==null&&max==null){
		rt[0] = "";
		rt[1] = "";

		return rt;
	}
	if(max==null)
		max=min;
	if(min=="#"&&max=="#"){
		//任意字符
		rt[0] = "[\\S|\\s]";
		rt[1] = "";
		return rt;
	}
	if(min=="#"){
		rt[0] = "^[\\S|\\s]{0,"+max+"}$"; 
		rt[1] = "该项字数不能大于"+max;
		return rt;
	}
	if(max=="#"){
		rt[0] = "^[\\S|\\s]{"+min+",}$";
		rt[1] = "该项字数不能小于"+min;
		return rt;
	}
	rt[0] = "^[\\S|\\s]{"+min+","+max+"}$"; 
	if(min==max){
		rt[1] = "该项字数应为"+min+"个！";
	}else{
		rt[1] = "该项字数介于"+min+"和"+max+"之间！";
	}
	return rt;
}

function strStartsWith(str){
	if(this.value.indexOf(str)!=0){
		alert(this.showName+"必须以字符‘"+str+"’开头！");
		return false;
	}
}

function isContains(str){
	if(this.value.indexOf(str)==-1){
		alert(this.showName+"必须包含字符‘"+str+"’！");
		return false;
	}
}

function strEndsWith(str){
	if(this.value.lastIndexOf(str)+str.length!=this.value.length){
		alert(this.showName+"必须以字符‘"+str+"’结束！");
		return false;
	}
}

//判断email
function isEmail(){
	var rt = new Array();
	rt[0] = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
	rt[1] = "该项填写的EMAIL格式不正确！";
	
	return rt;
}

//只能输入中文
function onlyZh(){
	var rt = new Array();
	rt[0] = "^[\u0391-\uFFE5]+$";
	rt[1] = "该项只能输入中文！";
	return rt;
}

//只可输入英文
function onlyEn(){
	var rt = new Array();
	rt[0] = "^[A-Za-z]+$";
	rt[1] = "该项只能输入英文！";
	return rt;
}

function enOrNum(){
	var rt = new Array();
	rt[0] = "^[A-Za-z0-9]+$";
	rt[1] = "该项只能输入英文和数字,且不能有空格！";
	
	return rt;
}

/**
 * 整数的判定
 * @param type
 *		为空		任意整数
 *		'0+'	非负整数
 *		'+'		正整数
 *		'-0'	非正整数
 *		'-' 	负整数
 */
function isInt(type){
	var rt = new Array();
	if(type=="0+"){
		rt[0] = "^\\d+$";
		rt[1] = "该项应输入非负整数!";
	}else if(type=="+"){
		rt[0] = "^\\d*[1-9]\\d*$";
		rt[1] = "该项应输入正整数!";
	}else if(type=="-0"){
		rt[0] = "^((-\\d+)|(0+))$";
		rt[1] = "该项应输入非正整数!";
	}else if(type=="-"){
		rt[0] = "^-\\d*[1-9]\\d*$";
		rt[1] = "该项应输入负整数!";
	}else{
		rt[0] = "^-?\\d+$";
		rt[1] = "该项应输入整数值！";
	}
	return rt;
}

/**
 * 浮点数的判定
 * @param type
 *		为空		任意浮点数
 *		'0+'	非负浮点数
 *		'+'		正浮点数
 *		'-0'	非正浮点数
 *		'-'		负浮点数
 */
function isFloat(type){
	var rt = new Array();
	if(type=="0+"){
		rt[0] = "^\\d+(\.\\d+)?$";
		rt[1] = "该项应输入非负浮点数!";
	}else if(type=="+"){
		rt[0] = "^((\\d+\\.\\d*[1-9]\\d*)|(\\d*[1-9]\\d*\\.\\d+)|(\\d*[1-9]\\d*))$";
		rt[1] = "该项应输入正浮点数!";
	}else if(type=="-0"){
		rt[0] = "^((-\\d+(\.\\d+)?)|(0+(\\.0+)?))$";
		rt[1] = "该项应输入非正浮点数!";
	}else if(type=="-"){
		rt[0] = "^(-((\\d+\\.\\d*[1-9]\\d*)|(\\d*[1-9]\\d*\\.\\d+)|(\\d*[1-9]\\d*)))$";
		rt[1] = "该项应输入负浮点数!";
	}else{
		rt[0] = "^(-?\\d+)(\\.\\d+)?$";
		rt[1] = "该项应输入浮点数值！";
	}
	return rt;
}

/**
 * 数字大小判定
 * 如min设为"'#'",表示不能大于max
 * 如max设为"'#'",表示不能小于min
 */
function setNumber(min,max){
	
	if(!regValidate(this.value,"^(-?\\d+)(\\.\\d+)?$")){
		alert(this.showName+"应输入数字！");
		return false;
	}
	if(min==null&&max==null){
		//任意数字,不判定范围
		return isFloat();
	}
	if(max==null)
		max=min;

	if(min=="#"&&max=="#"){
		//任意数字,不判定范围
		return isFloat();
	}
	if(min=="#"){
		if(this.value>max){
			alert(this.showName+"不能大于"+max);	
			return false;
		}
	}
	if(max=="#"){
		if(this.value<min){
			alert(this.showName+"不能小于"+min);	
			return false;
		}
	}
	if(this.value<min||this.value>max){
		if(min==max){
			alert(this.showName+"的值应为"+min);	
		}else{
			alert(this.showName+"应介于"+min+"和"+max+"之间！");	
		}
		return false;
	}
	return true;
}

function isPhone(){
	var rt = new Array();
	rt[0] = "^((\\(\\d{2,3}\\))|(\\d{3}\\-))?(\\(0\\d{2,3}\\)|0\\d{2,3}-)?[1-9]\\d{6,7}(\\-\\d{1,4})?$";
	rt[1] = "应输入正确的电话号码格式！";
	return rt;
}

function isMobile(){
	var rt = new Array();
	rt[0] = "^((\\(\\d{2,3}\\))|(\\d{3}\\-))?13\\d{9}$";
	rt[1] = "应输入正确的手机号码格式！";
	return rt;
}

function isUrl(){
	var rt = new Array();
	rt[0] = "^http[s]?:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\\?%\\-&_~`@[\\]\\':+!]*([^<>\"\"])*$";
	rt[1] = "应输入正确的URL（必须以http(s)://开头）！";
	return rt;
}

function isZip(){
	var rt = new Array();
	rt[0] = "^[1-9]\\d{5}$";
	rt[1] = "应输入正确的编码格式！";
	return rt;
}

//目标至少需要选择(通常用于select-multiple/checkbox)
function select(num){
	var rt = new Array();
	rt[0] = "^0{"+num+",}$";
	rt[1] = "应至少选择"+num+"项！";
	return rt;
}
