| /* | 
|     通用表单验证方法 | 
|     Validform version 5.3.2 | 
|     By sean during April 7, 2010 - March 26, 2013 | 
|     For more information, please visit http://validform.rjboy.cn | 
|     Validform is available under the terms of the MIT license. | 
|      | 
|     Demo: | 
|     $(".demoform").Validform({//$(".demoform")指明是哪一表单需要验证,名称需加在form表单上; | 
|         btnSubmit:"#btn_sub", //#btn_sub是该表单下要绑定点击提交表单事件的按钮;如果form内含有submit按钮该参数可省略; | 
|         btnReset:".btn_reset",//可选项 .btn_reset是该表单下要绑定点击重置表单事件的按钮; | 
|         tiptype:1, //可选项 1=>pop box,2=>side tip(parent.next.find; with default pop),3=>side tip(siblings; with default pop),4=>side tip(siblings; none pop),默认为1,也可以传入一个function函数,自定义提示信息的显示方式(可以实现你想要的任何效果,具体参见demo页); | 
|         ignoreHidden:false,//可选项 true | false 默认为false,当为true时对:hidden的表单元素将不做验证; | 
|         dragonfly:false,//可选项 true | false 默认false,当为true时,值为空时不做验证; | 
|         tipSweep:true,//可选项 true | false 默认为false,只在表单提交时触发检测,blur事件将不会触发检测(实时验证会在后台进行,不会显示检测结果); | 
|         label:".label",//可选项 选择符,在没有绑定nullmsg时查找要显示的提示文字,默认查找".Validform_label"下的文字; | 
|         showAllError:false,//可选项 true | false,true:提交表单时所有错误提示信息都会显示,false:一碰到验证不通过的就停止检测后面的元素,只显示该元素的错误信息; | 
|         postonce:true, //可选项 表单是否只能提交一次,true开启,不填则默认关闭; | 
|         ajaxPost:true, //使用ajax方式提交表单数据,默认false,提交地址就是action指定地址; | 
|         datatype:{//传入自定义datatype类型,可以是正则,也可以是函数(函数内会传入一个参数); | 
|             "*6-20": /^[^\s]{6,20}$/, | 
|             "z2-4" : /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,4}$/, | 
|             "username":function(gets,obj,curform,regxp){ | 
|                 //参数gets是获取到的表单元素值,obj为当前表单元素,curform为当前验证的表单,regxp为内置的一些正则表达式的引用; | 
|                 var reg1=/^[\w\.]{4,16}$/, | 
|                     reg2=/^[\u4E00-\u9FA5\uf900-\ufa2d]{2,8}$/; | 
|                  | 
|                 if(reg1.test(gets)){return true;} | 
|                 if(reg2.test(gets)){return true;} | 
|                 return false; | 
|                  | 
|                 //注意return可以返回true 或 false 或 字符串文字,true表示验证通过,返回字符串表示验证失败,字符串作为错误提示显示,返回false则用errmsg或默认的错误提示; | 
|             }, | 
|             "phone":function(){ | 
|                 // 5.0 版本之后,要实现二选一的验证效果,datatype 的名称 不 需要以 "option_" 开头;     | 
|             } | 
|         }, | 
|         usePlugin:{ | 
|             swfupload:{}, | 
|             datepicker:{}, | 
|             passwordstrength:{}, | 
|             jqtransform:{ | 
|                 selector:"select,input" | 
|             } | 
|         }, | 
|         beforeCheck:function(curform){ | 
|             //在表单提交执行验证之前执行的函数,curform参数是当前表单对象。 | 
|             //这里明确return false的话将不会继续执行验证操作;     | 
|         }, | 
|         beforeSubmit:function(curform){ | 
|             //在验证成功后,表单提交前执行的函数,curform参数是当前表单对象。 | 
|             //这里明确return false的话表单将不会提交;     | 
|         }, | 
|         callback:function(data){ | 
|             //返回数据data是json格式,{"info":"demo info","status":"y"} | 
|             //info: 输出提示信息; | 
|             //status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作; | 
|             //你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作; | 
|             //ajax遇到服务端错误时也会执行回调,这时的data是{ status:**, statusText:**, readyState:**, responseText:** }; | 
|              | 
|             //这里执行回调操作; | 
|             //注意:如果不是ajax方式提交表单,传入callback,这时data参数是当前表单对象,回调函数会在表单验证全部通过后执行,然后判断是否提交表单,如果callback里明确return false,则表单不会提交,如果return true或没有return,则会提交表单。 | 
|         } | 
|     }); | 
|      | 
|     Validform对象的方法和属性: | 
|     tipmsg:自定义提示信息,通过修改Validform对象的这个属性值来让同一个页面的不同表单使用不同的提示文字; | 
|     dataType:获取内置的一些正则; | 
|     eq(n):获取Validform对象的第n个元素; | 
|     ajaxPost(flag,sync,url):以ajax方式提交表单。flag为true时,跳过验证直接提交,sync为true时将以同步的方式进行ajax提交,传入了url地址时,表单会提交到这个地址; | 
|     abort():终止ajax的提交; | 
|     submitForm(flag,url):以参数里设置的方式提交表单,flag为true时,跳过验证直接提交,传入了url地址时,表单会提交到这个地址; | 
|     resetForm():重置表单; | 
|     resetStatus():重置表单的提交状态。传入了postonce参数的话,表单成功提交后状态会设置为"posted",重置提交状态可以让表单继续可以提交; | 
|     getStatus():获取表单的提交状态,normal:未提交,posting:正在提交,posted:已成功提交过; | 
|     setStatus(status):设置表单的提交状态,可以设置normal,posting,posted三种状态,不传参则设置状态为posting,这个状态表单可以验证,但不能提交; | 
|     ignore(selector):忽略对所选择对象的验证; | 
|     unignore(selector):将ignore方法所忽略验证的对象重新获取验证效果; | 
|     addRule(rule):可以通过Validform对象的这个方法来给表单元素绑定验证规则; | 
|     check(bool,selector):对指定对象进行验证(默认验证当前整个表单),通过返回true,否则返回false(绑定实时验证的对象,格式符合要求时返回true,而不会等ajax的返回结果),bool为true时则只验证不显示提示信息; | 
|     config(setup):可以通过这个方法来修改初始化参数,指定表单的提交地址,给表单ajax和实时验证的ajax里设置参数; | 
| */ | 
|   | 
| (function($,win,undef){ | 
|     var errorobj=null,//指示当前验证失败的表单元素; | 
|         msgobj=null,//pop box object  | 
|         msghidden=true;//msgbox hidden? | 
|   | 
|     var tipmsg={//默认提示文字; | 
|         tit:"提示信息", | 
|         w:{ | 
|             "*":"不能为空!", | 
|             "*6-16":"请填写6到16位任意字符!", | 
|             "n":"请填写数字!", | 
|             "n6-16":"请填写6到16位数字!", | 
|             "s":"不能输入特殊字符!", | 
|             "s6-18":"请填写6到18位字符!", | 
|             "p":"请填写邮政编码!", | 
|             "m":"请填写手机号码!", | 
|             "e":"邮箱地址格式不对!", | 
|             "url":"请填写网址!" | 
|         }, | 
|         def:"请填写正确信息!", | 
|         undef:"datatype未定义!", | 
|         reck:"两次输入的内容不一致!", | 
|         r:"", | 
|         c:"正在检测信息…", | 
|         s:"请{填写|选择}{0|信息}!", | 
|         v:"所填信息没有经过验证,请稍后…", | 
|         p:"正在提交数据…" | 
|     } | 
|     $.Tipmsg=tipmsg; | 
|      | 
|     var Validform=function(forms,settings,inited){ | 
|         var settings=$.extend({},Validform.defaults,settings); | 
|         settings.datatype && $.extend(Validform.util.dataType,settings.datatype); | 
|          | 
|         var brothers=this; | 
|         brothers.tipmsg={w:{}}; | 
|         brothers.forms=forms; | 
|         brothers.objects=[]; | 
|          | 
|         //创建子对象时不再绑定事件; | 
|         if(inited===true){ | 
|             return false; | 
|         } | 
|          | 
|         forms.each(function(){ | 
|             //已经绑定事件时跳过,避免事件重复绑定; | 
|             if(this.validform_inited=="inited"){return true;} | 
|             this.validform_inited="inited"; | 
|              | 
|             var curform=this; | 
|             curform.settings=$.extend({},settings); | 
|              | 
|             var $this=$(curform); | 
|              | 
|             //防止表单按钮双击提交两次; | 
|             curform.validform_status="normal"; //normal | posting | posted; | 
|              | 
|             //让每个Validform对象都能自定义tipmsg;     | 
|             $this.data("tipmsg",brothers.tipmsg); | 
|   | 
|             //bind the blur event; | 
|             $this.delegate("[datatype]","blur",function(){ | 
|                 //判断是否是在提交表单操作时触发的验证请求; | 
|                 var subpost=arguments[1]; | 
|                 Validform.util.check.call(this,$this,subpost); | 
|             }); | 
|              | 
|             $this.delegate(":text","keypress",function(event){ | 
|                 if(event.keyCode==13 && $this.find(":submit").length==0){ | 
|                     $this.submit(); | 
|                 } | 
|             }); | 
|              | 
|             //点击表单元素,默认文字消失效果; | 
|             //表单元素值比较时的信息提示增强; | 
|             //radio、checkbox提示信息增强; | 
|             //外调插件初始化; | 
|             Validform.util.enhance.call($this,curform.settings.tiptype,curform.settings.usePlugin,curform.settings.tipSweep); | 
|              | 
|             curform.settings.btnSubmit && $this.find(curform.settings.btnSubmit).bind("click",function(){ | 
|                 $this.trigger("submit"); | 
|                 return false; | 
|             }); | 
|                          | 
|             $this.submit(function(){ | 
|                 var subflag=Validform.util.submitForm.call($this,curform.settings); | 
|                 subflag === undef && (subflag=true); | 
|                 return subflag; | 
|             }); | 
|              | 
|             $this.find("[type='reset']").add($this.find(curform.settings.btnReset)).bind("click",function(){ | 
|                 Validform.util.resetForm.call($this); | 
|             }); | 
|              | 
|         }); | 
|          | 
|         //预创建pop box; | 
|         if( settings.tiptype==1 || (settings.tiptype==2 || settings.tiptype==3) && settings.ajaxPost ){         | 
|             creatMsgbox(); | 
|         } | 
|     } | 
|      | 
|     Validform.defaults={ | 
|         tiptype:1, | 
|         tipSweep:false, | 
|         showAllError:false, | 
|         postonce:false, | 
|         ajaxPost:false | 
|     } | 
|      | 
|     Validform.util={ | 
|         dataType:{ | 
|             "*":/[\w\W]+/, | 
|             "*6-16":/^[\w\W]{6,16}$/, | 
|             "n":/^\d+$/, | 
|             "n6-16":/^\d{6,16}$/, | 
|             "s":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/, | 
|             "s6-18":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/, | 
|             "p":/^[0-9]{6}$/, | 
|             "m":/^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/, | 
|             "e":/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, | 
|             "url":/^(\w+:\/\/)?\w+(\.\w+)+.*$/ | 
|         }, | 
|          | 
|         toString:Object.prototype.toString, | 
|          | 
|         isEmpty:function(val){ | 
|             return val==="" || val===$.trim(this.attr("tip")); | 
|         }, | 
|          | 
|         getValue:function(obj){ | 
|             var inputval, | 
|                 curform=this; | 
|                  | 
|             if(obj.is(":radio")){ | 
|                 inputval=curform.find(":radio[name='"+obj.attr("name")+"']:checked").val(); | 
|                 inputval= inputval===undef ? "" : inputval; | 
|             }else if(obj.is(":checkbox")){ | 
|                 inputval=""; | 
|                 curform.find(":checkbox[name='"+obj.attr("name")+"']:checked").each(function(){  | 
|                     inputval +=$(this).val()+',';  | 
|                 }) | 
|                 inputval= inputval===undef ? "" : inputval; | 
|             }else{ | 
|                 inputval=obj.val(); | 
|             } | 
|             inputval=$.trim(inputval); | 
|              | 
|             return Validform.util.isEmpty.call(obj,inputval) ? "" : inputval; | 
|         }, | 
|          | 
|         enhance:function(tiptype,usePlugin,tipSweep,addRule){ | 
|             var curform=this; | 
|              | 
|             //页面上不存在提示信息的标签时,自动创建; | 
|             curform.find("[datatype]").each(function(){ | 
|                 if(tiptype==2){ | 
|                     if($(this).parent().next().find(".Validform_checktip").length==0){ | 
|                         $(this).parent().next().append("<span class='Validform_checktip' />"); | 
|                         $(this).siblings(".Validform_checktip").remove(); | 
|                     } | 
|                 }else if(tiptype==3 || tiptype==4){ | 
|                     if($(this).siblings(".Validform_checktip").length==0){ | 
|                         $(this).parent().append("<span class='Validform_checktip' />"); | 
|                         $(this).parent().next().find(".Validform_checktip").remove(); | 
|                     } | 
|                 } | 
|             }) | 
|              | 
|             //表单元素值比较时的信息提示增强; | 
|             curform.find("input[recheck]").each(function(){ | 
|                 //已经绑定事件时跳过; | 
|                 if(this.validform_inited=="inited"){return true;} | 
|                 this.validform_inited="inited"; | 
|                  | 
|                 var _this=$(this); | 
|                 var recheckinput=curform.find("input[name='"+$(this).attr("recheck")+"']"); | 
|                 recheckinput.bind("keyup",function(){ | 
|                     if(recheckinput.val()==_this.val() && recheckinput.val() != ""){ | 
|                         if(recheckinput.attr("tip")){ | 
|                             if(recheckinput.attr("tip") == recheckinput.val()){return false;} | 
|                         } | 
|                         _this.trigger("blur"); | 
|                     } | 
|                 }).bind("blur",function(){ | 
|                     if(recheckinput.val()!=_this.val() && _this.val()!=""){ | 
|                         if(_this.attr("tip")){ | 
|                             if(_this.attr("tip") == _this.val()){return false;}     | 
|                         } | 
|                         _this.trigger("blur"); | 
|                     } | 
|                 }); | 
|             }); | 
|              | 
|             //hasDefaultText; | 
|             curform.find("[tip]").each(function(){//tip是表单元素的默认提示信息,这是点击清空效果; | 
|                 //已经绑定事件时跳过; | 
|                 if(this.validform_inited=="inited"){return true;} | 
|                 this.validform_inited="inited"; | 
|                  | 
|                 var defaultvalue=$(this).attr("tip"); | 
|                 var altercss=$(this).attr("altercss"); | 
|                 $(this).focus(function(){ | 
|                     if($(this).val()==defaultvalue){ | 
|                         $(this).val(''); | 
|                         if(altercss){$(this).removeClass(altercss);} | 
|                     } | 
|                 }).blur(function(){ | 
|                     if($.trim($(this).val())===''){ | 
|                         $(this).val(defaultvalue); | 
|                         if(altercss){$(this).addClass(altercss);} | 
|                     } | 
|                 }); | 
|             }); | 
|              | 
|             //enhance info feedback for checkbox & radio; | 
|             curform.find(":checkbox[datatype],:radio[datatype]").each(function(){ | 
|                 //已经绑定事件时跳过; | 
|                 if(this.validform_inited=="inited"){return true;} | 
|                 this.validform_inited="inited"; | 
|                  | 
|                 var _this=$(this); | 
|                 var name=_this.attr("name"); | 
|                 curform.find("[name='"+name+"']").filter(":checkbox,:radio").bind("click",function(){ | 
|                     //避免多个事件绑定时的取值滞后问题; | 
|                     setTimeout(function(){ | 
|                         _this.trigger("blur"); | 
|                     },0); | 
|                 }); | 
|                  | 
|             }); | 
|              | 
|             //select multiple; | 
|             curform.find("select[datatype][multiple]").bind("click",function(){ | 
|                 var _this=$(this); | 
|                 setTimeout(function(){ | 
|                     _this.trigger("blur"); | 
|                 },0); | 
|             }); | 
|              | 
|             //plugins here to start; | 
|             Validform.util.usePlugin.call(curform,usePlugin,tiptype,tipSweep,addRule); | 
|         }, | 
|          | 
|         usePlugin:function(plugin,tiptype,tipSweep,addRule){ | 
|             /* | 
|                 plugin:settings.usePlugin; | 
|                 tiptype:settings.tiptype; | 
|                 tipSweep:settings.tipSweep; | 
|                 addRule:是否在addRule时触发; | 
|             */ | 
|   | 
|             var curform=this, | 
|                 plugin=plugin || {}; | 
|             //swfupload; | 
|             if(curform.find("input[plugin='swfupload']").length && typeof(swfuploadhandler) != "undefined"){ | 
|                  | 
|                 var custom={ | 
|                         custom_settings:{ | 
|                             form:curform, | 
|                             showmsg:function(msg,type,obj){ | 
|                                 Validform.util.showmsg.call(curform,msg,tiptype,{obj:curform.find("input[plugin='swfupload']"),type:type,sweep:tipSweep});     | 
|                             }     | 
|                         }     | 
|                     }; | 
|   | 
|                 custom=$.extend(true,{},plugin.swfupload,custom); | 
|                  | 
|                 curform.find("input[plugin='swfupload']").each(function(n){ | 
|                     if(this.validform_inited=="inited"){return true;} | 
|                     this.validform_inited="inited"; | 
|                      | 
|                     $(this).val(""); | 
|                     swfuploadhandler.init(custom,n); | 
|                 }); | 
|                  | 
|             } | 
|              | 
|             //datepicker; | 
|             if(curform.find("input[plugin='datepicker']").length && $.fn.datePicker){ | 
|                 plugin.datepicker=plugin.datepicker || {}; | 
|                  | 
|                 if(plugin.datepicker.format){ | 
|                     Date.format=plugin.datepicker.format;  | 
|                     delete plugin.datepicker.format; | 
|                 } | 
|                 if(plugin.datepicker.firstDayOfWeek){ | 
|                     Date.firstDayOfWeek=plugin.datepicker.firstDayOfWeek;  | 
|                     delete plugin.datepicker.firstDayOfWeek; | 
|                 } | 
|   | 
|                 curform.find("input[plugin='datepicker']").each(function(n){ | 
|                     if(this.validform_inited=="inited"){return true;} | 
|                     this.validform_inited="inited"; | 
|                      | 
|                     plugin.datepicker.callback && $(this).bind("dateSelected",function(){ | 
|                         var d=new Date( $.event._dpCache[this._dpId].getSelected()[0] ).asString(Date.format); | 
|                         plugin.datepicker.callback(d,this); | 
|                     }); | 
|                     $(this).datePicker(plugin.datepicker); | 
|                 }); | 
|             } | 
|              | 
|             //passwordstrength; | 
|             if(curform.find("input[plugin*='passwordStrength']").length && $.fn.passwordStrength){ | 
|                 plugin.passwordstrength=plugin.passwordstrength || {}; | 
|                 plugin.passwordstrength.showmsg=function(obj,msg,type){ | 
|                     Validform.util.showmsg.call(curform,msg,tiptype,{obj:obj,type:type,sweep:tipSweep}); | 
|                 }; | 
|                  | 
|                 curform.find("input[plugin='passwordStrength']").each(function(n){ | 
|                     if(this.validform_inited=="inited"){return true;} | 
|                     this.validform_inited="inited"; | 
|                      | 
|                     $(this).passwordStrength(plugin.passwordstrength); | 
|                 }); | 
|             } | 
|              | 
|             //jqtransform; | 
|             if(addRule!="addRule" && plugin.jqtransform && $.fn.jqTransSelect){ | 
|                 if(curform[0].jqTransSelected=="true"){return;}; | 
|                 curform[0].jqTransSelected="true"; | 
|                  | 
|                 var jqTransformHideSelect = function(oTarget){ | 
|                     var ulVisible = $('.jqTransformSelectWrapper ul:visible'); | 
|                     ulVisible.each(function(){ | 
|                         var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0); | 
|                         //do not hide if click on the label object associated to the select | 
|                         if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();} | 
|                     }); | 
|                 }; | 
|                  | 
|                 /* Check for an external click */ | 
|                 var jqTransformCheckExternalClick = function(event) { | 
|                     if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); } | 
|                 }; | 
|                  | 
|                 var jqTransformAddDocumentListener = function (){ | 
|                     $(document).mousedown(jqTransformCheckExternalClick); | 
|                 }; | 
|                  | 
|                 if(plugin.jqtransform.selector){ | 
|                     curform.find(plugin.jqtransform.selector).filter('input:submit, input:reset, input[type="button"]').jqTransInputButton(); | 
|                     curform.find(plugin.jqtransform.selector).filter('input:text, input:password').jqTransInputText();             | 
|                     curform.find(plugin.jqtransform.selector).filter('input:checkbox').jqTransCheckBox(); | 
|                     curform.find(plugin.jqtransform.selector).filter('input:radio').jqTransRadio(); | 
|                     curform.find(plugin.jqtransform.selector).filter('textarea').jqTransTextarea(); | 
|                     if(curform.find(plugin.jqtransform.selector).filter("select").length > 0 ){ | 
|                          curform.find(plugin.jqtransform.selector).filter("select").jqTransSelect(); | 
|                          jqTransformAddDocumentListener(); | 
|                     } | 
|                      | 
|                 }else{ | 
|                     curform.jqTransform(); | 
|                 } | 
|                  | 
|                 curform.find(".jqTransformSelectWrapper").find("li a").click(function(){ | 
|                     $(this).parents(".jqTransformSelectWrapper").find("select").trigger("blur");     | 
|                 }); | 
|             } | 
|   | 
|         }, | 
|          | 
|         getNullmsg:function(curform){ | 
|             var obj=this; | 
|             var reg=/[\u4E00-\u9FA5\uf900-\ufa2da-zA-Z\s]+/g; | 
|             var nullmsg; | 
|              | 
|             var label=curform[0].settings.label || ".Validform_label"; | 
|             label=obj.siblings(label).eq(0).text() || obj.siblings().find(label).eq(0).text() || obj.parent().siblings(label).eq(0).text() || obj.parent().siblings().find(label).eq(0).text(); | 
|             label=label.replace(/\s(?![a-zA-Z])/g,"").match(reg); | 
|             label=label? label.join("") : [""]; | 
|   | 
|             reg=/\{(.+)\|(.+)\}/; | 
|             nullmsg=curform.data("tipmsg").s || tipmsg.s; | 
|              | 
|             if(label != ""){ | 
|                 nullmsg=nullmsg.replace(/\{0\|(.+)\}/,label); | 
|                 if(obj.attr("recheck")){ | 
|                     nullmsg=nullmsg.replace(/\{(.+)\}/,""); | 
|                     obj.attr("nullmsg",nullmsg); | 
|                     return nullmsg; | 
|                 } | 
|             }else{ | 
|                 nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(/\{0\|(.+)\}/,"") : nullmsg.replace(/\{0\|(.+)\}/,"$1"); | 
|             } | 
|             nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(reg,"$2") : nullmsg.replace(reg,"$1"); | 
|              | 
|             obj.attr("nullmsg",nullmsg); | 
|             return nullmsg; | 
|         }, | 
|          | 
|         getErrormsg:function(curform,datatype,recheck){ | 
|             var regxp=/^(.+?)((\d+)-(\d+))?$/, | 
|                 regxp2=/^(.+?)(\d+)-(\d+)$/, | 
|                 regxp3=/(.*?)\d+(.+?)\d+(.*)/, | 
|                 mac=datatype.match(regxp), | 
|                 temp,str; | 
|              | 
|             //如果是值不一样而报错; | 
|             if(recheck=="recheck"){ | 
|                 str=curform.data("tipmsg").reck || tipmsg.reck; | 
|                 return str; | 
|             } | 
|              | 
|             var tipmsg_w_ex=$.extend({},tipmsg.w,curform.data("tipmsg").w); | 
|              | 
|             //如果原来就有,直接显示该项的提示信息; | 
|             if(mac[0] in tipmsg_w_ex){ | 
|                 return curform.data("tipmsg").w[mac[0]] || tipmsg.w[mac[0]]; | 
|             } | 
|              | 
|             //没有的话在提示对象里查找相似; | 
|             for(var name in tipmsg_w_ex){ | 
|                 if(name.indexOf(mac[1])!=-1 && regxp2.test(name)){ | 
|                     str=(curform.data("tipmsg").w[name] || tipmsg.w[name]).replace(regxp3,"$1"+mac[3]+"$2"+mac[4]+"$3"); | 
|                     curform.data("tipmsg").w[mac[0]]=str; | 
|                      | 
|                     return str; | 
|                 } | 
|                  | 
|             } | 
|              | 
|             return curform.data("tipmsg").def || tipmsg.def; | 
|         }, | 
|   | 
|         _regcheck:function(datatype,gets,obj,curform){ | 
|             var curform=curform, | 
|                 info=null, | 
|                 passed=false, | 
|                 reg=/\/.+\//g, | 
|                 regex=/^(.+?)(\d+)-(\d+)$/, | 
|                 type=3;//default set to wrong type, 2,3,4; | 
|                  | 
|             //datatype有三种情况:正则,函数和直接绑定的正则; | 
|              | 
|             //直接是正则; | 
|             if(reg.test(datatype)){ | 
|                 var regstr=datatype.match(reg)[0].slice(1,-1); | 
|                 var param=datatype.replace(reg,""); | 
|                 var rexp=RegExp(regstr,param); | 
|   | 
|                 passed=rexp.test(gets); | 
|   | 
|             //function; | 
|             }else if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object Function]"){ | 
|                 passed=Validform.util.dataType[datatype](gets,obj,curform,Validform.util.dataType); | 
|                 if(passed === true || passed===undef){ | 
|                     passed = true; | 
|                 }else{ | 
|                     info= passed; | 
|                     passed=false; | 
|                 } | 
|              | 
|             //自定义正则;     | 
|             }else{ | 
|                 //自动扩展datatype; | 
|                 if(!(datatype in Validform.util.dataType)){ | 
|                     var mac=datatype.match(regex), | 
|                         temp; | 
|                          | 
|                     if(!mac){ | 
|                         passed=false; | 
|                         info=curform.data("tipmsg").undef||tipmsg.undef; | 
|                     }else{ | 
|                         for(var name in Validform.util.dataType){ | 
|                             temp=name.match(regex); | 
|                             if(!temp){continue;} | 
|                             if(mac[1]===temp[1]){ | 
|                                 var str=Validform.util.dataType[name].toString(), | 
|                                     param=str.match(/\/[mgi]*/g)[1].replace("\/",""), | 
|                                     regxp=new RegExp("\\{"+temp[2]+","+temp[3]+"\\}","g"); | 
|                                 str=str.replace(/\/[mgi]*/g,"\/").replace(regxp,"{"+mac[2]+","+mac[3]+"}").replace(/^\//,"").replace(/\/$/,""); | 
|                                 Validform.util.dataType[datatype]=new RegExp(str,param); | 
|                                 break; | 
|                             }     | 
|                         } | 
|                     } | 
|                 } | 
|                  | 
|                 if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object RegExp]"){ | 
|                     passed=Validform.util.dataType[datatype].test(gets); | 
|                 } | 
|                      | 
|             } | 
|              | 
|              | 
|             if(passed){ | 
|                 type=2; | 
|                 info=obj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r; | 
|                  | 
|                 //规则验证通过后,还需要对绑定recheck的对象进行值比较; | 
|                 if(obj.attr("recheck")){ | 
|                     var theother=curform.find("input[name='"+obj.attr("recheck")+"']:first"); | 
|                     if(gets!=theother.val()){ | 
|                         passed=false; | 
|                         type=3; | 
|                         info=obj.attr("errormsg")  || Validform.util.getErrormsg.call(obj,curform,datatype,"recheck"); | 
|                     } | 
|                 } | 
|             }else{ | 
|                 info=info || obj.attr("errormsg") || Validform.util.getErrormsg.call(obj,curform,datatype); | 
|                  | 
|                 //验证不通过且为空时; | 
|                 if(Validform.util.isEmpty.call(obj,gets)){ | 
|                     info=obj.attr("nullmsg") || Validform.util.getNullmsg.call(obj,curform); | 
|                 } | 
|             } | 
|              | 
|             return{ | 
|                     passed:passed, | 
|                     type:type, | 
|                     info:info | 
|             }; | 
|              | 
|         }, | 
|          | 
|         regcheck:function(datatype,gets,obj){ | 
|             /* | 
|                 datatype:datatype; | 
|                 gets:inputvalue; | 
|                 obj:input object; | 
|             */ | 
|             var curform=this, | 
|                 info=null, | 
|                 passed=false, | 
|                 type=3;//default set to wrong type, 2,3,4; | 
|                  | 
|             //ignore; | 
|             if(obj.attr("ignore")==="ignore" && Validform.util.isEmpty.call(obj,gets)){                 | 
|                 if(obj.data("cked")){ | 
|                     info="";     | 
|                 } | 
|                  | 
|                 return { | 
|                     passed:true, | 
|                     type:4, | 
|                     info:info | 
|                 }; | 
|             } | 
|   | 
|             obj.data("cked","cked");//do nothing if is the first time validation triggered; | 
|              | 
|             var dtype=Validform.util.parseDatatype(datatype); | 
|             var res; | 
|             for(var eithor=0; eithor<dtype.length; eithor++){ | 
|                 for(var dtp=0; dtp<dtype[eithor].length; dtp++){ | 
|                     res=Validform.util._regcheck(dtype[eithor][dtp],gets,obj,curform); | 
|                     if(!res.passed){ | 
|                         break; | 
|                     } | 
|                 } | 
|                 if(res.passed){ | 
|                     break; | 
|                 } | 
|             } | 
|             return res; | 
|              | 
|         }, | 
|          | 
|         parseDatatype:function(datatype){ | 
|             /* | 
|                 字符串里面只能含有一个正则表达式; | 
|                 Datatype名称必须是字母,数字、下划线或*号组成; | 
|                 datatype="/regexp/|phone|tel,s,e|f,e"; | 
|                 ==>[["/regexp/"],["phone"],["tel","s","e"],["f","e"]]; | 
|             */ | 
|   | 
|             var reg=/\/.+?\/[mgi]*(?=(,|$|\||\s))|[\w\*-]+/g, | 
|                 dtype=datatype.match(reg), | 
|                 sepor=datatype.replace(reg,"").replace(/\s*/g,"").split(""), | 
|                 arr=[], | 
|                 m=0; | 
|                  | 
|             arr[0]=[]; | 
|             arr[0].push(dtype[0]); | 
|             for(var n=0;n<sepor.length;n++){ | 
|                 if(sepor[n]=="|"){ | 
|                     m++; | 
|                     arr[m]=[]; | 
|                 } | 
|                 arr[m].push(dtype[n+1]); | 
|             } | 
|              | 
|             return arr; | 
|         }, | 
|   | 
|         showmsg:function(msg,type,o,triggered){ | 
|             /* | 
|                 msg:提示文字; | 
|                 type:提示信息显示方式; | 
|                 o:{obj:当前对象, type:1=>正在检测 | 2=>通过, sweep:true | false},  | 
|                 triggered:在blur或提交表单触发的验证中,有些情况不需要显示提示文字,如自定义弹出提示框的显示方式,不需要每次blur时就马上弹出提示; | 
|                  | 
|                 tiptype:1\2\3时都有坑能会弹出自定义提示框 | 
|                 tiptype:1时在triggered bycheck时不弹框 | 
|                 tiptype:2\3时在ajax时弹框 | 
|                 tipSweep为true时在triggered bycheck时不触发showmsg,但ajax出错的情况下要提示 | 
|             */ | 
|              | 
|             //如果msg为undefined,那么就没必要执行后面的操作,ignore有可能会出现这情况; | 
|             if(msg==undef){return;} | 
|              | 
|             //tipSweep为true,且当前不是处于错误状态时,blur事件不触发信息显示; | 
|             if(triggered=="bycheck" && o.sweep && (o.obj && !o.obj.is(".Validform_error") || typeof type == "function")){return;} | 
|   | 
|             $.extend(o,{curform:this}); | 
|                  | 
|             if(typeof type == "function"){ | 
|                 type(msg,o,Validform.util.cssctl); | 
|                 return; | 
|             } | 
|              | 
|             if(type==1 || triggered=="byajax" && type!=4){ | 
|                 msgobj.find(".Validform_info").html(msg); | 
|             } | 
|              | 
|             //tiptypt=1时,blur触发showmsg,验证是否通过都不弹框,提交表单触发的话,只要验证出错,就弹框; | 
|             if(type==1 && triggered!="bycheck" && o.type!=2 || triggered=="byajax" && type!=4){ | 
|                 msghidden=false; | 
|                 msgobj.find(".iframe").css("height",msgobj.outerHeight()); | 
|                 msgobj.show(); | 
|                 setCenter(msgobj,100); | 
|             } | 
|   | 
|             if(type==2 && o.obj){ | 
|                 o.obj.parent().next().find(".Validform_checktip").html(msg); | 
|                 Validform.util.cssctl(o.obj.parent().next().find(".Validform_checktip"),o.type); | 
|             } | 
|              | 
|             if((type==3 || type==4) && o.obj){ | 
|                 o.obj.siblings(".Validform_checktip").html(msg); | 
|                 Validform.util.cssctl(o.obj.siblings(".Validform_checktip"),o.type); | 
|             } | 
|   | 
|         }, | 
|   | 
|         cssctl:function(obj,status){ | 
|             switch(status){ | 
|                 case 1: | 
|                     obj.removeClass("Validform_right Validform_wrong").addClass("Validform_checktip Validform_loading");//checking; | 
|                     break; | 
|                 case 2: | 
|                     obj.removeClass("Validform_wrong Validform_loading").addClass("Validform_checktip Validform_right");//passed; | 
|                     break; | 
|                 case 4: | 
|                     obj.removeClass("Validform_right Validform_wrong Validform_loading").addClass("Validform_checktip");//for ignore; | 
|                     break; | 
|                 default: | 
|                     obj.removeClass("Validform_right Validform_loading").addClass("Validform_checktip Validform_wrong");//wrong; | 
|             } | 
|         }, | 
|          | 
|         check:function(curform,subpost,bool){ | 
|             /* | 
|                 检测单个表单元素; | 
|                 验证通过返回true,否则返回false、实时验证返回值为ajax; | 
|                 bool,传入true则只检测不显示提示信息; | 
|             */ | 
|             var settings=curform[0].settings; | 
|             var subpost=subpost || ""; | 
|             var inputval=Validform.util.getValue.call(curform,$(this)); | 
|              | 
|             //隐藏或绑定dataIgnore的表单对象不做验证; | 
|             if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){ | 
|                 return true; | 
|             } | 
|              | 
|             //dragonfly=true时,没有绑定ignore,值为空不做验证,但验证不通过; | 
|             if(settings.dragonfly && !$(this).data("cked") && Validform.util.isEmpty.call($(this),inputval) && $(this).attr("ignore")!="ignore"){ | 
|                 return false; | 
|             } | 
|              | 
|             var flag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this)); | 
|              | 
|             //值没变化不做检测,这时要考虑recheck情况; | 
|             //不是在提交表单时触发的ajax验证; | 
|             if(inputval==this.validform_lastval && !$(this).attr("recheck") && subpost==""){ | 
|                 return flag.passed ? true : false; | 
|             } | 
|   | 
|             this.validform_lastval=inputval;//存储当前值; | 
|              | 
|             var _this; | 
|             errorobj=_this=$(this); | 
|              | 
|             if(!flag.passed){ | 
|                 //取消正在进行的ajax验证; | 
|                 Validform.util.abort.call(_this[0]); | 
|                  | 
|                 if(!bool){ | 
|                     //传入"bycheck",指示当前是check方法里调用的,当tiptype=1时,blur事件不让触发错误信息显示; | 
|                     Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck"); | 
|                      | 
|                     !settings.tipSweep && _this.addClass("Validform_error"); | 
|                 } | 
|                 return false; | 
|             } | 
|              | 
|             //验证通过的话,如果绑定有ajaxurl,要执行ajax检测; | 
|             //当ignore="ignore"时,为空值可以通过验证,这时不需要ajax检测; | 
|             var ajaxurl=$(this).attr("ajaxurl"); | 
|             if(ajaxurl && !Validform.util.isEmpty.call($(this),inputval) && !bool){ | 
|                 var inputobj=$(this); | 
|   | 
|                 //当提交表单时,表单中的某项已经在执行ajax检测,这时需要让该项ajax结束后继续提交表单; | 
|                 if(subpost=="postform"){ | 
|                     inputobj[0].validform_subpost="postform"; | 
|                 }else{ | 
|                     inputobj[0].validform_subpost=""; | 
|                 } | 
|                  | 
|                 if(inputobj[0].validform_valid==="posting" && inputval==inputobj[0].validform_ckvalue){return "ajax";} | 
|                  | 
|                 inputobj[0].validform_valid="posting"; | 
|                 inputobj[0].validform_ckvalue=inputval; | 
|                 Validform.util.showmsg.call(curform,curform.data("tipmsg").c||tipmsg.c,settings.tiptype,{obj:inputobj,type:1,sweep:settings.tipSweep},"bycheck"); | 
|                  | 
|                 Validform.util.abort.call(_this[0]); | 
|                  | 
|                 var ajaxsetup=$.extend(true,{},settings.ajaxurl || {}); | 
|                                  | 
|                 var localconfig={ | 
|                     type: "POST", | 
|                     cache:false, | 
|                     url: ajaxurl, | 
|                     data: "param="+encodeURIComponent(inputval)+"&name="+encodeURIComponent($(this).attr("name")), | 
|                     success: function(data){ | 
|                         if($.trim(data.status)==="y"){ | 
|                             inputobj[0].validform_valid="true"; | 
|                             data.info && inputobj.attr("sucmsg",data.info); | 
|                             Validform.util.showmsg.call(curform,inputobj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r,settings.tiptype,{obj:inputobj,type:2,sweep:settings.tipSweep},"bycheck"); | 
|                             _this.removeClass("Validform_error"); | 
|                             errorobj=null; | 
|                             if(inputobj[0].validform_subpost=="postform"){ | 
|                                 curform.trigger("submit"); | 
|                             } | 
|                         }else{ | 
|                             inputobj[0].validform_valid=data.info; | 
|                             Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep}); | 
|                             _this.addClass("Validform_error"); | 
|                         } | 
|                         _this[0].validform_ajax=null; | 
|                     }, | 
|                     error: function(data){ | 
|                         if(data.status=="200"){ | 
|                             if(data.responseText=="y"){ | 
|                                 ajaxsetup.success({"status":"y"}); | 
|                             }else{ | 
|                                 ajaxsetup.success({"status":"n","info":data.responseText});     | 
|                             } | 
|                             return false; | 
|                         } | 
|                          | 
|                         //正在检测时,要检测的数据发生改变,这时要终止当前的ajax。不是这种情况引起的ajax错误,那么显示相关错误信息; | 
|                         if(data.statusText!=="abort"){ | 
|                             var msg="status: "+data.status+"; statusText: "+data.statusText; | 
|                          | 
|                             Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep}); | 
|                             _this.addClass("Validform_error"); | 
|                         } | 
|                          | 
|                         inputobj[0].validform_valid=data.statusText; | 
|                         _this[0].validform_ajax=null; | 
|                          | 
|                         //localconfig.error返回true表示还需要执行temp_err; | 
|                         return true; | 
|                     } | 
|                 } | 
|                  | 
|                 if(ajaxsetup.success){ | 
|                     var temp_suc=ajaxsetup.success; | 
|                     ajaxsetup.success=function(data){ | 
|                         localconfig.success(data); | 
|                         temp_suc(data,inputobj); | 
|                     } | 
|                 } | 
|                  | 
|                 if(ajaxsetup.error){ | 
|                     var temp_err=ajaxsetup.error; | 
|                     ajaxsetup.error=function(data){ | 
|                         //localconfig.error返回false表示不需要执行temp_err; | 
|                         localconfig.error(data) && temp_err(data,inputobj); | 
|                     }     | 
|                 } | 
|   | 
|                 ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"}); | 
|                 _this[0].validform_ajax=$.ajax(ajaxsetup); | 
|                  | 
|                 return "ajax"; | 
|             }else if(ajaxurl && Validform.util.isEmpty.call($(this),inputval)){ | 
|                 Validform.util.abort.call(_this[0]); | 
|                 _this[0].validform_valid="true"; | 
|             } | 
|              | 
|             if(!bool){ | 
|                 Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck"); | 
|                 _this.removeClass("Validform_error"); | 
|             } | 
|             errorobj=null; | 
|              | 
|             return true; | 
|          | 
|         }, | 
|          | 
|         submitForm:function(settings,flg,url,ajaxPost,sync){ | 
|             /* | 
|                 flg===true时跳过验证直接提交; | 
|                 ajaxPost==="ajaxPost"指示当前表单以ajax方式提交; | 
|             */ | 
|             var curform=this; | 
|              | 
|             //表单正在提交时点击提交按钮不做反应; | 
|             if(curform[0].validform_status==="posting"){return false;} | 
|              | 
|             //要求只能提交一次时; | 
|             if(settings.postonce && curform[0].validform_status==="posted"){return false;} | 
|              | 
|             var beforeCheck=settings.beforeCheck && settings.beforeCheck(curform); | 
|             if(beforeCheck===false){return false;} | 
|              | 
|             var flag=true, | 
|                 inflag; | 
|                  | 
|             curform.find("[datatype]").each(function(){ | 
|                 //跳过验证; | 
|                 if(flg){ | 
|                     return false; | 
|                 } | 
|                  | 
|                 //隐藏或绑定dataIgnore的表单对象不做验证; | 
|                 if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){ | 
|                     return true; | 
|                 } | 
|                  | 
|                 var inputval=Validform.util.getValue.call(curform,$(this)), | 
|                     _this; | 
|                 errorobj=_this=$(this); | 
|                  | 
|                 inflag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this)); | 
|                  | 
|                 if(!inflag.passed){ | 
|                     Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep}); | 
|                     _this.addClass("Validform_error"); | 
|                      | 
|                     if(!settings.showAllError){ | 
|                         _this.focus(); | 
|                         flag=false; | 
|                         return false; | 
|                     } | 
|                      | 
|                     flag && (flag=false); | 
|                     return true; | 
|                 } | 
|                  | 
|                 //当ignore="ignore"时,为空值可以通过验证,这时不需要ajax检测; | 
|                 if($(this).attr("ajaxurl") && !Validform.util.isEmpty.call($(this),inputval)){ | 
|                     if(this.validform_valid!=="true"){ | 
|                         var thisobj=$(this); | 
|                         Validform.util.showmsg.call(curform,curform.data("tipmsg").v||tipmsg.v,settings.tiptype,{obj:thisobj,type:3,sweep:settings.tipSweep}); | 
|                         _this.addClass("Validform_error"); | 
|                          | 
|                         thisobj.trigger("blur",["postform"]);//continue the form post; | 
|                          | 
|                         if(!settings.showAllError){ | 
|                             flag=false; | 
|                             return false; | 
|                         } | 
|                          | 
|                         flag && (flag=false); | 
|                         return true; | 
|                     } | 
|                 }else if($(this).attr("ajaxurl") && Validform.util.isEmpty.call($(this),inputval)){ | 
|                     Validform.util.abort.call(this); | 
|                     this.validform_valid="true"; | 
|                 } | 
|   | 
|                 Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep}); | 
|                 _this.removeClass("Validform_error"); | 
|                 errorobj=null; | 
|             }); | 
|              | 
|             if(settings.showAllError){ | 
|                 curform.find(".Validform_error:first").focus(); | 
|             } | 
|   | 
|             if(flag){ | 
|                 var beforeSubmit=settings.beforeSubmit && settings.beforeSubmit(curform); | 
|                 if(beforeSubmit===false){return false;} | 
|                  | 
|                 curform[0].validform_status="posting"; | 
|                              | 
|                 if(settings.ajaxPost || ajaxPost==="ajaxPost"){ | 
|                     //获取配置参数; | 
|                     var ajaxsetup=$.extend(true,{},settings.ajaxpost || {}); | 
|                     //有可能需要动态的改变提交地址,所以把action所指定的url层级设为最低; | 
|                     ajaxsetup.url=url || ajaxsetup.url || settings.url || curform.attr("action"); | 
|                      | 
|                     //byajax:ajax时,tiptye为1、2或3需要弹出提示框; | 
|                     Validform.util.showmsg.call(curform,curform.data("tipmsg").p||tipmsg.p,settings.tiptype,{obj:curform,type:1,sweep:settings.tipSweep},"byajax"); | 
|   | 
|                     //方法里的优先级要高; | 
|                     //有undefined情况; | 
|                     if(sync){ | 
|                         ajaxsetup.async=false; | 
|                     }else if(sync===false){ | 
|                         ajaxsetup.async=true; | 
|                     } | 
|                      | 
|                     if(ajaxsetup.success){ | 
|                         var temp_suc=ajaxsetup.success; | 
|                         ajaxsetup.success=function(data){ | 
|                             settings.callback && settings.callback(data); | 
|                             curform[0].validform_ajax=null; | 
|                             if($.trim(data.status)==="y"){ | 
|                                 curform[0].validform_status="posted"; | 
|                             }else{ | 
|                                 curform[0].validform_status="normal"; | 
|                             } | 
|                              | 
|                             temp_suc(data,curform); | 
|                         } | 
|                     } | 
|                      | 
|                     if(ajaxsetup.error){ | 
|                         var temp_err=ajaxsetup.error; | 
|                         ajaxsetup.error=function(data){ | 
|                             settings.callback && settings.callback(data); | 
|                             curform[0].validform_status="normal"; | 
|                             curform[0].validform_ajax=null; | 
|                              | 
|                             temp_err(data,curform); | 
|                         }     | 
|                     } | 
|                      | 
|                     var localconfig={ | 
|                         type: "POST", | 
|                         async:true, | 
|                         data: curform.serializeArray(), | 
|                         success: function(data){ | 
|                             if($.trim(data.status)==="y"){ | 
|                                 //成功提交; | 
|                                 curform[0].validform_status="posted"; | 
|                                 Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:2,sweep:settings.tipSweep},"byajax"); | 
|                             }else{ | 
|                                 //提交出错; | 
|                                 curform[0].validform_status="normal"; | 
|                                 Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax"); | 
|                             } | 
|                              | 
|                             settings.callback && settings.callback(data); | 
|                             curform[0].validform_ajax=null; | 
|                         }, | 
|                         error: function(data){ | 
|                             var msg="status: "+data.status+"; statusText: "+data.statusText; | 
|                                      | 
|                             Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax"); | 
|                              | 
|                             settings.callback && settings.callback(data); | 
|                             curform[0].validform_status="normal"; | 
|                             curform[0].validform_ajax=null; | 
|                         } | 
|                     } | 
|                      | 
|                     ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"}); | 
|                      | 
|                     curform[0].validform_ajax=$.ajax(ajaxsetup); | 
|   | 
|                 }else{ | 
|                     if(!settings.postonce){ | 
|                         curform[0].validform_status="normal"; | 
|                     } | 
|                      | 
|                     var url=url || settings.url; | 
|                     if(url){ | 
|                         curform.attr("action",url); | 
|                     } | 
|                      | 
|                     return settings.callback && settings.callback(curform); | 
|                 } | 
|             } | 
|              | 
|             return false; | 
|              | 
|         }, | 
|          | 
|         resetForm:function(){ | 
|             var brothers=this; | 
|             brothers.each(function(){ | 
|                 this.reset && this.reset(); | 
|                 this.validform_status="normal"; | 
|             }); | 
|              | 
|             brothers.find(".Validform_right").text(""); | 
|             brothers.find(".passwordStrength").children().removeClass("bgStrength"); | 
|             brothers.find(".Validform_checktip").removeClass("Validform_wrong Validform_right Validform_loading").html(""); | 
|             brothers.find(".Validform_error").removeClass("Validform_error"); | 
|             brothers.find("[datatype]").removeData("cked").removeData("dataIgnore").each(function(){ | 
|                 this.validform_lastval=null; | 
|             }); | 
|             brothers.eq(0).find("input:first").focus(); | 
|         }, | 
|          | 
|         abort:function(){ | 
|             if(this.validform_ajax){ | 
|                 this.validform_ajax.abort();     | 
|             } | 
|         } | 
|          | 
|     } | 
|      | 
|     $.Datatype=Validform.util.dataType; | 
|      | 
|     Validform.prototype={ | 
|         dataType:Validform.util.dataType, | 
|          | 
|         eq:function(n){ | 
|             var obj=this; | 
|              | 
|             if(n>=obj.forms.length){ | 
|                 return null;     | 
|             } | 
|              | 
|             if(!(n in obj.objects)){ | 
|                 obj.objects[n]=new Validform($(obj.forms[n]).get(),{},true); | 
|             } | 
|              | 
|             return obj.objects[n]; | 
|   | 
|         }, | 
|          | 
|         resetStatus:function(){ | 
|             var obj=this; | 
|             $(obj.forms).each(function(){ | 
|                 this.validform_status="normal";     | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         setStatus:function(status){ | 
|             var obj=this; | 
|             $(obj.forms).each(function(){ | 
|                 this.validform_status=status || "posting";     | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         getStatus:function(){ | 
|             var obj=this; | 
|             var status=$(obj.forms)[0].validform_status; | 
|              | 
|             return status; | 
|         }, | 
|          | 
|         ignore:function(selector){ | 
|             var obj=this; | 
|             var selector=selector || "[datatype]" | 
|              | 
|             $(obj.forms).find(selector).each(function(){ | 
|                 $(this).data("dataIgnore","dataIgnore").removeClass("Validform_error"); | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         unignore:function(selector){ | 
|             var obj=this; | 
|             var selector=selector || "[datatype]" | 
|              | 
|             $(obj.forms).find(selector).each(function(){ | 
|                 $(this).removeData("dataIgnore"); | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         addRule:function(rule){ | 
|             /* | 
|                 rule => [{ | 
|                     ele:"#id", | 
|                     datatype:"*", | 
|                     errormsg:"出错提示文字!", | 
|                     nullmsg:"为空时的提示文字!", | 
|                     tip:"默认显示的提示文字", | 
|                     altercss:"gray", | 
|                     ignore:"ignore", | 
|                     ajaxurl:"valid.php", | 
|                     recheck:"password", | 
|                     plugin:"passwordStrength" | 
|                 },{},{},...] | 
|             */ | 
|             var obj=this; | 
|             var rule=rule || []; | 
|              | 
|             for(var index=0; index<rule.length; index++){ | 
|                 var o=$(obj.forms).find(rule[index].ele); | 
|                 for(var attr in rule[index]){ | 
|                     attr !=="ele" && o.attr(attr,rule[index][attr]); | 
|                 } | 
|             } | 
|              | 
|             $(obj.forms).each(function(){ | 
|                 var $this=$(this); | 
|                 Validform.util.enhance.call($this,this.settings.tiptype,this.settings.usePlugin,this.settings.tipSweep,"addRule"); | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         ajaxPost:function(flag,sync,url){ | 
|             var obj=this; | 
|              | 
|             $(obj.forms).each(function(){ | 
|                 //创建pop box; | 
|                 if( this.settings.tiptype==1 || this.settings.tiptype==2 || this.settings.tiptype==3 ){ | 
|                     creatMsgbox(); | 
|                 } | 
|                  | 
|                 Validform.util.submitForm.call($(obj.forms[0]),this.settings,flag,url,"ajaxPost",sync); | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         submitForm:function(flag,url){ | 
|             /*flag===true时不做验证直接提交*/ | 
|              | 
|   | 
|             var obj=this; | 
|              | 
|             $(obj.forms).each(function(){ | 
|                 var subflag=Validform.util.submitForm.call($(this),this.settings,flag,url); | 
|                 subflag === undef && (subflag=true); | 
|                 if(subflag===true){ | 
|                     this.submit(); | 
|                 } | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         resetForm:function(){ | 
|             var obj=this; | 
|             Validform.util.resetForm.call($(obj.forms)); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         abort:function(){ | 
|             var obj=this; | 
|             $(obj.forms).each(function(){ | 
|                 Validform.util.abort.call(this); | 
|             }); | 
|              | 
|             return this; | 
|         }, | 
|          | 
|         check:function(bool,selector){ | 
|             /* | 
|                 bool:传入true,只检测不显示提示信息; | 
|             */ | 
|              | 
|             var selector=selector || "[datatype]", | 
|                 obj=this, | 
|                 curform=$(obj.forms), | 
|                 flag=true; | 
|              | 
|             curform.find(selector).each(function(){ | 
|                 Validform.util.check.call(this,curform,"",bool) || (flag=false); | 
|             }); | 
|              | 
|             return flag; | 
|         }, | 
|          | 
|         config:function(setup){ | 
|         /* | 
|             config={ | 
|                 url:"ajaxpost.php",//指定了url后,数据会提交到这个地址; | 
|                 ajaxurl:{ | 
|                     timeout:1000, | 
|                     ... | 
|                 }, | 
|                 ajaxpost:{ | 
|                     timeout:1000, | 
|                     ... | 
|                 } | 
|             } | 
|         */ | 
|             var obj=this; | 
|             setup=setup || {}; | 
|             $(obj.forms).each(function(){ | 
|                 var $this=$(this); | 
|                 this.settings=$.extend(true,this.settings,setup); | 
|                 Validform.util.enhance.call($this,this.settings.tiptype,this.settings.usePlugin,this.settings.tipSweep); | 
|             }); | 
|              | 
|             return this; | 
|         } | 
|     } | 
|   | 
|     $.fn.Validform=function(settings){ | 
|         return new Validform(this,settings); | 
|     }; | 
|      | 
|     function setCenter(obj,time){ | 
|         var left=($(window).width()-obj.outerWidth())/2, | 
|             top=($(window).height()-obj.outerHeight())/2, | 
|              | 
|         top=(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+(top>0?top:0); | 
|   | 
|         obj.css({ | 
|             left:left | 
|         }).animate({ | 
|             top : top | 
|         },{ duration:time , queue:false }); | 
|     } | 
|      | 
|     function creatMsgbox(){ | 
|         if($("#Validform_msg").length!==0){return false;} | 
|         msgobj=$('<div id="Validform_msg"><div class="Validform_title">'+tipmsg.tit+'<a class="Validform_close" href="javascript:void(0);">χ</a></div><div class="Validform_info"></div><div class="iframe"><iframe frameborder="0" scrolling="no" height="100%" width="100%"></iframe></div></div>').appendTo("body");//提示信息框; | 
|         msgobj.find("a.Validform_close").click(function(){ | 
|             msgobj.hide(); | 
|             msghidden=true; | 
|             if(errorobj){ | 
|                 errorobj.focus().addClass("Validform_error"); | 
|             } | 
|             return false; | 
|         }).focus(function(){this.blur();}); | 
|   | 
|         $(window).bind("scroll resize",function(){ | 
|             !msghidden && setCenter(msgobj,400); | 
|         }); | 
|     }; | 
|      | 
|     //公用方法显示&关闭信息提示框; | 
|     $.Showmsg=function(msg){ | 
|         creatMsgbox(); | 
|         Validform.util.showmsg.call(win,msg,1,{}); | 
|     }; | 
|      | 
|     $.Hidemsg=function(){ | 
|         msgobj.hide(); | 
|         msghidden=true; | 
|     }; | 
|      | 
| })(jQuery,window); |