/*! 

  * jQuery Validation Plugin 1.11.1 

  * 

  * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ 

  * http://docs.jquery.com/Plugins/Validation 

  * 

  * Copyright 2013 Jörn Zaefferer 

  * Released under the MIT license: 

  *   http://www.opensource.org/licenses/mit-license.php 

  */ 



 (function($) { 



     $.extend($.fn, { 

         // http://docs.jquery.com/Plugins/Validation/validate 

         validate: function(options) { 



             // if nothing is selected, return nothing; can't chain anyway 

             if (!this.length) { 

                 if (options && options.debug && window.console) { 

                     console.warn("Nothing selected, can't validate, returning nothing."); 

                 } 

                 return; 

             } 



             // check if a validator for this form was already created 

             var validator = $.data(this[0], "validator"); 

             if (validator) { 

                 return validator; 

             } 



             // Add novalidate tag if HTML5. 

             this.attr("novalidate", "novalidate"); 



             validator = new $.validator(options, this[0]); 

             $.data(this[0], "validator", validator); 



             if (validator.settings.onsubmit) { 



                 this.validateDelegate(":submit", "click", function(event) { 

                     if (validator.settings.submitHandler) { 

                         validator.submitButton = event.target; 

                     } 

                     // allow suppressing validation by adding a cancel class to the submit button 

                     if ($(event.target).hasClass("cancel")) { 

                         validator.cancelSubmit = true; 

                     } 



                     // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button 

                     if ($(event.target).attr("formnovalidate") !== undefined) { 

                         validator.cancelSubmit = true; 

                     } 

                 }); 



                 // validate the form on submit 

                 this.submit(function(event) { 

                     if (validator.settings.debug) { 

                         // prevent form submit to be able to see console output 

                         event.preventDefault(); 

                     } 



                     function handle() { 

                         var hidden; 

                         if (validator.settings.submitHandler) { 

                             if (validator.submitButton) { 

                                 // insert a hidden input as a replacement for the missing submit button 

                                 hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val($(validator.submitButton).val()).appendTo(validator.currentForm); 

                             } 

                             validator.settings.submitHandler.call(validator, validator.currentForm, event); 

                             if (validator.submitButton) { 

                                 // and clean up afterwards; thanks to no-block-scope, hidden can be referenced 

                                 hidden.remove(); 

                             } 

                             return false; 

                         } 

                         return true; 

                     } 



                     // prevent submit for invalid forms or custom submit handlers 

                     if (validator.cancelSubmit) { 

                         validator.cancelSubmit = false; 

                         return handle(); 

                     } 

                     if (validator.form()) { 

                         if (validator.pendingRequest) { 

                             validator.formSubmitted = true; 

                             return false; 

                         } 

                         return handle(); 

                     } else { 

                         validator.focusInvalid(); 

                         return false; 

                     } 

                 }); 

             } 



             return validator; 

         }, 

         // http://docs.jquery.com/Plugins/Validation/valid 

         valid: function() { 

             if ($(this[0]).is("form")) { 

                 return this.validate().form(); 

             } else { 

                 var valid = true; 

                 var validator = $(this[0].form).validate(); 

                 this.each(function() { 

                     valid = valid && validator.element(this); 

                 }); 

                 return valid; 

             } 

         }, 

         // attributes: space seperated list of attributes to retrieve and remove 

         removeAttrs: function(attributes) { 

             var result = {}, 

                 $element = this; 

             $.each(attributes.split(/\s/), function(index, value) { 

                 result[value] = $element.attr(value); 

                 $element.removeAttr(value); 

             }); 

             return result; 

         }, 

         // http://docs.jquery.com/Plugins/Validation/rules 

         rules: function(command, argument) { 

             var element = this[0]; 



             if (command) { 

                 var settings = $.data(element.form, "validator").settings; 

                 var staticRules = settings.rules; 

                 var existingRules = $.validator.staticRules(element); 

                 switch (command) { 

                     case "add": 

                         $.extend(existingRules, $.validator.normalizeRule(argument)); 

                         // remove messages from rules, but allow them to be set separetely 

                         delete existingRules.messages; 

                         staticRules[element.name] = existingRules; 

                         if (argument.messages) { 

                             settings.messages[element.name] = $.extend(settings.messages[element.name], argument.messages); 

                         } 

                         break; 

                     case "remove": 

                         if (!argument) { 

                             delete staticRules[element.name]; 

                             return existingRules; 

                         } 

                         var filtered = {}; 

                         $.each(argument.split(/\s/), function(index, method) { 

                             filtered[method] = existingRules[method]; 

                             delete existingRules[method]; 

                         }); 

                         return filtered; 

                 } 

             } 



             var data = $.validator.normalizeRules( 

                 $.extend({}, 

                     $.validator.classRules(element), 

                     $.validator.attributeRules(element), 

                     $.validator.dataRules(element), 

                     $.validator.staticRules(element) 

                 ), element); 



             // make sure required is at front 

             if (data.required) { 

                 var param = data.required; 

                 delete data.required; 

                 data = $.extend({ 

                     required: param 

                 }, data); 

             } 



             return data; 

         } 

     }); 



     // Custom selectors 

     $.extend($.expr[":"], { 

         // http://docs.jquery.com/Plugins/Validation/blank 

         blank: function(a) { 

             return !$.trim("" + $(a).val()); 

         }, 

         // http://docs.jquery.com/Plugins/Validation/filled 

         filled: function(a) { 

             return !!$.trim("" + $(a).val()); 

         }, 

         // http://docs.jquery.com/Plugins/Validation/unchecked 

         unchecked: function(a) { 

             return !$(a).prop("checked"); 

         } 

     }); 



     // constructor for validator 

     $.validator = function(options, form) { 

         this.settings = $.extend(true, {}, $.validator.defaults, options); 

         this.currentForm = form; 

         this.init(); 

     }; 



     $.validator.format = function(source, params) { 

         if (arguments.length === 1) { 

             return function() { 

                 var args = $.makeArray(arguments); 

                 args.unshift(source); 

                 return $.validator.format.apply(this, args); 

             }; 

         } 

         if (arguments.length > 2 && params.constructor !== Array) { 

             params = $.makeArray(arguments).slice(1); 

         } 

         if (params.constructor !== Array) { 

             params = [params]; 

         } 

         $.each(params, function(i, n) { 

             source = source.replace(new RegExp("\\{" + i + "\\}", "g"), function() { 

                 return n; 

             }); 

         }); 

         return source; 

     }; 



     $.extend($.validator, { 



         defaults: { 

             messages: {}, 

             groups: {}, 

             rules: {}, 

             errorClass: "error", 

             validClass: "valid", 

             errorElement: "label", 

             focusInvalid: true, 

             errorContainer: $([]), 

             errorLabelContainer: $([]), 

             onsubmit: true, 

             ignore: ":hidden", 

             ignoreTitle: false, 

             onfocusin: function(element, event) { 

                 this.lastActive = element; 



                 // hide error label and remove error class on focus if enabled 

                 if (this.settings.focusCleanup && !this.blockFocusCleanup) { 

                     if (this.settings.unhighlight) { 

                         this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass); 

                     } 

                     this.addWrapper(this.errorsFor(element)).hide(); 

                 } 

             }, 

             onfocusout: function(element, event) { 

                 if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) { 

                     this.element(element); 

                 } 

             }, 

             onkeyup: function(element, event) { 

                 if (event.which === 9 && this.elementValue(element) === "") { 

                     return; 

                 } else if (element.name in this.submitted || element === this.lastElement) { 

                     this.element(element); 

                 } 

             }, 

             onclick: function(element, event) { 

                 // click on selects, radiobuttons and checkboxes 

                 if (element.name in this.submitted) { 

                     this.element(element); 

                 } 

                 // or option elements, check parent select in that case 

                 else if (element.parentNode.name in this.submitted) { 

                     this.element(element.parentNode); 

                 } 

             }, 

             highlight: function(element, errorClass, validClass) { 

                 if (element.type === "radio") { 

                     this.findByName(element.name).addClass(errorClass).removeClass(validClass); 

                 } else { 

                     $(element).addClass(errorClass).removeClass(validClass); 

                 } 

             }, 

             unhighlight: function(element, errorClass, validClass) { 

                 if (element.type === "radio") { 

                     this.findByName(element.name).removeClass(errorClass).addClass(validClass); 

                 } else { 

                     $(element).removeClass(errorClass).addClass(validClass); 

                 } 

             } 

         }, 



         // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults 

         setDefaults: function(settings) { 

             $.extend($.validator.defaults, settings); 

         }, 



         messages: { 

             required: "必选字段", 

             remote: "您输入的值已经存在,请重新输入", 

             email: "请输入正确格式的电子邮件", 

             url: "请输入合法的网址", 

             date: "请输入合法的日期", 

             dateISO: "请输入合法的日期 (ISO).", 

             number: "请输入合法的数字", 

             digits: "只能输入整数", 

             digital: "只能输入数字和小数点", 

             creditcard: "请输入合法的信用卡号", 

             equalTo: "请再次输入相同的值", 

             notEqualTo: $.validator.format("不能输入与 {0} 相同的值"), 

             accept: "请输入拥有合法后缀名的字符串", 

             maxlength: $.validator.format("请输入一个长度最多是 {0} 的字符串"), 

             maxCharCodelength:$.validator.format("请输入一个长度最多是 {0} 的字符"), 

             minlength: $.validator.format("请输入一个长度最少是 {0} 的字符串"), 

             rangelength: $.validator.format("请输入一个长度介于 {0} 和 {1} 之间的字符串"), 

             range: $.validator.format("请输入一个介于 {0} 和 {1} 之间的值"), 

             max: $.validator.format("请输入一个最大为 {0} 的值"), 

             min: $.validator.format("请输入一个最小为 {0} 的值"), 

             idCard: "请输入正确的身份证号码", 

             useName: "用户名只能包括中文字、英文字母、数字和下划线", 

             mobile: "请输入正确的手机号码", 

             tel: "请输入正确的电话号码", 

             contact: "请输入正确的手机号或电话号码", 

             fax: "请输入正确传真号码", 

             zipCode: "请输入正确的邮政编码", 

             dateTime: "请输入正确的时间格式:YYYY-MM-DD HH:MM:SS", 

             compareDate: "结束日期必须大于开始日期", 

             splitMaxlength: $.validator.format("最大值不能大于 {0} 个"), 

             splitMinlength: $.validator.format("最小值不能小于 {0} 个"), 

             filetype: "上传的文件类型不允许", 

             inputBox:"只允许输入 数字、字母、连接符、下划线的组合", 

             hex: "只允许输入0-F的四位字符", 

             letterAndNumber: "必须包含字母+数字", 

             specialCharacters: "不能包含特殊字符", 

             only: "你输入的值有重复,请重新输入" 

         }, 



         autoCreateRanges: false, 



         prototype: { 



             init: function() { 

                 this.labelContainer = $(this.settings.errorLabelContainer); 

                 this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); 

                 this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer); 

                 this.submitted = {}; 

                 this.valueCache = {}; 

                 this.pendingRequest = 0; 

                 this.pending = {}; 

                 this.invalid = {}; 

                 this.reset(); 



                 var groups = (this.groups = {}); 

                 $.each(this.settings.groups, function(key, value) { 

                     if (typeof value === "string") { 

                         value = value.split(/\s/); 

                     } 

                     $.each(value, function(index, name) { 

                         groups[name] = key; 

                     }); 

                 }); 

                 var rules = this.settings.rules; 

                 $.each(rules, function(key, value) { 

                     rules[key] = $.validator.normalizeRule(value); 

                 }); 



                 function delegate(event) { 

                     var validator = $.data(this[0].form, "validator"), 

                         eventType = "on" + event.type.replace(/^validate/, ""); 

                     if (validator.settings[eventType]) { 

                         validator.settings[eventType].call(validator, this[0], event); 

                     } 

                 } 

                 $(this.currentForm) 

                     .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + 

                         "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + 

                         "[type='email'], [type='datetime'], [type='date'], [type='month'], " + 

                         "[type='week'], [type='time'], [type='datetime-local'], " + 

                         "[type='range'], [type='color'] ", 

                         "focusin focusout keyup", delegate) 

                     .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); 



                 if (this.settings.invalidHandler) { 

                     $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); 

                 } 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Validator/form 

             form: function() { 

                 this.checkForm(); 

                 $.extend(this.submitted, this.errorMap); 

                 this.invalid = $.extend({}, this.errorMap); 

                 if (!this.valid()) { 

                     $(this.currentForm).triggerHandler("invalid-form", [this]); 

                 } 

                 this.showErrors(); 

                 return this.valid(); 

             }, 



             checkForm: function() { 

                 this.prepareForm(); 

                 for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) { 

                     this.check(elements[i]); 

                 } 

                 return this.valid(); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Validator/element 

             element: function(element) { 

                 element = this.validationTargetFor(this.clean(element)); 

                 this.lastElement = element; 

                 this.prepareElement(element); 

                 this.currentElements = $(element); 

                 var result = this.check(element) !== false; 

                 if (result) { 

                     delete this.invalid[element.name]; 

                 } else { 

                     this.invalid[element.name] = true; 

                 } 

                 if (!this.numberOfInvalids()) { 

                     // Hide error containers on last error 

                     this.toHide = this.toHide.add(this.containers); 

                 } 

                 this.showErrors(); 

                 return result; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Validator/showErrors 

             showErrors: function(errors) { 

                 if (errors) { 

                     // add items to error list and map 

                     $.extend(this.errorMap, errors); 

                     this.errorList = []; 

                     for (var name in errors) { 

                         this.errorList.push({ 

                             message: errors[name], 

                             element: this.findByName(name)[0] 

                         }); 

                     } 

                     // remove items from success list 

                     this.successList = $.grep(this.successList, function(element) { 

                         return !(element.name in errors); 

                     }); 

                 } 

                 if (this.settings.showErrors) { 

                     this.settings.showErrors.call(this, this.errorMap, this.errorList); 

                 } else { 

                     this.defaultShowErrors(); 

                 } 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Validator/resetForm 

             resetForm: function() { 

                 if ($.fn.resetForm) { 

                     $(this.currentForm).resetForm(); 

                 } 

                 this.submitted = {}; 

                 this.lastElement = null; 

                 this.prepareForm(); 

                 this.hideErrors(); 

                 this.elements().removeClass(this.settings.errorClass).removeData("previousValue"); 

             }, 



             numberOfInvalids: function() { 

                 return this.objectLength(this.invalid); 

             }, 



             objectLength: function(obj) { 

                 var count = 0; 

                 for (var i in obj) { 

                     count++; 

                 } 

                 return count; 

             }, 



             hideErrors: function() { 

                 this.addWrapper(this.toHide).hide(); 

             }, 



             valid: function() { 

                 return this.size() === 0; 

             }, 



             size: function() { 

                 return this.errorList.length; 

             }, 



             focusInvalid: function() { 

                 if (this.settings.focusInvalid) { 

                     try { 

                         $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) 

                             .filter(":visible") 

                             .focus() 

                         // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find 

                         .trigger("focusin"); 

                     } catch (e) { 

                         // ignore IE throwing errors when focusing hidden elements 

                     } 

                 } 

             }, 



             findLastActive: function() { 

                 var lastActive = this.lastActive; 

                 return lastActive && $.grep(this.errorList, function(n) { 

                     return n.element.name === lastActive.name; 

                 }).length === 1 && lastActive; 

             }, 



             elements: function() { 

                 var validator = this, 

                     rulesCache = {}; 



                 // select all valid inputs inside the form (no submit or reset buttons) 

                 return $(this.currentForm) 

                     .find("input, select, textarea") 

                     .not(":submit, :reset, :image, [disabled]") 

                     .not(this.settings.ignore) 

                     .filter(function() { 

                         if (!this.name && validator.settings.debug && window.console) { 

                             console.error("%o has no name assigned", this); 

                         } 



                         // select only the first element for each name, and only those with rules specified 

                         if (this.name in rulesCache || !validator.objectLength($(this).rules())) { 

                             return false; 

                         } 



                         rulesCache[this.name] = true; 

                         return true; 

                     }); 

             }, 



             clean: function(selector) { 

                 return $(selector)[0]; 

             }, 



             errors: function() { 

                 var errorClass = this.settings.errorClass.replace(" ", "."); 

                 return $(this.settings.errorElement + "." + errorClass, this.errorContext); 

             }, 



             reset: function() { 

                 this.successList = []; 

                 this.errorList = []; 

                 this.errorMap = {}; 

                 this.toShow = $([]); 

                 this.toHide = $([]); 

                 this.currentElements = $([]); 

             }, 



             prepareForm: function() { 

                 this.reset(); 

                 this.toHide = this.errors().add(this.containers); 

             }, 



             prepareElement: function(element) { 

                 this.reset(); 

                 this.toHide = this.errorsFor(element); 

             }, 



             elementValue: function(element) { 

                 var type = $(element).attr("type"), 

                     val = $(element).val(); 



                 if (type === "radio" || type === "checkbox") { 

                     return $("input[name='" + $(element).attr("name") + "']:checked").val(); 

                 } 



                 if (typeof val === "string") { 

                     return val.replace(/\r/g, ""); 

                 } 

                 return val; 

             }, 



             check: function(element) { 

                 element = this.validationTargetFor(this.clean(element)); 



                 var rules = $(element).rules(); 

                 var dependencyMismatch = false; 

                 var val = this.elementValue(element); 

                 var result; 



                 for (var method in rules) { 

                     var rule = { 

                         method: method, 

                         parameters: rules[method] 

                     }; 

                     try { 



                         result = $.validator.methods[method].call(this, val, element, rule.parameters); 



                         // if a method indicates that the field is optional and therefore valid, 

                         // don't mark it as valid when there are no other rules 

                         if (result === "dependency-mismatch") { 

                             dependencyMismatch = true; 

                             continue; 

                         } 

                         dependencyMismatch = false; 



                         if (result === "pending") { 

                             this.toHide = this.toHide.not(this.errorsFor(element)); 

                             return; 

                         } 



                         if (!result) { 

                             this.formatAndAdd(element, rule); 

                             return false; 

                         } 

                     } catch (e) { 

                         if (this.settings.debug && window.console) { 

                             console.log("Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e); 

                         } 

                         throw e; 

                     } 

                 } 

                 if (dependencyMismatch) { 

                     return; 

                 } 

                 if (this.objectLength(rules)) { 

                     this.successList.push(element); 

                 } 

                 return true; 

             }, 



             // return the custom message for the given element and validation method 

             // specified in the element's HTML5 data attribute 

             customDataMessage: function(element, method) { 

                 return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); 

             }, 



             // return the custom message for the given element name and validation method 

             customMessage: function(name, method) { 

                 var m = this.settings.messages[name]; 

                 return m && (m.constructor === String ? m : m[method]); 

             }, 



             // return the first defined argument, allowing empty strings 

             findDefined: function() { 

                 for (var i = 0; i < arguments.length; i++) { 

                     if (arguments[i] !== undefined) { 

                         return arguments[i]; 

                     } 

                 } 

                 return undefined; 

             }, 



             defaultMessage: function(element, method) { 

                 return this.findDefined( 

                     this.customMessage(element.name, method), 

                     this.customDataMessage(element, method), 

                     // title is never undefined, so handle empty string as undefined 

                     !this.settings.ignoreTitle && element.title || undefined, 

                     $.validator.messages[method], 

                     "<strong>Warning: No message defined for " + element.name + "</strong>" 

                 ); 

             }, 



             formatAndAdd: function(element, rule) { 

                 var message = this.defaultMessage(element, rule.method), 

                     theregex = /\$?\{(\d+)\}/g; 

                 if (typeof message === "function") { 

                     message = message.call(this, rule.parameters, element); 

                 } else if (theregex.test(message)) { 

                     message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); 

                 } 

                 this.errorList.push({ 

                     message: message, 

                     element: element 

                 }); 



                 this.errorMap[element.name] = message; 

                 this.submitted[element.name] = message; 

             }, 



             addWrapper: function(toToggle) { 

                 if (this.settings.wrapper) { 

                     toToggle = toToggle.add(toToggle.parent(this.settings.wrapper)); 

                 } 

                 return toToggle; 

             }, 



             defaultShowErrors: function() { 

                 var i, elements; 

                 for (i = 0; this.errorList[i]; i++) { 

                     var error = this.errorList[i]; 

                     if (this.settings.highlight) { 

                         this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass); 

                     } 

                     this.showLabel(error.element, error.message); 

                 } 

                 if (this.errorList.length) { 

                     this.toShow = this.toShow.add(this.containers); 

                 } 

                 if (this.settings.success) { 

                     for (i = 0; this.successList[i]; i++) { 

                         this.showLabel(this.successList[i]); 

                     } 

                 } 

                 if (this.settings.unhighlight) { 

                     for (i = 0, elements = this.validElements(); elements[i]; i++) { 

                         this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass); 

                     } 

                 } 

                 this.toHide = this.toHide.not(this.toShow); 

                 this.hideErrors(); 

                 this.addWrapper(this.toShow).show(); 

             }, 



             validElements: function() { 

                 return this.currentElements.not(this.invalidElements()); 

             }, 



             invalidElements: function() { 

                 return $(this.errorList).map(function() { 

                     return this.element; 

                 }); 

             }, 



             showLabel: function(element, message) { 

                 var label = this.errorsFor(element); 

                 if (label.length) { 

                     // refresh error/success class 

                     label.removeClass(this.settings.validClass).addClass(this.settings.errorClass); 

                     // replace message on existing label 

                     label.html(message); 

                 } else { 

                     // create label 

                     label = $("<" + this.settings.errorElement + ">") 

                         .attr("for", this.idOrName(element)) 

                         .addClass('validate-text ' + this.settings.errorClass) 

                         .html(message || ""); 

                     if (this.settings.wrapper) { 

                         // make sure the element is visible, even in IE 

                         // actually showing the wrapped element is handled elsewhere 

                         label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); 

                     } 

                     if (!this.labelContainer.append(label).length) { 

                         if (this.settings.errorPlacement) { 

                             this.settings.errorPlacement(label, $(element)); 

                         } else { 

                             var parentElement = $(element).parent(); 

                             if ($(element).parent().hasClass('datebox') || $(element).parent().is('LABEL')) { 

                                 parentElement = $(element).parent().parent(); 

                             } 

                             label.appendTo(parentElement); 

                         } 

                     } 

                 } 

                 if (!message && this.settings.success) { 

                     label.text(""); 

                     if (typeof this.settings.success === "string") { 

                         label.addClass(this.settings.success); 

                     } else { 

                         this.settings.success(label, element); 

                     } 

                 } 

                 this.toShow = this.toShow.add(label); 

             }, 



             errorsFor: function(element) { 

                 var name = this.idOrName(element); 

                 return this.errors().filter(function() { 

                     return $(this).attr("for") === name; 

                 }); 

             }, 



             idOrName: function(element) { 

                 return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); 

             }, 



             validationTargetFor: function(element) { 

                 // if radio/checkbox, validate first element in group instead 

                 if (this.checkable(element)) { 

                     element = this.findByName(element.name).not(this.settings.ignore)[0]; 

                 } 

                 return element; 

             }, 



             checkable: function(element) { 

                 return (/radio|checkbox/i).test(element.type); 

             }, 



             findByName: function(name) { 

                 return $(this.currentForm).find("[name='" + name + "']"); 

             }, 



             getLength: function(value, element) { 

                 switch (element.nodeName.toLowerCase()) { 

                     case "select": 

                         return $("option:selected", element).length; 

                     case "input": 

                         if (this.checkable(element)) { 

                             return this.findByName(element.name).filter(":checked").length; 

                         } 

                 } 

                 return value.length; 

             }, 

              

             getCharCodeLength:function(value,element){ 

             
var realLength = 0,  

             
 
len = value.length,  

             
 
charCode = -1; 

        
  for (var i = 0; i < len; i++) { 

        
     charCode = value.charCodeAt(i); 

        
     if (charCode >= 0 && charCode <= 128) { 

        
      
 realLength += 1; 

        
     }else{ 

        
      
 realLength += 2; 

        
     } 

        
  } 

       
   
  return realLength; 

  
}, 



             depend: function(param, element) { 

                 return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; 

             }, 



             dependTypes: { 

                 "boolean": function(param, element) { 

                     return param; 

                 }, 

                 "string": function(param, element) { 

                     return !!$(param, element.form).length; 

                 }, 

                 "function": function(param, element) { 

                     return param(element); 

                 } 

             }, 



             optional: function(element) { 

                 var val = this.elementValue(element); 

                 return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; 

             }, 



             startRequest: function(element) { 

                 if (!this.pending[element.name]) { 

                     this.pendingRequest++; 

                     this.pending[element.name] = true; 

                 } 

             }, 



             stopRequest: function(element, valid) { 

                 this.pendingRequest--; 

                 // sometimes synchronization fails, make sure pendingRequest is never < 0 

                 if (this.pendingRequest < 0) { 

                     this.pendingRequest = 0; 

                 } 

                 delete this.pending[element.name]; 

                 if (valid && this.pendingRequest === 0 && this.formSubmitted && this.form()) { 

                     $(this.currentForm).submit(); 

                     this.formSubmitted = false; 

                 } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { 

                     $(this.currentForm).triggerHandler("invalid-form", [this]); 

                     this.formSubmitted = false; 

                 } 

             }, 



             previousValue: function(element) { 

                 return $.data(element, "previousValue") || $.data(element, "previousValue", { 

                     old: null, 

                     valid: true, 

                     message: this.defaultMessage(element, "remote") 

                 }); 

             } 



         }, 



         classRuleSettings: { 

             required: { 

                 required: true 

             }, 

             email: { 

                 email: true 

             }, 

             url: { 

                 url: true 

             }, 

             date: { 

                 date: true 

             }, 

             dateISO: { 

                 dateISO: true 

             }, 

             number: { 

                 number: true 

             }, 

             digits: { 

                 digits: true 

             }, 

             digital: { 

             
digital: true 

             }, 

             creditcard: { 

                 creditcard: true 

             }, 

             idCard: { 

                 idCard: true 

             }, 

             useName: { 

                 useName: true 

             }, 

             mobile: { 

                 mobile: true 

             }, 

             tel: { 

                 tel: true 

             }, 

             contact: { 

                 contact: true 

             }, 

             fax: { 

                 fax: true 

             }, 

             zipCode: { 

                 zipCode: true 

             }, 

             dateTime: { 

                 dateTime: true 

             }, 

             filetype: { 

                 filetype: true 

             }, 

             inputBox:{ 

             
inputBox:true 

             }, 

             hex:{ 

             
hex:true 

             }, 

             letterAndNumber: { 

             
letterAndNumber:true 

             }, 

             specialCharacters : { 

             
specialCharacters:true 

             }, 

             only:{ 

                 only:true 

             } 

         }, 



         addClassRules: function(className, rules) { 

             if (className.constructor === String) { 

                 this.classRuleSettings[className] = rules; 

             } else { 

                 $.extend(this.classRuleSettings, className); 

             } 

         }, 



         classRules: function(element) { 

             var rules = {}; 

             var classes = $(element).attr("class"); 

             if (classes) { 

                 $.each(classes.split(" "), function() { 

                     if (this in $.validator.classRuleSettings) { 

                         $.extend(rules, $.validator.classRuleSettings[this]); 

                     } 

                 }); 

             } 

             return rules; 

         }, 



         attributeRules: function(element) { 

             var rules = {}; 

             var $element = $(element); 

             var type = $element[0].getAttribute("type"); 



             for (var method in $.validator.methods) { 

                 var value; 



                 // support for <input required> in both html5 and older browsers 

                 if (method === "required") { 

                     value = $element.get(0).getAttribute(method); 

                     // Some browsers return an empty string for the required attribute 

                     // and non-HTML5 browsers might have required="" markup 

                     if (value === "") { 

                         value = true; 

                     } 

                     // force non-HTML5 browsers to return bool 

                     value = !! value; 

                 } else { 

                     value = $element.attr(method); 

                 } 



                 // convert the value to a number for number inputs, and for text for backwards compability 

                 // allows type="date" and others to be compared as strings 

                 if (/min|max/.test(method) && (type === null || /number|range|text/.test(type))) { 

                     value = Number(value); 

                 } 



                 if (value) { 

                     rules[method] = value; 

                 } else if (type === method && type !== 'range') { 

                     // exception: the jquery validate 'range' method 

                     // does not test for the html5 'range' type 

                     rules[method] = true; 

                 } 

             } 



             // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs 

             if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { 

                 delete rules.maxlength; 

             } 



             return rules; 

         }, 



         dataRules: function(element) { 

             var method, value, 

                 rules = {}, $element = $(element); 

             for (method in $.validator.methods) { 

                 value = $element.data("rule-" + method.toLowerCase()); 

                 if (value !== undefined) { 

                     rules[method] = value; 

                 } 

             } 

             return rules; 

         }, 



         staticRules: function(element) { 

             var rules = {}; 

             var validator = $.data(element.form, "validator"); 

             if (validator.settings.rules) { 

                 rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; 

             } 

             return rules; 

         }, 



         normalizeRules: function(rules, element) { 

             // handle dependency check 

             $.each(rules, function(prop, val) { 

                 // ignore rule when param is explicitly false, eg. required:false 

                 if (val === false) { 

                     delete rules[prop]; 

                     return; 

                 } 

                 if (val.param || val.depends) { 

                     var keepRule = true; 

                     switch (typeof val.depends) { 

                         case "string": 

                             keepRule = !! $(val.depends, element.form).length; 

                             break; 

                         case "function": 

                             keepRule = val.depends.call(element, element); 

                             break; 

                     } 

                     if (keepRule) { 

                         rules[prop] = val.param !== undefined ? val.param : true; 

                     } else { 

                         delete rules[prop]; 

                     } 

                 } 

             }); 



             // evaluate parameters 

             $.each(rules, function(rule, parameter) { 

                 rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; 

             }); 



             // clean number parameters 

             $.each(['minlength', 'maxlength'], function() { 

                 if (rules[this]) { 

                     rules[this] = Number(rules[this]); 

                 } 

             }); 

             $.each(['rangelength', 'range'], function() { 

                 var parts; 

                 if (rules[this]) { 

                     if ($.isArray(rules[this])) { 

                         rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; 

                     } else if (typeof rules[this] === "string") { 

                         parts = rules[this].split(/[\s,]+/); 

                         rules[this] = [Number(parts[0]), Number(parts[1])]; 

                     } 

                 } 

             }); 



             if ($.validator.autoCreateRanges) { 

                 // auto-create ranges 

                 if (rules.min && rules.max) { 

                     rules.range = [rules.min, rules.max]; 

                     delete rules.min; 

                     delete rules.max; 

                 } 

                 if (rules.minlength && rules.maxlength) { 

                     rules.rangelength = [rules.minlength, rules.maxlength]; 

                     delete rules.minlength; 

                     delete rules.maxlength; 

                 } 

             } 



             return rules; 

         }, 



         // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} 

         normalizeRule: function(data) { 

             if (typeof data === "string") { 

                 var transformed = {}; 

                 $.each(data.split(/\s/), function() { 

                     transformed[this] = true; 

                 }); 

                 data = transformed; 

             } 

             return data; 

         }, 



         // http://docs.jquery.com/Plugins/Validation/Validator/addMethod 

         addMethod: function(name, method, message) { 

             $.validator.methods[name] = method; 

             $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; 

             if (method.length < 3) { 

                 $.validator.addClassRules(name, $.validator.normalizeRule(name)); 

             } 

         }, 



         methods: { 



             // http://docs.jquery.com/Plugins/Validation/Methods/required 

             required: function(value, element, param) { 

                 // check if dependency is met 

                 if (!this.depend(param, element)) { 

                     return "dependency-mismatch"; 

                 } 

                 if (element.nodeName.toLowerCase() === "select") { 

                     // could be an array for select-multiple or a string, both are fine this way 

                     var val = $(element).val(); 

                     return val && val.length > 0; 

                 } 

                 if (this.checkable(element)) { 

                     return this.getLength(value, element) > 0; 

                 } 

                 return $.trim(value).length > 0; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/email 

             email: function(value, element) { 

                 // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ 

                 return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/url 

             url: function(value, element) { 

                 // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ 

                 return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/date 

             date: function(value, element) { 

             
/*var dateObj = new Date(value); 

             
if($.browser.msie && $.browser.version <= 8){ 

             
var splitStr = ''; 

             
if(value.search('/') != -1){ 

             
splitStr = '/'; 

             
}else if(value.search('-') != -1){ 

             
splitStr = '-'; 

             
} 

             
var pd = value.split(splitStr); 

             
if(pd && pd.length > 0){ 

             
dateObj = new Date(pd[0], pd[1]-1, pd[2]); 

             
} 

             
} 

                 return this.optional(element) || !/Invalid|NaN/.test(dateObj.toString());*/ 

             
return this.optional(element) || /^(\d{4})-(\d{2})-(\d{2})$/i.test(value); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/dateISO 

             dateISO: function(value, element) { 

                 return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/number 

             number: function(value, element) { 

                 return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/digits 

             digits: function(value, element) { 

                 return this.optional(element) || /^\d+$/.test(value); 

             }, 

             //只能输入数字和小数点 

             digital: function(value, element) { 

                 return this.optional(element) || /^\d*\.{0,1}\d{0,9}$/.test(value); 

             }, 

             // http://docs.jquery.com/Plugins/Validation/Methods/creditcard 

             // based on http://en.wikipedia.org/wiki/Luhn 

             creditcard: function(value, element) { 

                 if (this.optional(element)) { 

                     return "dependency-mismatch"; 

                 } 

                 // accept only spaces, digits and dashes 

                 if (/[^0-9 \-]+/.test(value)) { 

                     return false; 

                 } 

                 var nCheck = 0, 

                     nDigit = 0, 

                     bEven = false; 



                 value = value.replace(/\D/g, ""); 



                 for (var n = value.length - 1; n >= 0; n--) { 

                     var cDigit = value.charAt(n); 

                     nDigit = parseInt(cDigit, 10); 

                     if (bEven) { 

                         if ((nDigit *= 2) > 9) { 

                             nDigit -= 9; 

                         } 

                     } 

                     nCheck += nDigit; 

                     bEven = !bEven; 

                 } 



                 return (nCheck % 10) === 0; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/minlength 

             minlength: function(value, element, param) { 

                 var length = $.isArray(value) ? value.length : this.getLength($.trim(value), element); 

                 return this.optional(element) || length >= param; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/maxlength 

             maxlength: function(value, element, param) { 

                 var length = $.isArray(value) ? value.length : this.getLength($.trim(value), element); 

                 return this.optional(element) || length <= param; 

             }, 

              

             //只允许最大输入30个字符,包括汉字,一个汉字是3个字符 

             maxCharCodelength: function(value, element, param) { 

                 var length = $.isArray(value) ? value.length : this.getCharCodeLength($.trim(value), element); 

                 return this.optional(element) || length <= param; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/rangelength 

             rangelength: function(value, element, param) { 

                 var length = $.isArray(value) ? value.length : this.getLength($.trim(value), element); 

                 return this.optional(element) || (length >= param[0] && length <= param[1]); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/min 

             min: function(value, element, param) { 

                 return this.optional(element) || value >= param; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/max 

             max: function(value, element, param) { 

                 return this.optional(element) || value <= param; 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/range 

             range: function(value, element, param) { 

                 return this.optional(element) || (value >= param[0] && value <= param[1]); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/equalTo 

             equalTo: function(value, element, param) { 

                 // bind to the blur event of the target in order to revalidate whenever the target field is updated 

                 // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead 

                 var target = $(param); 

                 if (this.settings.onfocusout) { 

                     target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 

                         $(element).valid(); 

                     }); 

                 } 

                 return value === target.val(); 

             }, 

              

             //两个值不能相同 

             notEqualTo: function(value, element, param){ 

                 var target = $(param); 

                  

                 $.each(target, function(i, v){ 

                 
$(this).parents('li').find('label:first').text(); 

                 }); 

                  

                 return value !== target.val(); 

             }, 



             // http://docs.jquery.com/Plugins/Validation/Methods/remote 

             remote: function(value, element, param) { 

                 if (this.optional(element)) { 

                     return "dependency-mismatch"; 

                 } 



                 var previous = this.previousValue(element); 

                 if (!this.settings.messages[element.name]) { 

                     this.settings.messages[element.name] = {}; 

                 } 

                 previous.originalMessage = this.settings.messages[element.name].remote; 

                 this.settings.messages[element.name].remote = previous.message; 



                 param = typeof param === "string" && { 

                     url: param 

                 } || param; 



                 if (previous.old === value) { 

                     return previous.valid; 

                 } 



                 previous.old = value; 

                 var validator = this; 

                 this.startRequest(element); 

                 var data = {}; 

                 data[element.name] = value; 

                 $.ajax($.extend(true, { 

                     url: param, 

                     mode: "abort", 

                     port: "validate" + element.name, 

                     dataType: "json", 

                     data: data, 

                     success: function(response) { 

                     
if(response instanceof Object){ 

                     
response = response.success == 1 ? true : false; 

                     
} 

                         validator.settings.messages[element.name].remote = previous.originalMessage; 

                         var valid = response === true || response === "true"; 

                         if (valid) { 

                             var submitted = validator.formSubmitted; 

                             validator.prepareElement(element); 

                             validator.formSubmitted = submitted; 

                             validator.successList.push(element); 

                             delete validator.invalid[element.name]; 

                             validator.showErrors(); 

                         } else { 

                             var errors = {}; 

                             var message = response || validator.defaultMessage(element, "remote"); 

                             errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; 

                             validator.invalid[element.name] = true; 

                             validator.showErrors(errors); 

                         } 

                         previous.valid = valid; 

                         validator.stopRequest(element, valid); 

                     } 

                 }, param)); 

                 return "pending"; 

             }, 



             //身份证验证 

             idCard: function(value, element) { 

                 return this.optional(element) || validateIdCard(value); 

             }, 



             //字符验证 

             useName: function(value, element) { 

                 return this.optional(element) || /^[\Α-\¥\w]+$/.test(value); 

             }, 



             //手机号码验证 

             mobile: function(value, element) { 

                 var length = value.length; 

                 return this.optional(element) || (length == 11 && /^0?1[3|4|5|8][0-9]\d{8}$/.test(value)); 

             }, 



             //电话号码验证 

             tel: function(value, element) { 

                 var tel = /^(\d{3,4}-?)?(\d{3,4}-?)?\d{2,7}$/g; 

                 if((value.length != 0) && (value.length < 7)){ 

                 
return false; 

                 } 

                 return this.optional(element) || (tel.test(value)); 

             }, 

              

             //数字、字母、连接符、下划线的组合 验证 

             inputBox: function(value, element) { 

                 var box =  /^[a-zA-Z0-9_-]{1,}$/; 

                 return this.optional(element) || (box.test(value)); 

             }, 



             //电话号码与手机验证 

             contact: function(value, element) { 

                 var contact = /((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/g; 

                 return this.optional(element) || (contact.test(value)); 

             }, 



             //传真号码验证 

             fax: function(value, element) { 

                 var fax = /^(\d{3,4}-?)?\d{7,9}$/g; 

                 return this.optional(element) || (fax.test(value)); 

             }, 



             //邮政编码验证 

             zipCode: function(value, element) { 

                 var tel = /^[0-9]{6}$/; 

                 return this.optional(element) || (tel.test(value)); 

             }, 



             //日期时间验证 

             dateTime: function(value, element) { 

                 var reg = /(\d{2}|\d{4})(?:\-)?([0]{1}\d{1}|[1]{1}[0-2]{1})(?:\-)?([0-2]{1}\d{1}|[3]{1}[0-1]{1})(?:\s)?([0-1]{1}\d{1}|[2]{1}[0-3]{1})(?::)?([0-5]{1}\d{1})(?::)?([0-5]{1}\d{1})/; 

                 return this.optional(element) || (reg.test(value)); 

             }, 



             //结束日期大于开始日期验证 

             compareDate: function(value, element, param) { 

             
var rules = $(element).rules(); 

                 var startDate = $(param).val(), 

                     date1 = new Date(startDate.replace(/-/g, "/")), 

                     date2 = new Date(value.replace(/-/g, "/")); 

                 if(startDate==''){ 

                 
return true; 

                 } 

                 if(value == ''){ 

                 
return true; 

                 } 

                 return date1 < date2; 

             }, 



             //对于,分割的长度验证 

             splitMaxlength: function(value, element, param) { 

                 var length = value.split(',').length; 

                 return this.optional(element) || length <= param; 

             }, 

             splitMinlength: function(value, element, param) { 

                 var length = value.split(',').length; 

                 return this.optional(element) || length >= param; 

             }, 

              

             //文件上传类型验证 e.g filetype: ["txt", "pdf", "wav"] 

             filetype: function(value, element, param){ 

                 param = typeof param == "string" ? [param] : param; 

                  

                 //获得上传文件名 

                 var fileArr=value.toLowerCase().split("."); 

                 var filetype=fileArr[fileArr.length-1]; 

                  

                 return $.inArray(filetype, param) != -1; 

             }, 

              

             //16进制字符串0-9 A-F 

             hex: function(value, element){ 

             
var tel = /^[0-9]|[a-f]|[A-F]{4}$/; 

                 return this.optional(element) || (tel.test(value)); 

             }, 

              

             //字母+数字 

             letterAndNumber: function(value, element){ 

             
var word = /(([a-zA-Z]+[0-9]+)|([0-9]+[a-zA-Z]+))[a-zA-Z0-9]*/; 

                 return this.optional(element) || (word.test(value)); 

             }, 

              

             //特殊字符 

             specialCharacters: function(value, element) { 

             
var word = /^[a-zA-Z0-9@#\$&_\.]{1,}$/; 

                 return this.optional(element) || (word.test(value)); 

             }, 

              

             //同一个name唯一性 

             only: function(value, element){ 

                 var temp = {}; 

                 var flag = true; 

                  

                 $.each(element, function(i, v){ 

                   if($(v).val() == value){ 

                       flag = false; 

                       return false; 

                   } 

                 }); 

                  

                 return flag; 

             } 

         } 



     }); 



     // deprecated, use $.validator.format instead 

     $.format = $.validator.format; 



     /* 

      * 身份证15位编码规则:dddddd yymmdd xx p 

      * dddddd:6位地区编码 

      * yymmdd: 出生年(两位年)月日,如:910215 

      * xx: 顺序编码,系统产生,无法确定 

      * p: 性别,奇数为男,偶数为女 

      * 

      * 身份证18位编码规则:dddddd yyyymmdd xxx y 

      * dddddd:6位地区编码 

      * yyyymmdd: 出生年(四位年)月日,如:19910215 

      * xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女 

      * y: 校验码,该位数值可通过前17位计算获得 

      * 

      * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ] 

      * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 

      * 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替 

      * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 ) 

      * i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置 

      */ 

     function validateIdCard(idCard) { 

         //15位和18位身份证号码的正则表达式 

         var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; 



         //如果通过该验证,说明身份证格式正确,但准确性还需计算 

         if (regIdCard.test(idCard)) { 

             if (idCard.length == 18) { 

                 var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); //将前17位加权因子保存在数组里 

                 var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); //这是除以11后,可能产生的11位余数、验证码,也保存成数组 

                 var idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和 

                 for (var i = 0; i < 17; i++) { 

                     idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]; 

                 } 



                 var idCardMod = idCardWiSum % 11; //计算出校验码所在数组的位置 

                 var idCardLast = idCard.substring(17); //得到最后一位身份证号码 



                 //如果等于2,则说明校验码是10,身份证号码最后一位应该是X 

                 if (idCardMod == 2) { 

                     if (idCardLast == "X" || idCardLast == "x") { 

                         return true; 

                     } else { 

                         return false; 

                     } 

                 } else { 

                     //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码 

                     if (idCardLast == idCardY[idCardMod]) { 

                         return true; 

                     } else { 

                         return false; 

                     } 

                 } 

             } 

         } else { 

             return false; 

         } 

     } 



     /** 

      * 身份证号码验证 

      * 

      */ 

     function isIdCardNo(code) { 

         var city = { 

             11: "北京", 

             12: "天津", 

             13: "河北", 

             14: "山西", 

             15: "内蒙古", 

             21: "辽宁", 

             22: "吉林", 

             23: "黑龙江 ", 

             31: "上海", 

             32: "江苏", 

             33: "浙江", 

             34: "安徽", 

             35: "福建", 

             36: "江西", 

             37: "山东", 

             41: "河南", 

             42: "湖北 ", 

             43: "湖南", 

             44: "广东", 

             45: "广西", 

             46: "海南", 

             50: "重庆", 

             51: "四川", 

             52: "贵州", 

             53: "云南", 

             54: "西藏 ", 

             61: "陕西", 

             62: "甘肃", 

             63: "青海", 

             64: "宁夏", 

             65: "新疆", 

             71: "台湾", 

             81: "香港", 

             82: "澳门", 

             91: "国外 " 

         }; 



         if (!code) { 

             return false; 

         } 



         if (!/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) { 

             return false; 

         } 



         if (!city[code.substr(0, 2)]) { 

             return false; 

         } 



         //18位身份证需要验证最后一位校验位 

         if (code.length == 18) { 

             code = code.split(''); 

             //∑(ai×Wi)(mod 11) 

             //加权因子 

             var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; 



             //校验位 

             var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; 

             var sum = 0; 

             var ai = 0; 

             var wi = 0; 

             for (var i = 0; i < 17; i++) { 

                 ai = code[i]; 

                 wi = factor[i]; 

                 sum += ai * wi; 

             } 

             var last = parity[sum % 11]; 

             if (parity[sum % 11] != code[17]) { 

                 return false; 

             } 

         } 



         return true; 

     } 



      

     /** 

      * 判断是否为“YYYYMM”式的时期 

      * 

      */ 

     function isDate6(sDate) { 

         if (!/^[0-9]{6}$/.test(sDate)) { 

             return false; 



         } 

         var year, 

             month, 

             day; 

         year = sDate.substring(0, 4); 

         month = sDate.substring(4, 6); 

         if (year < 1700 || year > 2500) return false 

         if (month < 1 || month > 12) return false 

         return true 



     } 

     /** 

      * 判断是否为“YYYYMMDD”式的时期 

      * 

      */ 

     function isDate8(sDate) { 

         if (!/^[0-9]{8}$/.test(sDate)) { 

             return false; 



         } 

         var year, 

             month, 

             day; 

         year = sDate.substring(0, 4); 

         month = sDate.substring(4, 6); 

         day = sDate.substring(6, 8); 

         var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 

         if (year < 1700 || year > 2500) return false 

         if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29; 

         if (month < 1 || month > 12) return false 

         if (day < 1 || day > iaMonthDays[month - 1]) return false 

         return true 



     } 



 }(jQuery)); 



 // ajax mode: abort 

 // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); 

 // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 

 (function($) { 

     var pendingRequests = {}; 

     // Use a prefilter if available (1.5+) 

     if ($.ajaxPrefilter) { 

         $.ajaxPrefilter(function(settings, _, xhr) { 

             var port = settings.port; 

             if (settings.mode === "abort") { 

                 if (pendingRequests[port]) { 

                     pendingRequests[port].abort(); 

                 } 

                 pendingRequests[port] = xhr; 

             } 

         }); 

     } else { 

         // Proxy ajax 

         var ajax = $.ajax; 

         $.ajax = function(settings) { 

             var mode = ("mode" in settings ? settings : $.ajaxSettings).mode, 

                 port = ("port" in settings ? settings : $.ajaxSettings).port; 

             if (mode === "abort") { 

                 if (pendingRequests[port]) { 

                     pendingRequests[port].abort(); 

                 } 

                 pendingRequests[port] = ajax.apply(this, arguments); 

                 return pendingRequests[port]; 

             } 

             return ajax.apply(this, arguments); 

         }; 

     } 

 }(jQuery)); 



 // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation 

 // handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 

 (function($) { 

     $.extend($.fn, { 

         validateDelegate: function(delegate, type, handler) { 

             return this.bind(type, function(event) { 

                 var target = $(event.target); 

                 if (target.is(delegate)) { 

                     return handler.apply(target, arguments); 

                 } 

             }); 

         } 

     }); 

 }(jQuery));