| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285 | /*! jQuery Validation Plugin - v1.10.0 - 9/7/2012 * https://github.com/jzaefferer/jquery-validation * Copyright (c) 2012 Jörn Zaefferer; Licensed MIT, GPL */(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 (ev) {                    if (validator.settings.submitHandler) {                        validator.submitButton = ev.target;                    }                    // allow suppressing validation by adding a cancel class to the submit button                    if ($(ev.target).hasClass('cancel')) {                        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.value).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 &= 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));                        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.metadataRules(element),                    $.validator.classRules(element),                    $.validator.attributeRules(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.value);        },        // http://docs.jquery.com/Plugins/Validation/filled        filled: function (a) {            return !!$.trim("" + a.value);        },        // http://docs.jquery.com/Plugins/Validation/unchecked        unchecked: function (a) {            return !a.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"), n);        });        return source;    };    $.extend($.validator, {        defaults: {            messages: {},            groups: {},            rules: {},            errorClass: "help-block",            validClass: "valid",            errorElement: "span",            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.lastActive) {                    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: "This field is required.",            remote: "Please fix this field.",            email: "Please enter a valid email address.",            url: "Please enter a valid URL.",            date: "Please enter a valid date.",            dateISO: "Please enter a valid date (ISO).",            number: "Please enter a valid number.",            digits: "Please enter only digits.",            creditcard: "Please enter a valid credit card number.",            equalTo: "Please enter the same value again.",            maxlength: $.validator.format("Please enter no more than {0} characters."),            minlength: $.validator.format("Please enter at least {0} characters."),            rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),            range: $.validator.format("Please enter a value between {0} and {1}."),            max: $.validator.format("Please enter a value less than or equal to {0}."),            min: $.validator.format("Please enter a value greater than or equal to {0}.")        },        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) {                    $.each(value.split(/\s/), 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 occured 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 "messages" metadata            customMetaMessage: function (element, method) {                if (!$.metadata) {                    return;                }                var meta = this.settings.meta ? $(element).metadata()[this.settings.meta] : $(element).metadata();                return meta && meta.messages && meta.messages[method];            },            // 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),                    this.customMetaMessage(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);                    // check if we have a generated label, replace the message then                    if (label.attr("generated")) {                        label.html(message);                    }                } else {                    // create label                    label = $("<" + this.settings.errorElement + "/>")                        .attr({"for": this.idOrName(element), generated: true})                        .addClass(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) {                        // Modify by webo eric                        //if ( this.settings.errorPlacement ) {                        //	this.settings.errorPlacement(label, $(element) );                        //} else {                        //label.insertAfter(element);                        //}                        if ($(element).parent().hasClass("input-group")) {                            label.insertAfter($(element).parent())                        } else {                            label.insertAfter(element);                        }                    }                }                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;            },            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},            creditcard: {creditcard: 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);            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);                }                if (value) {                    rules[method] = value;                } else if ($element[0].getAttribute("type") === method) {                    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;        },        metadataRules: function (element) {            if (!$.metadata) {                return {};            }            var meta = $.data(element.form, 'validator').settings.meta;            return meta ?                $(element).metadata()[meta] :                $(element).metadata();        },        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', 'min', 'max'], function () {                if (rules[this]) {                    rules[this] = Number(rules[this]);                }            });            $.each(['rangelength', 'range'], function () {                if (rules[this]) {                    rules[this] = [Number(rules[this][0]), Number(rules[this][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;                }            }            // To support custom messages in metadata ignore rule methods titled "messages"            if (rules.messages) {                delete rules.messages;            }            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/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 (this.pending[element.name]) {                    return "pending";                }                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) {                        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";            },            // 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;            },            // 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/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?|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) {                return this.optional(element) || !/Invalid|NaN/.test(new Date(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);            },            // 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/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();            }        }    });// deprecated, use $.validator.format instead    $.format = $.validator.format;}(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();                }                return (pendingRequests[port] = ajax.apply(this, arguments));            }            return ajax.apply(this, arguments);        };    }}(jQuery));// provides cross-browser focusin and focusout events// IE has native support, in other browsers, use event caputuring (neither bubbles)// 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 ($) {    // only implement if not provided by jQuery core (since 1.4)    // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs    if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {        $.each({            focus: 'focusin',            blur: 'focusout'        }, function (original, fix) {            $.event.special[fix] = {                setup: function () {                    this.addEventListener(original, handler, true);                },                teardown: function () {                    this.removeEventListener(original, handler, true);                },                handler: function (e) {                    var args = arguments;                    args[0] = $.event.fix(e);                    args[0].type = fix;                    return $.event.handle.apply(this, args);                }            };            function handler(e) {                e = $.event.fix(e);                e.type = fix;                return $.event.handle.call(this, e);            }        });    }    $.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));$(function () {    $.extend(jQuery.validator.messages, {        required: "必选字段",        remote: "请修正该字段",        email: "请输入正确格式的电子邮件",        url: "请输入合法的网址",        date: "请输入合法的日期",        dateISO: "请输入合法的日期 (ISO).",        number: "请输入合法的数字",        digits: "只能输入整数",        creditcard: "请输入合法的信用卡号",        equalTo: "请再次输入相同的值",        accept: "请输入拥有合法后缀名的字符串",        maxlength: jQuery.validator.format("请输入一个 长度最多是 {0} 的字符串"),        minlength: jQuery.validator.format("请输入一个 长度最少是 {0} 的字符串"),        rangelength: jQuery.validator.format("请输入 一个长度介于 {0} 和 {1} 之间的字符串"),        range: jQuery.validator.format("请输入一个介于 {0} 和 {1} 之间的值"),        max: jQuery.validator.format("请输入一个最大为{0} 的值"),        min: jQuery.validator.format("请输入一个最小为{0} 的值")    });    $.validator.addMethod("isNumber", function (value, element) {        return this.optional(element) || /^[-\+]?\d+$/.test(value) || /^[-\+]?\d+(\.\d+)?$/.test(value);    }, "只能填写合法的钱数!");});
 |