﻿/*
扩展验证方法函数名称定义：

不可为空：	notnull
必须汉字：	chinese
必须英文：	english
必须数字：	number
必须选择：	select
格式字符：	format(email|phone|mobile|idCard|zip|qq|) '只有带有语义化的验证用此项 
长度范围：	len(min,max) 如果没有最小/大值则 null
*/

jQuery.fn.extend({
    notnull:function(){
            return sTip($.trim($(this).val())=='',"notnull");                     
    },
    checkNull:function(){    
            if ($.trim($(this).val())==''){
              return sTip(true,"isnull"); 
              return false;
            };   
            return true;              
    },
    clear:function(){        
           $(this).val('');         
    },
    chinese:function(){        
           return sTip(!verify("chinese",$(this).val()),"chinese");        
    },
    english:function(){        
           return sTip(!verify("english",$(this).val()),"english");        
    },    
    format:function(type){
           return sTip(!verify(type,$.trim($(this).val())),"format");        		   
    },
    outsize:function(size)
    {       
           return sTip(!$(this).val().length>size,"outsize");                   
    },
    inregion:function(min,max)
    {       
           var a;
           if(min<=$(this).val().length && $(this).val().length<=max){
                a=true;
           }
           else{
                a=false;
           }
           return sTip(!a,"inregion");                   
    },
    len:function(min,max)
    {
           var a = true;
		   var b = true;		   
		   if(min != null){a=(min<=$(this).val().length);}  
           if(max != null){b=($(this).val().length<=max);}
           return sTip(!a && b,"len");                   
    },
    checked:function(){
        return sTip(!valiCheckBox($(this).attr("name")),"checked");            
    },
    checkbox:function(){
        return sTip(!valiCheckBox($(this).attr("name")),"checkbox");            
    },
    select:function(){
        var b;
        if($(this).attr("value")==''){
            b=false;
        }
        else{
            b=true;
        }
        return sTip(!b,"select");            
    },    
    same:function(compareValue){
        var c;
        if($(this).val()==compareValue && compareValue.length>0){
            c=false;
        }    
        else{
            c=true;
        }
        return sTip(c,"same");            
    },
	number:function(){
		return sTip(!verify("number",$.trim($(this).val())),"number");    
    },
	email:function(){
		return sTip(!verify("email",$.trim($(this).val())),"email");    
    },
	phone:function(){
		return sTip(!verify("phone",$.trim($(this).val())),"phone");    
    },
	mobile:function(){
		return sTip(!verify("mobile",$.trim($(this).val())),"mobile");    
    },
	zip:function(){
		return sTip(!verify("zip",$.trim($(this).val())),"zip");    
    },
	qq:function(){
		return sTip(!verify("qq",$.trim($(this).val())),"qq");    
    },
	idCard:function(){
		return sTip(!verify("idCard",$.trim($(this).val())),"idCard");    
    }
});

//format(idCard|zip|qq|)
// JavaScript Document
// 要注意 显示信息的标签也要放在form之内。








//初始化  遍历HTML 如果有Error信息则 显示Error Text，如果无则显示Tips。





 

$(document).ready(function(){
	$("span[vfor]").each(function(){
			///是否存在后台输出错误
			//var oInput = $("#" + $(this).attr("vfor"));
			var oTip = $(this);
			var oInput = oTip.parents("form").find(":input[name='" + oTip.attr("vfor") + "']");
			if(oInput.length==0){return false;}
			if($.trim(oTip.text()).length == 0){ //No Error Text
				oTip.text(oTip.attr("tip"));		//加载提示标签
				oTip.attr("class","inline-block");	//正常提示样式
				oInput.mouseover(function(){oTip.addClass("tip");});
				oInput.mouseout(function(){oTip.removeClass("tip");});
			}else{
				oTip.attr("class","error");	//错误提示样式		
			}
			///是否存在默认值






			//try{
			if((oInput.val().length==0)&&(oTip.attr("default")!=undefined)){
				oInput.val(oTip.attr("default"));
				}
			//}catch(e){alert(e);alert(oInput.length);}
			////增加方法 失去焦点时验证





			if(oInput.attr("type").toLowerCase() != "hidden"){
				oInput.blur(function(){validItem($(this))});
			}else
			{
				var oShow=oTip.parents("form").find(":input[sfor='" + oTip.attr("vfor") + "']");
				oShow.blur(function(){validItem($(oInput));});
			}
		});   
	////////////////////////////////////////////////
	///显示用





	$(":input[sfor]").each(function(){
		var obj = $(this);
		var oHost = obj.parents("form").find(":input[name='" + obj.attr("sfor") + "']");
		if(oHost.length==0){return true;}
		var splitChar = oHost.attr("split");
		if(splitChar==undefined){splitChar='|';} //默认分隔符：“ |”





		var arr = oHost.val().split(splitChar);
		var subindex = parseInt(obj.attr("subindex"),10);
		if(subindex==undefined||isNaN(subindex)){subindex=0;}
		/////Text
		//		alert(obj.attr("type").toLowerCase);
		if((obj[0].tagName=="TEXTAREA")||(obj[0].tagName=="INPUT" && obj.attr("type").toLowerCase()=="text")){
			//obj.val(oHost.val().split(splitChar)[subindex]);
				if(subindex==0){
					obj.val(oHost.val());
					}else{
					obj.val(arr[subindex-1]); //JS没有下标溢出的报错 什么都不返回





					}
				////更改
				obj.change(function(){
					if(subindex==0){
					oHost.val(obj.val());
					}else{
					arr = oHost.val().split(splitChar);
					arr[subindex-1]=obj.val();
					oHost.val(arr.join(splitChar)); //JS没有下标溢出的报错 什么都不返回




					}
					});
			}else if(obj[0].tagName=="INPUT" && obj.attr("type").toLowerCase()=="checkbox"){		////CHECKBOX
				var checked = false;
				$.each(arr,function(i,n){
					if(checked){return true;}
					if(n==obj.val()){checked = true;}
					});
				if(checked){obj.attr("checked","checked");}else{obj.removeAttr("checked");}
				////更改
				obj.change(function(){
					var brothers = obj.parents("form").find("input[name='" + obj.attr("name") + "'][checked]");
					var newerr=new Array();
					$.each(brothers,function(i,n){
						   newerr[i]=$(n).val();
						});
					oHost.val(newerr.join(splitChar));
					});
				
			}else if(obj[0].tagName=="INPUT" && obj.attr("type").toLowerCase()=="radio"){		////RADIO
				if(oHost.val()==obj.val()){obj.attr("checked","checked");}else{obj.removeAttr("checked");}
				////更改
				//var 
				obj.change(function(){					
					oHost.val(obj.parents("form").find("input[name='" + obj.attr("name") + "'][checked]").val());
					});
				
				
			}
				
		});
	
	$("select").each(function(){
		var obj=$(this);
		//单选





		if(!(obj.attr("multiple"))){
			obj.val(obj.attr("svalue"));}
		else{
		//复选





			var splitChar = obj.attr("split");
			if(splitChar==undefined){splitChar='|';} //默认分隔符：“ |”





			var arr = obj.attr("svalue").split(splitChar);
			obj.val(arr);
		}
		
		});
		
	$(":input[inTip]").each(function(){
		if(($(this).val()=='') && ($(this).attr('inTip').length>0)){
			$(this).val($(this).attr('inTip'));
			$(this).addClass("inTip");
		}
		///////////////////////
		$(this).focus(function(){
			if($(this).val()==$(this).attr('inTip')){
			$(this).val('');
			$(this).removeClass("inTip");
			}
			});
		////////////////////////
		$(this).blur(function(){
			if ($(this).val() == '') {
				$(this).addClass("inTip");
				$(this).val($(this).attr('inTip'));
			}
		});
			
		
	});
	
	/////////为Form提交事件添加方法
	$("form").submit(function(){return validSubmit($(this))});

});


//OnSubmit验证 当前Form下的所有项进行验证。







function validSubmit(obj){
	//对form内每项内容进行验证







	var bolValid = true;
	var noError = true;
	$($(obj).find(":input")).each(function(){
		bolValid = validItem($(this)) && bolValid; //此处如果bolValid放在前面，当它为假时则后面的函数不会被执行





		if ((!(bolValid)) && noError){
			///如果本表单为hidden，那么vfor本表单的表单focus
			var errobj;
			if ($(this).attr('type').toLowerCase()=='hidden'){
				errobj=$(this).parents("form").find(":input[sfor='" + $(this).attr('name') + "']");
			}else{
				errobj=$(this);
				}
			window.scrollTo(0,$(errobj).offset().top-50); 
			noError = false;
			$(errobj).focus();
			}
	});
	return bolValid;	
}

//obj: input item
function validItem(obj){
	//判断当前项的值
	if($(obj).val()==$(obj).attr('inTip')){$(obj).val('');}
	//当前项的Name
	var inputName = $(obj).attr("name");
	//当前项的标签 parents("p")
	var validSpan =$(obj).parents("form").find("span[vfor='" + inputName + "']");
	if(validSpan.length==0){return true;}
	var inputLabel = validSpan.attr("label");	//要验证的表单的称呼





	if(inputLabel==undefined){inputLabel=' ';}
	var validOrder = validSpan.attr("valid");
	if(validOrder==undefined){validOrder=' ';}
	var validArr = validOrder.split(" ");  //以半角空的方式分隔数组

	
	//rentongjie 增加
	//1 当值为空并且没有notnull时不对验证结果进行处理

	var blnIgnore = false
	var blnNull = $.inArray("notnull",validArr)>-1?false:true;//判断是否允许为空
	if(($(obj).val()=="")&&blnNull== true){return true;}
	//---------------------------


	//////执行每项验证///////////////////////
	var blnValid = true;
	$.each(validArr,function(i,n){
		if(!(blnValid)){return false;}	//如果已经错误，则返回
		if(n.substring(n.length-1,n.length)==")"){
		var exeString = "$(obj)." + n + ";";
		}else{
		var exeString = "$(obj)." + n + "();";}
		try{
			var result = eval(exeString);
			if(!(result)){
				validSpan.text(''); //清空原有代码
				validSpan.attr("class","error");
				validSpan.html(inputLabel + ' ' + json[n]);//replace //// {$}
				blnValid = false;
				return false;	//如果遇到错误 则返回
			}
			else{
				//validSpan.text(''); //清空原有代码
				//validSpan.attr("class","inline-block");
			}
		}
		catch(e){
			
			//alert('syserror: ' + n);
		}
	});
	if(blnValid){
		try{
			var moreresult = eval('moreValid($(obj))');
			if(moreresult==false){blnValid = false;}
			}
		catch(e){//alert(e);
			}
		}
	if(blnValid){
		validSpan.text('    '); //清空原有代码
		validSpan.attr("class","success");
		}
	return blnValid;	
}

function showErr(obj,strinfo){
	//当前项的Name
	var inputName = $(obj).attr("name");
	var validSpan =$(obj).parents("form").find("span[vfor='" + inputName + "']");
	if(validSpan.length==0){return true;}
	var inputLabel = validSpan.attr("label");	//要验证的表单的称呼





	if(inputLabel==undefined){inputLabel=' ';}
	validSpan.text(''); //清空原有代码
	validSpan.attr("class","error");
	validSpan.html(strinfo);//replace //// {$}	
	}
     
//------------------显示信息-------------------

function sTip(type,code)
{   
    if(type==true)    
    {
	return false;
    }  
	
    if(type==false)
    { return true; }      
    
}