From 0f9a66074df67b1195fbcf8be2f8aede122ceed6 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 9 Dec 2016 10:51:30 -0500 Subject: [PATCH] Fix validation --- .../1058/leafweb-logo-grad-large-nobkgnd.png | Bin 0 -> 16789 bytes .../leafweb-logo-grad-large-nobkgnd_thumb.jpg | Bin 0 -> 3316 bytes .../leafweb-logo-grad-large-nobkgnd_thumb.png | Bin 0 -> 3316 bytes WebCms/Views/LeafInput/Create.cshtml | 13 +- .../MacroPartials/Membership/Login.cshtml | 6 +- WebCms/Views/Master.cshtml | 4 +- WebCms/Views/Partials/LoginStatus.cshtml | 4 +- WebCms/WebCms.csproj | 8 + WebCms/css/rte.css | 11 + WebCms/packages.config | 3 + WebCms/scripts/jquery.validate-vsdoc.js | 1291 +++++++++++++++++ WebCms/scripts/jquery.validate.js | 1159 +++++++++++++++ WebCms/scripts/jquery.validate.min.js | 50 + .../jquery.validate.unobtrusive.bootstrap.js | 115 ++ ...uery.validate.unobtrusive.bootstrap.min.js | 4 + ....validate.unobtrusive.bootstrap.min.js.map | Bin 0 -> 2 bytes WebCms/scripts/jquery.validate.unobtrusive.js | 429 ++++++ .../jquery.validate.unobtrusive.min.js | 19 + 18 files changed, 3107 insertions(+), 9 deletions(-) create mode 100644 WebCms/Media/1058/leafweb-logo-grad-large-nobkgnd.png create mode 100644 WebCms/Media/1058/leafweb-logo-grad-large-nobkgnd_thumb.jpg create mode 100644 WebCms/Media/1058/leafweb-logo-grad-large-nobkgnd_thumb.png create mode 100644 WebCms/css/rte.css create mode 100644 WebCms/scripts/jquery.validate-vsdoc.js create mode 100644 WebCms/scripts/jquery.validate.js create mode 100644 WebCms/scripts/jquery.validate.min.js create mode 100644 WebCms/scripts/jquery.validate.unobtrusive.bootstrap.js create mode 100644 WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js create mode 100644 WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js.map create mode 100644 WebCms/scripts/jquery.validate.unobtrusive.js create mode 100644 WebCms/scripts/jquery.validate.unobtrusive.min.js diff --git a/WebCms/Media/1058/leafweb-logo-grad-large-nobkgnd.png b/WebCms/Media/1058/leafweb-logo-grad-large-nobkgnd.png new file mode 100644 index 0000000000000000000000000000000000000000..647b9c219eb0abf9da14c3bbf79d4becc12e9414 GIT binary patch literal 16789 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
@@ -43,7 +52,7 @@ - @using (Html.BeginUmbracoForm("Submit", "LeafInput", FormMethod.Post)) + @using (Html.BeginUmbracoForm("Submit", null, FormMethod.Post)) { @Html.EditorFor(m => m.PhotosynthesisType) @Html.EditorFor(m => m.Identifier) diff --git a/WebCms/Views/MacroPartials/Membership/Login.cshtml b/WebCms/Views/MacroPartials/Membership/Login.cshtml index 6b890cc..953487d 100644 --- a/WebCms/Views/MacroPartials/Membership/Login.cshtml +++ b/WebCms/Views/MacroPartials/Membership/Login.cshtml @@ -9,9 +9,9 @@ Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); - Html.RequiresJs("/umbraco_client/ui/jquery.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); + Html.RequiresJs("~/scripts/jquery.validate.min.js"); + Html.RequiresJs("~/scripts/jquery.validate.unobtrusive.min.js"); + Html.RequiresJs("~/scripts/jquery.validate.unobtrusive.bootstrap.min.js"); }
diff --git a/WebCms/Views/Master.cshtml b/WebCms/Views/Master.cshtml index f802b6c..f776fc4 100644 --- a/WebCms/Views/Master.cshtml +++ b/WebCms/Views/Master.cshtml @@ -35,7 +35,6 @@ - @Html.RenderJsHere() @RenderSection("Styles", false) @@ -83,11 +82,12 @@
- + + @Html.Raw(Html.RenderJsHere()) @RenderSection("Scripts", false) \ No newline at end of file diff --git a/WebCms/Views/Partials/LoginStatus.cshtml b/WebCms/Views/Partials/LoginStatus.cshtml index 05f63df..4c63bda 100644 --- a/WebCms/Views/Partials/LoginStatus.cshtml +++ b/WebCms/Views/Partials/LoginStatus.cshtml @@ -18,8 +18,8 @@ @if (loginStatusModel.IsLoggedIn) {
-
@loginStatusModel.Name
-
+
@loginStatusModel.Name
+
@using (Html.BeginUmbracoForm("HandleLogout")) { diff --git a/WebCms/WebCms.csproj b/WebCms/WebCms.csproj index 515e881..89ee7b1 100644 --- a/WebCms/WebCms.csproj +++ b/WebCms/WebCms.csproj @@ -624,6 +624,13 @@ + + + + + + + @@ -702,6 +709,7 @@ + Web.config diff --git a/WebCms/css/rte.css b/WebCms/css/rte.css new file mode 100644 index 0000000..c57b0aa --- /dev/null +++ b/WebCms/css/rte.css @@ -0,0 +1,11 @@ + + +/**umb_name:header*/ +.header{font-family: "Lato", sans-serif; +line-height: 1.4; +font-weight: 900; + letter-spacing: -.2px; + font-size: 2rem;} + +/**umb_name:body*/ +.body{} \ No newline at end of file diff --git a/WebCms/packages.config b/WebCms/packages.config index 0a21212..9427e57 100644 --- a/WebCms/packages.config +++ b/WebCms/packages.config @@ -16,6 +16,8 @@ + + @@ -35,6 +37,7 @@ + diff --git a/WebCms/scripts/jquery.validate-vsdoc.js b/WebCms/scripts/jquery.validate-vsdoc.js new file mode 100644 index 0000000..22a5460 --- /dev/null +++ b/WebCms/scripts/jquery.validate-vsdoc.js @@ -0,0 +1,1291 @@ +/* +* This file has been commented to support Visual Studio Intellisense. +* You should not use this file at runtime inside the browser--it is only +* intended to be used only for design-time IntelliSense. Please use the +* standard jQuery library for all production use. +* +* Comment version: 1.8 +*/ + +/* +* Note: While Microsoft is not the author of this file, Microsoft is +* offering you a license subject to the terms of the Microsoft Software +* License Terms for Microsoft ASP.NET Model View Controller 3. +* Microsoft reserves all other rights. The notices below are provided +* for informational purposes only and are not the license terms under +* which Microsoft distributed this file. +* +* jQuery validation plugin 1.8.0 +* +* http://bassistance.de/jquery-plugins/jquery-plugin-validation/ +* http://docs.jquery.com/Plugins/Validation +* +* Copyright (c) 2006 - 2011 Jörn Zaefferer +* +*/ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + /// + /// Validates the selected form. This method sets up event handlers for submit, focus, + /// keyup, blur and click to trigger validation of the entire form or individual + /// elements. Each one can be disabled, see the onxxx options (onsubmit, onfocusout, + /// onkeyup, onclick). focusInvalid focuses elements when submitting a invalid form. + /// + /// + /// A set of key/value pairs that configure the validate. All options are optional. + /// + + // if nothing is selected, return nothing; can't chain anyway + if (!this.length) { + 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; + } + + validator = new $.validator( options, this[0] ); + $.data(this[0], 'validator', validator); + + if ( validator.settings.onsubmit ) { + + // allow suppresing validation by adding a cancel class to the submit button + this.find("input, button").filter(".cancel").click(function() { + validator.cancelSubmit = true; + }); + + // when a submitHandler is used, capture the submitting button + if (validator.settings.submitHandler) { + this.find("input, button").filter(":submit").click(function() { + validator.submitButton = this; + }); + } + + // 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() { + if ( validator.settings.submitHandler ) { + if (validator.submitButton) { + // insert a hidden input as a replacement for the missing submit button + var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm ); + 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() { + /// + /// Checks if the selected form is valid or if all selected elements are valid. + /// validate() needs to be called on the form before checking it using this method. + /// + /// + + 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) { + /// + /// Remove the specified attributes from the first matched element and return them. + /// + /// + /// A space-seperated list of attribute names to remove. + /// + + 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) { + /// + /// Return the validations rules for the first selected element. + /// + /// + /// Can be either "add" or "remove". + /// + /// + /// A list of rules to add or remove. + /// + + 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) { + /// + /// Replaces {n} placeholders with arguments. + /// One or more arguments can be passed, in addition to the string template itself, to insert + /// into the string. + /// + /// + /// The string to format. + /// + /// + /// The first argument to insert, or an array of Strings to insert + /// + /// + + 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: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $( [] ), + errorLabelContainer: $( [] ), + onsubmit: true, + ignore: [], + ignoreTitle: false, + onfocusin: function(element) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function(element) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function(element) { + if ( element.name in this.submitted || element == this.lastElement ) { + this.element(element); + } + }, + onclick: function(element) { + // 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 ) { + $(element).addClass(errorClass).removeClass(validClass); + }, + unhighlight: function( element, errorClass, validClass ) { + $(element).removeClass(errorClass).addClass(validClass); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function(settings) { + /// + /// Modify default settings for validation. + /// Accepts everything that Plugins/Validation/validate accepts. + /// + /// + /// Options to set as default. + /// + + $.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.", + accept: "Please enter a value with a valid extension.", + 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/, ""); + validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] ); + } + $(this.currentForm) + .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate) + .validateDelegate(":radio, :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() { + /// + /// Validates the form, returns true if it is valid, false otherwise. + /// This behaves as a normal submit event, but returns the result. + /// + /// + + 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 ) { + /// + /// Validates a single element, returns true if it is valid, false otherwise. + /// This behaves as validation on blur or keyup, but returns the result. + /// + /// + /// An element to validate, must be inside the validated form. + /// + /// + + element = this.clean( element ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ); + 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) { + /// + /// Show the specified messages. + /// Keys have to refer to the names of elements, values are displayed for those elements, using the configured error placement. + /// + /// + /// One or more key/value pairs of input names and messages. + /// + + 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); + }); + } + this.settings.showErrors + ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) + : this.defaultShowErrors(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + /// + /// Resets the controlled form. + /// Resets input fields to their original value (requires form plugin), removes classes + /// indicating invalid elements and hides error messages. + /// + + if ( $.fn.resetForm ) + $( this.currentForm ).resetForm(); + this.submitted = {}; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ); + }, + + numberOfInvalids: function() { + /// + /// Returns the number of invalid fields. + /// This depends on the internal validator state. It covers all fields only after + /// validating the complete form (on submit or via $("form").valid()). After validating + /// a single element, only that element is counted. Most useful in combination with the + /// invalidHandler-option. + /// + /// + + 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) + // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved + return $([]).add(this.currentForm.elements) + .filter(":input") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + !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() { + return $( this.settings.errorElement + "." + this.settings.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); + }, + + check: function( element ) { + element = this.clean( element ); + + // if radio/checkbox, validate first element in group instead + if (this.checkable(element)) { + element = this.findByName(element.name).not(this.settings.ignore)[0]; + } + + var rules = $(element).rules(); + var dependencyMismatch = false; + for (var method in rules) { + var rule = { method: method, parameters: rules[method] }; + try { + var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), 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) { + 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 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.customMetaMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + 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 = jQuery.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() { + for ( var i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + 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 ( var i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if (this.settings.unhighlight) { + for ( var 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().addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + 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 ) + this.settings.errorPlacement + ? this.settings.errorPlacement(label, $(element) ) + : label.insertAfter(element); + } + if ( !message && this.settings.success ) { + label.text(""); + typeof this.settings.success == "string" + ? label.addClass( this.settings.success ) + : this.settings.success( label ); + } + 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); + }, + + checkable: function( element ) { + return /radio|checkbox/i.test(element.type); + }, + + findByName: function( name ) { + // select by name and filter by form for performance over form.find("[name=...]") + var form = this.currentForm; + return $(document.getElementsByName(name)).map(function(index, element) { + return element.form == form && element.name == name && element || null; + }); + }, + + 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) { + return !$.validator.methods.required.call(this, $.trim(element.value), 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}, + dateDE: {dateDE: true}, + number: {number: true}, + numberDE: {numberDE: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function(className, rules) { + /// + /// Add a compound class method - useful to refactor common combinations of rules into a single + /// class. + /// + /// + /// The name of the class rule to add + /// + /// + /// The compound rules + /// + + className.constructor == String ? + this.classRuleSettings[className] = rules : + $.extend(this.classRuleSettings, className); + }, + + classRules: function(element) { + var rules = {}; + var classes = $(element).attr('class'); + 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 = $element.attr(method); + if (value) { + rules[method] = value; + } + } + + // 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) { + /// + /// Add a custom validation method. It must consist of a name (must be a legal javascript + /// identifier), a javascript based function and a default string message. + /// + /// + /// The name of the method, used to identify and referencing it, must be a valid javascript + /// identifier + /// + /// + /// The actual method implementation, returning true if an element is valid + /// + /// + /// (Optional) The default message to display for this method. Can be a function created by + /// jQuery.validator.format(value). When undefined, an already existing message is used + /// (handy for localization), otherwise the field-specific messages have to be defined. + /// + + $.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"; + switch( element.nodeName.toLowerCase() ) { + case '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; + case 'input': + if ( this.checkable(element) ) + return this.getLength(value, element) > 0; + default: + 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; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage(element, "remote"); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + 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) { + return this.optional(element) || this.getLength($.trim(value), element) >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function(value, element, param) { + var 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 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); + var 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/accept + accept: function(value, element, param) { + param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + }, + + // 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).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) { + arguments[0] = $.event.fix(e); + arguments[0].type = fix; + return $.event.handle.apply(this, arguments); + } + }; + 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); diff --git a/WebCms/scripts/jquery.validate.js b/WebCms/scripts/jquery.validate.js new file mode 100644 index 0000000..899cc84 --- /dev/null +++ b/WebCms/scripts/jquery.validate.js @@ -0,0 +1,1159 @@ +/** + * jQuery Validation Plugin 1.8.0 + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright (c) 2006 - 2011 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +(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) { + 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; + } + + validator = new $.validator( options, this[0] ); + $.data(this[0], 'validator', validator); + + if ( validator.settings.onsubmit ) { + + // allow suppresing validation by adding a cancel class to the submit button + this.find("input, button").filter(".cancel").click(function() { + validator.cancelSubmit = true; + }); + + // when a submitHandler is used, capture the submitting button + if (validator.settings.submitHandler) { + this.find("input, button").filter(":submit").click(function() { + validator.submitButton = this; + }); + } + + // 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() { + if ( validator.settings.submitHandler ) { + if (validator.submitButton) { + // insert a hidden input as a replacement for the missing submit button + var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm ); + 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: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $( [] ), + errorLabelContainer: $( [] ), + onsubmit: true, + ignore: [], + ignoreTitle: false, + onfocusin: function(element) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function(element) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function(element) { + if ( element.name in this.submitted || element == this.lastElement ) { + this.element(element); + } + }, + onclick: function(element) { + // 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 ) { + $(element).addClass(errorClass).removeClass(validClass); + }, + unhighlight: function( element, errorClass, validClass ) { + $(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.", + accept: "Please enter a value with a valid extension.", + 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/, ""); + validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] ); + } + $(this.currentForm) + .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate) + .validateDelegate(":radio, :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.clean( element ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ); + 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); + }); + } + this.settings.showErrors + ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) + : this.defaultShowErrors(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) + $( this.currentForm ).resetForm(); + this.submitted = {}; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ); + }, + + 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) + // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved + return $([]).add(this.currentForm.elements) + .filter(":input") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + !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() { + return $( this.settings.errorElement + "." + this.settings.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); + }, + + check: function( element ) { + element = this.clean( element ); + + // if radio/checkbox, validate first element in group instead + if (this.checkable(element)) { + element = this.findByName( element.name ).not(this.settings.ignore)[0]; + } + + var rules = $(element).rules(); + var dependencyMismatch = false; + for (var method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), 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) { + 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 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.customMetaMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + 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 = jQuery.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() { + for ( var i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + 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 ( var i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if (this.settings.unhighlight) { + for ( var 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().addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + 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 ) + this.settings.errorPlacement + ? this.settings.errorPlacement(label, $(element) ) + : label.insertAfter(element); + } + if ( !message && this.settings.success ) { + label.text(""); + typeof this.settings.success == "string" + ? label.addClass( this.settings.success ) + : this.settings.success( label ); + } + 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); + }, + + checkable: function( element ) { + return /radio|checkbox/i.test(element.type); + }, + + findByName: function( name ) { + // select by name and filter by form for performance over form.find("[name=...]") + var form = this.currentForm; + return $(document.getElementsByName(name)).map(function(index, element) { + return element.form == form && element.name == name && element || null; + }); + }, + + 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) { + return !$.validator.methods.required.call(this, $.trim(element.value), 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}, + dateDE: {dateDE: true}, + number: {number: true}, + numberDE: {numberDE: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function(className, rules) { + className.constructor == String ? + this.classRuleSettings[className] = rules : + $.extend(this.classRuleSettings, className); + }, + + classRules: function(element) { + var rules = {}; + var classes = $(element).attr('class'); + 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 = $element.attr(method); + if (value) { + rules[method] = value; + } + } + + // 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"; + switch( element.nodeName.toLowerCase() ) { + case '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; + case 'input': + if ( this.checkable(element) ) + return this.getLength(value, element) > 0; + default: + 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; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage( element, "remote" ); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + 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) { + return this.optional(element) || this.getLength($.trim(value), element) >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function(value, element, param) { + var 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 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); + var 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/accept + accept: function(value, element, param) { + param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + }, + + // 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).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) { + arguments[0] = $.event.fix(e); + arguments[0].type = fix; + return $.event.handle.apply(this, arguments); + } + }; + 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); diff --git a/WebCms/scripts/jquery.validate.min.js b/WebCms/scripts/jquery.validate.min.js new file mode 100644 index 0000000..7ab1d85 --- /dev/null +++ b/WebCms/scripts/jquery.validate.min.js @@ -0,0 +1,50 @@ +/** + * jQuery Validation Plugin 1.8.0 + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright (c) 2006 - 2011 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){this.find("input, button").filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&this.find("input, button").filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("").attr("name", +b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form(); +else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name]; +return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a, +b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error", +validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:[],ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)}, +onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults,a)},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.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."),minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."), +range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator");e="on"+e.type.replace(/^validate/,"");f.settings[e]&&f.settings[e].call(f,this[0])}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&& +this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate(":text, :password, :file, select, textarea", +"focusin focusout keyup",a).validateDelegate(":radio, :checkbox, select, option","click",a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]); +return this.valid()},element:function(a){this.lastElement=a=this.clean(a);this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList, +function(d){return!(d.name in a)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},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{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&& +a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)}, +prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.clean(a);if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&& +window.console&&console.log("exception occured when checking element "+a.id+", check the '"+f.method+"' method",h);throw h;}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+a.name+"")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d, +element:a});this.errorMap[a.name]=d;this.submitted[a.name]=d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a= +0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],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 c(this.errorList).map(function(){return this.element})},showLabel:function(a, +b){var d=this.errorsFor(a);if(d.length){d.removeClass().addClass(this.settings.errorClass);d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text(""); +typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,e){return e.form== +b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this, +c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted= +false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings, +a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e=a.attr(d);if(e)b[d]=e}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]: +c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)? +e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;return a},normalizeRule:function(a){if(typeof a=="string"){var b= +{};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,b)>0;default:return c.trim(a).length> +0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,mode:"abort",port:"validate"+b.name, +dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,b,d){return this.optional(b)|| +this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([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(a)}, +url:function(a,b){return this.optional(b)||/^(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(a)}, +date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9-]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>= +0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery); +(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery); +(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a, +b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery); diff --git a/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.js b/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.js new file mode 100644 index 0000000..f4ae2c8 --- /dev/null +++ b/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.js @@ -0,0 +1,115 @@ +/*! + * jQuery Validate Unobtrusive Bootstrap 1.2.3 + * + * https://github.com/sandrocaseiro/jquery.validate.unobtrusive.bootstrap + * + * Copyright 2014 Sandro Caseiro + * Released under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + */ + +(function($) +{ + function escapeAttributeValue(value) + { + // As mentioned on http://api.jquery.com/category/selectors/ + return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); + } + + function addErrorClass(element) + { + var group = element.closest('.form-group'); + if (group && group.length > 0) + { + group.addClass('has-error').removeClass('has-success'); + } + } + + function addSuccessClass(element) + { + var group = element.closest('.form-group'); + if (group && group.length > 0) + { + group.addClass('has-success').removeClass('has-error'); + } + } + + function onError(formElement, errorPlacementBase, error, inputElement) + { + errorPlacementBase(error, inputElement); + + if ($(inputElement).hasClass('input-validation-error')) + { + addErrorClass(inputElement) + } + } + + function onSuccess(successBase, error) + { + var container = error.data("unobtrusiveContainer"); + + successBase(error); + + if (container) + { + addSuccessClass(container); + } + } + + $.fn.validateBootstrap = function(refresh) + { + return this.each(function() + { + var $this = $(this); + if (refresh) + { + $this.removeData('validator'); + $this.removeData('unobtrusiveValidation'); + $.validator.unobtrusive.parse($this); + } + + var validator = $this.data('validator'); + + if (validator) + { + validator.settings.errorClass += ' text-danger'; + var errorPlacementBase = validator.settings.errorPlacement; + var successBase = validator.settings.success; + + validator.settings.errorPlacement = function(error, inputElement) + { + onError($this, errorPlacementBase, error, inputElement); + }; + + validator.settings.success = function(error) + { + onSuccess(successBase, error); + } + + $this.find('.input-validation-error').each(function() + { + var errorElement = $this.find("[data-valmsg-for='" + escapeAttributeValue($(this)[0].name) + "']"); + var newElement = $(document.createElement(validator.settings.errorElement)) + .addClass('text-danger') + .attr('for', escapeAttributeValue($(this)[0].name)) + .text(errorElement.text()); + onError($this, errorPlacementBase, newElement, $(this)); + }); + } + // if validation isn't enabled, but the form has the validation error message element, add error class to container + else + { + $this.find('.input-validation-error').each(function() + { + addErrorClass($(this)); + }); + } + }); + }; + + $(function() + { + $('form').validateBootstrap(); + }); + +}(jQuery)); \ No newline at end of file diff --git a/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js b/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js new file mode 100644 index 0000000..e55318f --- /dev/null +++ b/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js @@ -0,0 +1,4 @@ +(function(n){function t(n){return n.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function i(n){var t=n.closest(".form-group");t&&t.length>0&&t.addClass("has-error").removeClass("has-success")}function u(n){var t=n.closest(".form-group");t&&t.length>0&&t.addClass("has-success").removeClass("has-error")}function r(t,r,u,f){r(u,f);n(f).hasClass("input-validation-error")&&i(f)}function f(n,t){var i=t.data("unobtrusiveContainer");n(t);i&&u(i)}n.fn.validateBootstrap=function(u){return this.each(function(){var e=n(this),o,s,h;u&&(e.removeData("validator"),e.removeData("unobtrusiveValidation"),n.validator.unobtrusive.parse(e));o=e.data("validator");o?(o.settings.errorClass+=" text-danger",s=o.settings.errorPlacement,h=o.settings.success,o.settings.errorPlacement=function(n,t){r(e,s,n,t)},o.settings.success=function(n){f(h,n)},e.find(".input-validation-error").each(function(){var i=e.find("[data-valmsg-for='"+t(n(this)[0].name)+"']"),u=n(document.createElement(o.settings.errorElement)).addClass("text-danger").attr("for",t(n(this)[0].name)).text(i.text());r(e,s,u,n(this))})):e.find(".input-validation-error").each(function(){i(n(this))})})};n(function(){n("form").validateBootstrap()})})(jQuery); +/* +//# sourceMappingURL=jquery.validate.unobtrusive.bootstrap.min.js.map +*/ \ No newline at end of file diff --git a/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js.map b/WebCms/scripts/jquery.validate.unobtrusive.bootstrap.min.js.map new file mode 100644 index 0000000000000000000000000000000000000000..15294a501aa6e73201b85ff460b2fcf0adb11e48 GIT binary patch literal 2 JcmZQ(0000800aO4 literal 0 HcmV?d00001 diff --git a/WebCms/scripts/jquery.validate.unobtrusive.js b/WebCms/scripts/jquery.validate.unobtrusive.js new file mode 100644 index 0000000..0503334 --- /dev/null +++ b/WebCms/scripts/jquery.validate.unobtrusive.js @@ -0,0 +1,429 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. Insofar as a script file is dual licensed under GPL, + * Microsoft neither took the code under GPL nor distributes it thereunder but + * under the terms set out in this paragraph. All notices and licenses + * below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ +/*! +** Unobtrusive validation support library for jQuery and jQuery Validate +** Copyright (C) Microsoft Corporation. All rights reserved. +*/ + +/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ +/*global document: false, jQuery: false */ + +(function ($) { + var $jQval = $.validator, + adapters, + data_validation = "unobtrusiveValidation"; + + function setValidationValues(options, ruleName, value) { + options.rules[ruleName] = value; + if (options.message) { + options.messages[ruleName] = options.message; + } + } + + function splitAndTrim(value) { + return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); + } + + function escapeAttributeValue(value) { + // As mentioned on http://api.jquery.com/category/selectors/ + return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); + } + + function getModelPrefix(fieldName) { + return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); + } + + function appendModelPrefix(value, prefix) { + if (value.indexOf("*.") === 0) { + value = value.replace("*.", prefix); + } + return value; + } + + function onError(error, inputElement) { // 'this' is the form element + var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), + replaceAttrValue = container.attr("data-valmsg-replace"), + replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; + + container.removeClass("field-validation-valid").addClass("field-validation-error"); + error.data("unobtrusiveContainer", container); + + if (replace) { + container.empty(); + error.removeClass("input-validation-error").appendTo(container); + } + else { + error.hide(); + } + } + + function onErrors(event, validator) { // 'this' is the form element + var container = $(this).find("[data-valmsg-summary=true]"), + list = container.find("ul"); + + if (list && list.length && validator.errorList.length) { + list.empty(); + container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); + + $.each(validator.errorList, function () { + $("
  • ").html(this.message).appendTo(list); + }); + } + } + + function onSuccess(error) { // 'this' is the form element + var container = error.data("unobtrusiveContainer"), + replaceAttrValue = container.attr("data-valmsg-replace"), + replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; + + if (container) { + container.addClass("field-validation-valid").removeClass("field-validation-error"); + error.removeData("unobtrusiveContainer"); + + if (replace) { + container.empty(); + } + } + } + + function onReset(event) { // 'this' is the form element + var $form = $(this), + key = '__jquery_unobtrusive_validation_form_reset'; + if ($form.data(key)) { + return; + } + // Set a flag that indicates we're currently resetting the form. + $form.data(key, true); + try { + $form.data("validator").resetForm(); + } finally { + $form.removeData(key); + } + + $form.find(".validation-summary-errors") + .addClass("validation-summary-valid") + .removeClass("validation-summary-errors"); + $form.find(".field-validation-error") + .addClass("field-validation-valid") + .removeClass("field-validation-error") + .removeData("unobtrusiveContainer") + .find(">*") // If we were using valmsg-replace, get the underlying error + .removeData("unobtrusiveContainer"); + } + + function validationInfo(form) { + var $form = $(form), + result = $form.data(data_validation), + onResetProxy = $.proxy(onReset, form), + defaultOptions = $jQval.unobtrusive.options || {}, + execInContext = function (name, args) { + var func = defaultOptions[name]; + func && $.isFunction(func) && func.apply(form, args); + } + + if (!result) { + result = { + options: { // options structure passed to jQuery Validate's validate() method + errorClass: defaultOptions.errorClass || "input-validation-error", + errorElement: defaultOptions.errorElement || "span", + errorPlacement: function () { + onError.apply(form, arguments); + execInContext("errorPlacement", arguments); + }, + invalidHandler: function () { + onErrors.apply(form, arguments); + execInContext("invalidHandler", arguments); + }, + messages: {}, + rules: {}, + success: function () { + onSuccess.apply(form, arguments); + execInContext("success", arguments); + } + }, + attachValidation: function () { + $form + .off("reset." + data_validation, onResetProxy) + .on("reset." + data_validation, onResetProxy) + .validate(this.options); + }, + validate: function () { // a validation function that is called by unobtrusive Ajax + $form.validate(); + return $form.valid(); + } + }; + $form.data(data_validation, result); + } + + return result; + } + + $jQval.unobtrusive = { + adapters: [], + + parseElement: function (element, skipAttach) { + /// + /// Parses a single HTML element for unobtrusive validation attributes. + /// + /// The HTML element to be parsed. + /// [Optional] true to skip attaching the + /// validation to the form. If parsing just this single element, you should specify true. + /// If parsing several elements, you should specify false, and manually attach the validation + /// to the form when you are finished. The default is false. + var $element = $(element), + form = $element.parents("form")[0], + valInfo, rules, messages; + + if (!form) { // Cannot do client-side validation without a form + return; + } + + valInfo = validationInfo(form); + valInfo.options.rules[element.name] = rules = {}; + valInfo.options.messages[element.name] = messages = {}; + + $.each(this.adapters, function () { + var prefix = "data-val-" + this.name, + message = $element.attr(prefix), + paramValues = {}; + + if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy) + prefix += "-"; + + $.each(this.params, function () { + paramValues[this] = $element.attr(prefix + this); + }); + + this.adapt({ + element: element, + form: form, + message: message, + params: paramValues, + rules: rules, + messages: messages + }); + } + }); + + $.extend(rules, { "__dummy__": true }); + + if (!skipAttach) { + valInfo.attachValidation(); + } + }, + + parse: function (selector) { + /// + /// Parses all the HTML elements in the specified selector. It looks for input elements decorated + /// with the [data-val=true] attribute value and enables validation according to the data-val-* + /// attribute values. + /// + /// Any valid jQuery selector. + + // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one + // element with data-val=true + var $selector = $(selector), + $forms = $selector.parents() + .addBack() + .filter("form") + .add($selector.find("form")) + .has("[data-val=true]"); + + $selector.find("[data-val=true]").each(function () { + $jQval.unobtrusive.parseElement(this, true); + }); + + $forms.each(function () { + var info = validationInfo(this); + if (info) { + info.attachValidation(); + } + }); + } + }; + + adapters = $jQval.unobtrusive.adapters; + + adapters.add = function (adapterName, params, fn) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// [Optional] An array of parameter names (strings) that will + /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and + /// mmmm is the parameter name). + /// The function to call, which adapts the values from the HTML + /// attributes into jQuery Validate rules and/or messages. + /// + if (!fn) { // Called with no params, just a function + fn = params; + params = []; + } + this.push({ name: adapterName, params: params, adapt: fn }); + return this; + }; + + adapters.addBool = function (adapterName, ruleName) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation rule has no parameter values. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// [Optional] The name of the jQuery Validate rule. If not provided, the value + /// of adapterName will be used instead. + /// + return this.add(adapterName, function (options) { + setValidationValues(options, ruleName || adapterName, true); + }); + }; + + adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and + /// one for min-and-max). The HTML parameters are expected to be named -min and -max. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// The name of the jQuery Validate rule to be used when you only + /// have a minimum value. + /// The name of the jQuery Validate rule to be used when you only + /// have a maximum value. + /// The name of the jQuery Validate rule to be used when you + /// have both a minimum and maximum value. + /// [Optional] The name of the HTML attribute that + /// contains the minimum value. The default is "min". + /// [Optional] The name of the HTML attribute that + /// contains the maximum value. The default is "max". + /// + return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { + var min = options.params.min, + max = options.params.max; + + if (min && max) { + setValidationValues(options, minMaxRuleName, [min, max]); + } + else if (min) { + setValidationValues(options, minRuleName, min); + } + else if (max) { + setValidationValues(options, maxRuleName, max); + } + }); + }; + + adapters.addSingleVal = function (adapterName, attribute, ruleName) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation rule has a single value. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name). + /// [Optional] The name of the HTML attribute that contains the value. + /// The default is "val". + /// [Optional] The name of the jQuery Validate rule. If not provided, the value + /// of adapterName will be used instead. + /// + return this.add(adapterName, [attribute || "val"], function (options) { + setValidationValues(options, ruleName || adapterName, options.params[attribute]); + }); + }; + + $jQval.addMethod("__dummy__", function (value, element, params) { + return true; + }); + + $jQval.addMethod("regex", function (value, element, params) { + var match; + if (this.optional(element)) { + return true; + } + + match = new RegExp(params).exec(value); + return (match && (match.index === 0) && (match[0].length === value.length)); + }); + + $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) { + var match; + if (nonalphamin) { + match = value.match(/\W/g); + match = match && match.length >= nonalphamin; + } + return match; + }); + + if ($jQval.methods.extension) { + adapters.addSingleVal("accept", "mimtype"); + adapters.addSingleVal("extension", "extension"); + } else { + // for backward compatibility, when the 'extension' validation method does not exist, such as with versions + // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for + // validating the extension, and ignore mime-type validations as they are not supported. + adapters.addSingleVal("extension", "extension", "accept"); + } + + adapters.addSingleVal("regex", "pattern"); + adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); + adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); + adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength"); + adapters.add("equalto", ["other"], function (options) { + var prefix = getModelPrefix(options.element.name), + other = options.params.other, + fullOtherName = appendModelPrefix(other, prefix), + element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; + + setValidationValues(options, "equalTo", element); + }); + adapters.add("required", function (options) { + // jQuery Validate equates "required" with "mandatory" for checkbox elements + if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { + setValidationValues(options, "required", true); + } + }); + adapters.add("remote", ["url", "type", "additionalfields"], function (options) { + var value = { + url: options.params.url, + type: options.params.type || "GET", + data: {} + }, + prefix = getModelPrefix(options.element.name); + + $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { + var paramName = appendModelPrefix(fieldName, prefix); + value.data[paramName] = function () { + var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']"); + // For checkboxes and radio buttons, only pick up values from checked fields. + if (field.is(":checkbox")) { + return field.filter(":checked").val() || field.filter(":hidden").val() || ''; + } + else if (field.is(":radio")) { + return field.filter(":checked").val() || ''; + } + return field.val(); + }; + }); + + setValidationValues(options, "remote", value); + }); + adapters.add("password", ["min", "nonalphamin", "regex"], function (options) { + if (options.params.min) { + setValidationValues(options, "minlength", options.params.min); + } + if (options.params.nonalphamin) { + setValidationValues(options, "nonalphamin", options.params.nonalphamin); + } + if (options.params.regex) { + setValidationValues(options, "regex", options.params.regex); + } + }); + + $(function () { + $jQval.unobtrusive.parse(document); + }); +}(jQuery)); \ No newline at end of file diff --git a/WebCms/scripts/jquery.validate.unobtrusive.min.js b/WebCms/scripts/jquery.validate.unobtrusive.min.js new file mode 100644 index 0000000..dfeaf38 --- /dev/null +++ b/WebCms/scripts/jquery.validate.unobtrusive.min.js @@ -0,0 +1,19 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. Insofar as a script file is dual licensed under GPL, + * Microsoft neither took the code under GPL nor distributes it thereunder but + * under the terms set out in this paragraph. All notices and licenses + * below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ +/* +** Unobtrusive validation support library for jQuery and jQuery Validate +** Copyright (C) Microsoft Corporation. All rights reserved. +*/ +(function(a){var d=a.validator,b,e="unobtrusiveValidation";function c(a,b,c){a.rules[b]=c;if(a.message)a.messages[b]=a.message}function j(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function f(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function h(a){return a.substr(0,a.lastIndexOf(".")+1)}function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a}function m(c,e){var b=a(this).find("[data-valmsg-for='"+f(e[0].name)+"']"),d=b.attr("data-valmsg-replace"),g=d?a.parseJSON(d)!==false:null;b.removeClass("field-validation-valid").addClass("field-validation-error");c.data("unobtrusiveContainer",b);if(g){b.empty();c.removeClass("input-validation-error").appendTo(b)}else c.hide()}function l(e,d){var c=a(this).find("[data-valmsg-summary=true]"),b=c.find("ul");if(b&&b.length&&d.errorList.length){b.empty();c.addClass("validation-summary-errors").removeClass("validation-summary-valid");a.each(d.errorList,function(){a("
  • ").html(this.message).appendTo(b)})}}function k(d){var b=d.data("unobtrusiveContainer"),c=b.attr("data-valmsg-replace"),e=c?a.parseJSON(c):null;if(b){b.addClass("field-validation-valid").removeClass("field-validation-error");d.removeData("unobtrusiveContainer");e&&b.empty()}}function n(){var b=a(this),c="__jquery_unobtrusive_validation_form_reset";if(b.data(c))return;b.data(c,true);try{b.data("validator").resetForm()}finally{b.removeData(c)}b.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");b.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}function i(b){var c=a(b),f=c.data(e),i=a.proxy(n,b),g=d.unobtrusive.options||{},h=function(e,d){var c=g[e];c&&a.isFunction(c)&&c.apply(b,d)};if(!f){f={options:{errorClass:g.errorClass||"input-validation-error",errorElement:g.errorElement||"span",errorPlacement:function(){m.apply(b,arguments);h("errorPlacement",arguments)},invalidHandler:function(){l.apply(b,arguments);h("invalidHandler",arguments)},messages:{},rules:{},success:function(){k.apply(b,arguments);h("success",arguments)}},attachValidation:function(){c.off("reset."+e,i).on("reset."+e,i).validate(this.options)},validate:function(){c.validate();return c.valid()}};c.data(e,f)}return f}d.unobtrusive={adapters:[],parseElement:function(b,h){var d=a(b),f=d.parents("form")[0],c,e,g;if(!f)return;c=i(f);c.options.rules[b.name]=e={};c.options.messages[b.name]=g={};a.each(this.adapters,function(){var c="data-val-"+this.name,i=d.attr(c),h={};if(i!==undefined){c+="-";a.each(this.params,function(){h[this]=d.attr(c+this)});this.adapt({element:b,form:f,message:i,params:h,rules:e,messages:g})}});a.extend(e,{__dummy__:true});!h&&c.attachValidation()},parse:function(c){var b=a(c),e=b.parents().addBack().filter("form").add(b.find("form")).has("[data-val=true]");b.find("[data-val=true]").each(function(){d.unobtrusive.parseElement(this,true)});e.each(function(){var a=i(this);a&&a.attachValidation()})}};b=d.unobtrusive.adapters;b.add=function(c,a,b){if(!b){b=a;a=[]}this.push({name:c,params:a,adapt:b});return this};b.addBool=function(a,b){return this.add(a,function(d){c(d,b||a,true)})};b.addMinMax=function(e,g,f,a,d,b){return this.add(e,[d||"min",b||"max"],function(b){var e=b.params.min,d=b.params.max;if(e&&d)c(b,a,[e,d]);else if(e)c(b,g,e);else d&&c(b,f,d)})};b.addSingleVal=function(a,b,d){return this.add(a,[b||"val"],function(e){c(e,d||a,e.params[b])})};d.addMethod("__dummy__",function(){return true});d.addMethod("regex",function(b,c,d){var a;if(this.optional(c))return true;a=(new RegExp(d)).exec(b);return a&&a.index===0&&a[0].length===b.length});d.addMethod("nonalphamin",function(c,d,b){var a;if(b){a=c.match(/\W/g);a=a&&a.length>=b}return a});if(d.methods.extension){b.addSingleVal("accept","mimtype");b.addSingleVal("extension","extension")}else b.addSingleVal("extension","extension","accept");b.addSingleVal("regex","pattern");b.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");b.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range");b.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength");b.add("equalto",["other"],function(b){var i=h(b.element.name),j=b.params.other,d=g(j,i),e=a(b.form).find(":input").filter("[name='"+f(d)+"']")[0];c(b,"equalTo",e)});b.add("required",function(a){(a.element.tagName.toUpperCase()!=="INPUT"||a.element.type.toUpperCase()!=="CHECKBOX")&&c(a,"required",true)});b.add("remote",["url","type","additionalfields"],function(b){var d={url:b.params.url,type:b.params.type||"GET",data:{}},e=h(b.element.name);a.each(j(b.params.additionalfields||b.element.name),function(i,h){var c=g(h,e);d.data[c]=function(){var d=a(b.form).find(":input").filter("[name='"+f(c)+"']");return d.is(":checkbox")?d.filter(":checked").val()||d.filter(":hidden").val()||"":d.is(":radio")?d.filter(":checked").val()||"":d.val()}});c(b,"remote",d)});b.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&c(a,"minlength",a.params.min);a.params.nonalphamin&&c(a,"nonalphamin",a.params.nonalphamin);a.params.regex&&c(a,"regex",a.params.regex)});a(function(){d.unobtrusive.parse(document)})})(jQuery); \ No newline at end of file