﻿//====================================================================================================
// [插件名称] jQuery formValidator
//----------------------------------------------------------------------------------------------------
// [描    述] jQuery formValidator表单验证插件，它是基于jQuery类库，实现了js脚本于页面的分离。对一个表
//            单对象，你只需要写一行代码就可以轻松实现20种以上的脚本控制。现支持一个表单元素累加很多种
//            校验方式,采用配置信息的思想，而不是把信息写在表单元素上，能比较完美的实现ajax请求。
//----------------------------------------------------------------------------------------------------
// [作者网名] 猫冬	
// [邮    箱] wzmaodong@126.com
// [作者博客] http://wzmaodong.cnblogs.com
// [QQ群交流] 74106519
// [更新日期] 2011-04-30
// [版 本 号] ver4.0
//====================================================================================================

(function($){$.formValidator={sustainType:function(a,b){var c=$("#"+a).get(0);var d=c.tagName;var e=c.type;switch(b.validatetype){case"InitValidator":return true;case"InputValidator":return(d=="INPUT"||d=="TEXTAREA"||d=="SELECT");case"CompareValidator":return((d=="INPUT"||d=="TEXTAREA")?(e!="checkbox"&&e!="radio"):false);case"AjaxValidator":return(e=="text"||e=="textarea"||e=="file"||e=="password"||e=="select-one");case"RegexValidator":return((d=="INPUT"||d=="TEXTAREA")?(e!="checkbox"&&e!="radio"):false);case"FunctionValidator":return true}},initConfig:function(a){var b={debug:false,validatorgroup:"1",alertmessage:false,validobjectids:[],ajaxobjectids:"",forcevalid:false,onsuccess:function(){return true},onerror:function(){},submitonce:false,formid:"",autotip:false,tidymode:false,errorfocus:true,wideword:true};a=a||{};$.extend(b,a);if(b.tidymode){b.errorfocus=false};if(b.formid!=""){$("#"+b.formid).submit(function(){return $.formValidator.pageIsValid(b.validatorgroup)})};$('body').data(b.validatorgroup,b)},appendValid:function(a,b){if(!$.formValidator.sustainType(a,b))return-1;var c=$("#"+a).get(0);if(b.validatetype=="InitValidator"||c.settings==undefined){c.settings=new Array()}var d=c.settings.push(b);c.settings[d-1].index=d-1;return d-1},triggerValidate:function(a){switch(a.setting.validatetype){case"InputValidator":$.formValidator.inputValid(a);break;case"CompareValidator":$.formValidator.compareValid(a);break;case"AjaxValidator":$.formValidator.ajaxValid(a);break;case"RegexValidator":$.formValidator.regexValid(a);break;case"FunctionValidator":$.formValidator.functionValid(a);break}},setTipState:function(a,b,c){var d=a.settings[0];var e=$('body').data(d.validatorgroup);var f=$("#"+d.tipid);if(c==null||c==""){f.hide()}else{if(e.tidymode){$("#fv_content").html(c);a.Tooltip=c;if(b!="onError"){f.hide()}}else{f.show().removeClass().addClass(b).html(c)}}},resetTipState:function(a){var b=$('body').data(a);$.each(b.validobjectids,function(){$.formValidator.setTipState(this,"onShow",this.settings[0].onshow)})},setFailState:function(a,b){var c=$("#"+a);c.removeClass().addClass("onError").html(b)},showMessage:function(a){var b=a.id;var c=$("#"+b).get(0);var d=a.isvalid;var e=a.setting;var f="",showclass="";var g=$("#"+b).get(0).settings;var h=$('body').data(g[0].validatorgroup);if(!d){showclass="onError";if(e.validatetype=="AjaxValidator"){if(e.lastValid==""){showclass="onLoad";f=e.onwait}else{f=e.onerror}}else{f=(a.errormsg==""?e.onerror:a.errormsg)}if(h.alertmessage){var c=$("#"+b).get(0);if(c.validoldvalue!=$(c).val()){alert(f)}}else{$.formValidator.setTipState(c,showclass,f)}}else{f=$.formValidator.isEmpty(b)?e.onempty:e.oncorrect;$.formValidator.setTipState(c,"onCorrect",f)}return f},showAjaxMessage:function(a){var b=a.setting;var c=$("#"+a.id).get(0);if(c.validoldvalue!=$(c).val()){$.formValidator.ajaxValid(a)}else{if(b.isvalid!=undefined&&!b.isvalid){c.lastshowclass="onError";c.lastshowmsg=b.onerror}$.formValidator.setTipState(c,c.lastshowclass,c.lastshowmsg)}},getLength:function(a){var b=$("#"+a);var c=b.get(0);sType=c.type;var d=0;switch(sType){case"text":case"hidden":case"password":case"textarea":case"file":var e=b.val();var f=$('body').data(c.settings[0].validatorgroup);if(f.wideword){for(var i=0;i<e.length;i++){d=d+((e.charCodeAt(i)>=0x4e00&&e.charCodeAt(i)<=0x9fa5)?2:1)}}else{d=e.length}break;case"checkbox":case"radio":d=$("input[type='"+sType+"'][name='"+b.attr("name")+"']:checked").length;break;case"select-one":d=c.options?c.options.selectedIndex:-1;break;case"select-multiple":d=$("select[name="+c.name+"] option:selected").length;break}return d},isEmpty:function(a){return($("#"+a).get(0).settings[0].empty&&$.formValidator.getLength(a)==0)},isOneValid:function(a){return $.formValidator.oneIsValid(a).isvalid},oneIsValid:function(a){var b=new Object();b.id=a;b.ajax=-1;b.errormsg="";var c=$("#"+a).get(0);var d=c.settings;var e=d.length;if(e==1){d[0].bind=false}if(!d[0].bind){return null}for(var i=0;i<e;i++){if(i==0){if($.formValidator.isEmpty(a)){b.isvalid=true;b.setting=d[0];break}continue}b.setting=d[i];if(d[i].validatetype!="AjaxValidator"){$.formValidator.triggerValidate(b)}else{b.ajax=i}if(!d[i].isvalid){b.isvalid=false;b.setting=d[i];break}else{b.isvalid=true;b.setting=d[0];if(d[i].validatetype=="AjaxValidator")break}}return b},pageIsValid:function(b){if(b==null||b==undefined){b="1"};var c=true;var d;var e="^",thefirstid,name,name_list="^";var f=new Array();var g=$('body').data(b);$.each(g.validobjectids,function(){if(this.settings[0].bind){name=this.name;if(name_list.indexOf("^"+name+"^")==-1){if(name)name_list=name_list+name+"^";d=$.formValidator.oneIsValid(this.id);if(d){if(!d.isvalid){c=false;if(thefirstid==null)thefirstid=d.id;f[f.length]=d.errormsg==""?d.setting.onerror:d.errormsg}if(!g.alertmessage){var a=this.settings[0].tipid;if(e.indexOf("^"+a+"^")==-1){if(!d.isvalid){e=e+a+"^"}$.formValidator.showMessage(d)}}}}}});if(c){c=g.onsuccess();if(g.submitonce){$(":submit,:button").attr("disabled",true)}}else{var h=$("#"+thefirstid).get(0);g.onerror(f[0],h,f);if(thefirstid!=""&&g.errorfocus){$("#"+thefirstid).focus()}}return!g.debug&&c},ajaxValid:function(d){var e=d.id;var f=$("#"+e);var g=f.get(0);var h=g.settings;var i=h[d.ajax];var j=i.url;if(f.size()==0&&h[0].empty){d.setting=h[0];d.isvalid=true;$.formValidator.showMessage(d);i.isvalid=true;return}var k=$('body').data(h[0].validatorgroup);var l=$.param($(k.ajaxobjectids).serializeArray());l="clientid="+e+(l.length>0?"&"+l:"");j=j+(j.indexOf("?")>-1?("&"+l):("?"+l));$.ajax({type:i.type,url:j,cache:i.cache,data:i.data,async:i.async,timeout:i.timeout,dataType:i.datatype,success:function(a,b,c){if(i.success(a,b,c)){$.formValidator.setTipState(g,"onCorrect",h[0].oncorrect);i.isvalid=true}else{$.formValidator.setTipState(g,"onError",i.onerror);i.isvalid=false}},complete:function(a,b){if(i.buttons&&i.buttons.length>0){i.buttons.attr({"disabled":false})};i.complete(a,b)},beforeSend:function(a){if(i.buttons&&i.buttons.length>0){i.buttons.attr({"disabled":true})};var b=i.beforesend(a);if(b){i.isvalid=false;$.formValidator.setTipState(g,"onLoad",h[d.ajax].onwait)}i.lastValid="-1";return b},error:function(a,b,c){$.formValidator.setTipState(g,"onError",i.onerror);i.isvalid=false;i.error(a,b,c)},processData:i.processdata})},regexValid:function(a){var b=a.id;var c=a.setting;var d=$("#"+b).get(0).tagName;var e=$("#"+b).get(0);var f;if(e.settings[0].empty&&e.value==""){c.isvalid=true}else{var g=c.regexp;if($.type(g)=="string")g=[g];$.each(g,function(){var r=this;if(c.datatype=="enum"){r=eval("regexEnum."+r)}if(r==undefined||r==""){c.isvalid=false;return true}f=(new RegExp(r,c.param)).test($("#"+b).val());if(c.comparetype=="||"&&f){c.isvalid=true;return true}if(c.comparetype=="&&"&&!f){c.isvalid=false;return true}});if(!c.isvalid)c.isvalid=f}},functionValid:function(a){var b=a.id;var c=a.setting;var d=$("#"+b);var e=c.fun(d.val(),d.get(0));if(e!=undefined){if($.type(e)==="string"){c.isvalid=false;a.errormsg=e}else{c.isvalid=e}}},inputValid:function(a){var b=a.id;var c=a.setting;var d=$("#"+b);var e=d.get(0);var f=d.val();var g=e.type;var h=$.formValidator.getLength(b);var i=c.empty,emptyerror=false;switch(g){case"text":case"hidden":case"password":case"textarea":case"file":if(c.type=="size"){i=c.empty;if(!i.leftempty){emptyerror=(f.replace(/^[ \s]+/,'').length!=f.length)}if(!emptyerror&&!i.rightempty){emptyerror=(f.replace(/[ \s]+$/,'').length!=f.length)}if(emptyerror&&i.emptyerror){a.errormsg=i.emptyerror}}case"checkbox":case"select-one":case"select-multiple":case"radio":var j=false;if(g=="select-one"||g=="select-multiple"){c.type="size"}var k=c.type;if(k=="size"){if(!emptyerror){j=true}if(j){f=h}}else if(k=="date"||k=="datetime"){var l=false;if(k=="date"){j=isDate(f)};if(k=="datetime"){j=isDate(f)};if(j){f=new Date(f);c.min=new Date(c.min);c.max=new Date(c.max)}}else{stype=(typeof c.min);if(stype=="number"){f=(new Number(f)).valueOf();if(!isNaN(f)){j=true}}if(stype=="string"){j=true}}c.isvalid=false;if(j){if(f<c.min||f>c.max){if(f<c.min&&c.onerrormin){a.errormsg=c.onerrormin}if(f>c.min&&c.onerrormax){a.errormsg=c.onerrormax}}else{c.isvalid=true}}break}},compareValid:function(a){var b=a.id;var c=a.setting;var d=$("#"+b);var e=$("#"+c.desid);var f=c.datatype;curvalue=d.val();ls_data=e.val();if(f=="number"){if(!isNaN(curvalue)&&!isNaN(ls_data)){curvalue=parseFloat(curvalue);ls_data=parseFloat(ls_data)}else{return}}if(f=="date"||f=="datetime"){var g=false;if(f=="date"){g=(isDate(curvalue)&&isDate(ls_data))};if(f=="datetime"){g=(isDateTime(curvalue)&&isDateTime(ls_data))};if(g){curvalue=new Date(curvalue);ls_data=new Date(ls_data)}else{return}}switch(c.operateor){case"=":c.isvalid=(curvalue==ls_data);break;case"!=":c.isvalid=(curvalue!=ls_data);break;case">":c.isvalid=(curvalue>ls_data);break;case">=":c.isvalid=(curvalue>=ls_data);break;case"<":c.isvalid=(curvalue<ls_data);break;case"<=":c.isvalid=(curvalue<=ls_data);break;default:c.isvalid=false;break}},localTooltip:function(e){e=e||window.event;var a=e.pageX||(e.clientX?e.clientX+document.body.scrollLeft:0);var b=e.pageY||(e.clientY?e.clientY+document.body.scrollTop:0);$("#fvtt").css({"top":(b+2)+"px","left":(a-40)+"px"})},reloadAutoTip:function(e){if(e==undefined)e="1";var f=$('body').data(e);var g=$();$.each(f.validobjectids,function(){var a=this.settings;if(f.autotip){if(!f.tidymode){var b=a[0];var c="#"+b.afterid;var d=$(c).offset();var y=d.top;var x=$(c).width()+d.left;$("#"+b.tipid).parent().css({left:x+"px",top:y+"px"})}}})}};$.fn.formValidator=function(o){var p={validatorgroup:"1",empty:false,automodify:false,onshow:"请输入内容",onfocus:"请输入内容",oncorrect:"输入正确",onempty:"输入内容为空",defaultvalue:null,bind:true,ajax:true,validatetype:"InitValidator",tipcss:{"left":"10px","top":"1px","height":"20px","width":"250px"},triggerevent:"blur",forcevalid:false,tipid:null,afterid:null};o=o||{};if(o.validatorgroup==undefined){o.validatorgroup="1"};var q=$('body').data(o.validatorgroup);if(q.tidymode){p.tipcss={"left":"2px","width":"22px","height":"22px","display":"none"}};$.extend(true,p,o);return this.each(function(e){var f=$(this);var g={};$.extend(true,g,p);var h=g.tipid?g.tipid:this.id+"Tip";if(q.autotip){if(!q.tidymode){if($("body [id="+h+"]").length==0){var i=g.relativeid?g.relativeid:this.id;var j=$("#"+i).position();var y=j.top;var x=$("#"+i).width()+j.left;$("<div class='formValidateTip'></div>").appendTo($("body")).css({left:x+"px",top:y+"px"}).prepend($('<div id="'+h+'"></div>').css(g.tipcss));p.afterid=i}}else{f.showTooltips()}}p.tipid=h;$.formValidator.appendValid(this.id,p);if($.inArray(f,q.validobjectids)==-1){if(g.ajax){var k=q.ajaxobjectids;q.ajaxobjectids=k+(k!=""?",#":"#")+this.id}q.validobjectids.push(this)}if(!q.alertmessage){$.formValidator.setTipState(this,"onShow",p.onshow)}var l=this.tagName.toLowerCase();var m=this.type;var n=p.defaultvalue;if(n){f.val(n)}if(l=="input"||l=="textarea"){f.focus(function(){if(!q.alertmessage){var a=$("#"+h);this.lastshowclass=a.attr("class");this.lastshowmsg=a.html();$.formValidator.setTipState(this,"onFocus",p.onfocus)}if(m=="password"||m=="text"||m=="textarea"||m=="file"){this.validoldvalue=f.val()}});f.bind(p.triggerevent,function(){var a=this.settings;var b=$.formValidator.oneIsValid(this.id);if(b==null){return}if(b.ajax>=0){$.formValidator.showAjaxMessage(b)}else{var c=$.formValidator.showMessage(b);if(!b.isvalid){var d=p.automodify&&(this.type=="text"||this.type=="textarea"||this.type=="file");if(d&&!q.alertmessage){alert(c);$(this).val(this.validoldvalue);$.formValidator.setTipState(this,"onShow",p.onshow)}else{if(q.forcevalid||p.forcevalid){alert(c);this.focus()}}}}})}else if(l=="select"){f.bind({focus:function(){if(!q.alertmessage){$.formValidator.setTipState(this,"onFocus",p.onfocus)}},blur:function(){f.trigger("change")},change:function(){var a=$.formValidator.oneIsValid(this.id);if(a==null){return}if(a.ajax>=0){$.formValidator.showAjaxMessage(a)}else{$.formValidator.showMessage(a)}}})}})};$.fn.inputValidator=function(a){var b={isvalid:false,min:0,max:99999999999999,type:"size",onerror:"输入错误",validatetype:"InputValidator",empty:{leftempty:true,rightempty:true,leftemptyerror:null,rightemptyerror:null},wideword:true};a=a||{};$.extend(true,b,a);return this.each(function(){$.formValidator.appendValid(this.id,b)})};$.fn.compareValidator=function(a){var b={isvalid:false,desid:"",operateor:"=",onerror:"输入错误",validatetype:"CompareValidator"};a=a||{};$.extend(true,b,a);return this.each(function(){$.formValidator.appendValid(this.id,b)})};$.fn.regexValidator=function(a){var b={isvalid:false,regexp:"",param:"i",datatype:"string",comparetype:"||",onerror:"输入的格式不正确",validatetype:"RegexValidator"};a=a||{};$.extend(true,b,a);return this.each(function(){$.formValidator.appendValid(this.id,b)})};$.fn.functionValidator=function(a){var b={isvalid:true,fun:function(){this.isvalid=true},validatetype:"FunctionValidator",onerror:"输入错误"};a=a||{};$.extend(true,b,a);return this.each(function(){$.formValidator.appendValid(this.id,b)})};$.fn.ajaxValidator=function(a){var b={isvalid:false,lastValid:"",type:"GET",url:"",datatype:"html",timeout:999,data:"",async:false,cache:false,beforesend:function(){return true},success:function(){return true},complete:function(){},processdata:false,error:function(){},buttons:null,onerror:"服务器校验没有通过",onwait:"正在等待服务器返回数据",validatetype:"AjaxValidator"};a=a||{};$.extend(true,b,a);return this.each(function(){$.formValidator.appendValid(this.id,b)})};$.fn.defaultPassed=function(c){return this.each(function(){var a=this.settings;for(var i=1;i<a.length;i++){a[i].isvalid=true;if(!$('body').data(a[0].validatorgroup).alertmessage){var b=c?"onShow":"onCorrect";$.formValidator.setTipState(this,b,a[0].oncorrect)}}})};$.fn.unFormValidator=function(a){return this.each(function(){this.settings[0].bind=!a;if(a){$("#"+this.settings[0].tipid).hide()}else{$("#"+this.settings[0].tipid).show()}})};$.fn.showTooltips=function(){if($("body [id=fvtt]").length==0){fvtt=$("<div id='fvtt' style='position:absolute;z-index:56002'></div>");$("body").append(fvtt);fvtt.before("<iframe src='about:blank' class='fv_iframe' scrolling='no' frameborder='0'></iframe>")}return this.each(function(){jqobj=$(this);s=$("<span class='top' id=fv_content style='display:block'></span>");b=$("<b class='bottom' style='display:block' />");this.tooltip=$("<span class='fv_tooltip' style='display:block'></span>").append(s).append(b).css({"filter":"alpha(opacity:95)","KHTMLOpacity":"0.95","MozOpacity":"0.95","opacity":"0.95"});jqobj.bind({mouseover:function(e){$("#fvtt").append(this.tooltip);$("#fv_content").html(this.Tooltip);$.formValidator.localTooltip(e)},mouseout:function(){$("#fvtt").empty()},mousemove:function(e){$("#fv_content").html(this.Tooltip);$.formValidator.localTooltip(e)}})})}})(jQuery);
