From 68a37fbb06803768725388f7f89168346ad6115b Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Mon, 28 Apr 2014 18:52:22 -0400 Subject: [PATCH 01/41] Upadting vertion to 1.1.1 --- html5-form-validation.jquery.json | 2 +- jquery.validation-1.1.0.min.js | 16 --------------- ...ion-1.1.0.js => jquery.validation-1.1.1.js | 20 ++++++++----------- jquery.validation-1.1.1.min.js | 16 +++++++++++++++ 4 files changed, 25 insertions(+), 29 deletions(-) delete mode 100644 jquery.validation-1.1.0.min.js rename jquery.validation-1.1.0.js => jquery.validation-1.1.1.js (98%) create mode 100644 jquery.validation-1.1.1.min.js diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 927d811..5b30598 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.1.0", + "version": "1.1.1", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation-1.1.0.min.js b/jquery.validation-1.1.0.min.js deleted file mode 100644 index eb9a890..0000000 --- a/jquery.validation-1.1.0.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * jQuery Form Validation - * - * @author Tom Bertrand - * @version 1.1.0 (2014-05-26) - * - * @copyright - * Copyright (C) 2014 Tom Bertrand. - * - * @link - * http://www.runningcoder.org/jqueryvalidation/ - * - * @license - * Licensed under the MIT license. - */ -(function(window,document,$,undefined){window.Validation={};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/,LUHN:"_validateLuhn"};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"],scrollToError:[true,false]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){window.debug("Validation.extendOptions - Delete unsupported property - "+r+": {"+i.toString()+": "+options[n][r][i].toString()+"}");delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){$(t).unbind(options.dynamic.settings.trigger).on(options.dynamic.settings.trigger,function(e){if($(this).is(":disabled")){return false}var t=this;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t])}_executeCallback(options.dynamic.callback.onComplete,[node,t])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(options.submit.settings.trigger).on(options.submit.settings.trigger,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){window.debug("Validation.validateInput - Invalid {string} inputName on "+e.toString());return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){window.debug("Validation.displayOneError unable to find "+e);return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}t.unbind(options.submit.settings.clear).on(options.submit.settings.clear+" "+options.dynamic.settings.trigger,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!hasScrolled){hasScrolled=true;if(typeof $.scrollTo!=="function"){window.debug("Missing jQuery.scrollTo, scrolling will not happen.");return false}$.scrollTo(options.submit.settings.display==="block"?r:t,500,{offset:-100})}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){try{delete errors[e];hasScrolled=false}catch(s){window.debug("Validation.resetOneError unable to find and delete "+e+" inside {object} errors.");return false}if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}function resetErrors(){errors=[],hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[],hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0};this.__construct=function(){extendMessages();extendOptions();delegateDynamicValidation();delegateValidation()}();return{registerError:registerError,displayOneError:displayOneError,displayErrors:displayErrors}};$.fn.validate=$.validate=function(e){return _api.validate(this,e)};$.fn.addValidation=function(e){return _api.addValidation(this,e)};$.fn.removeValidation=function(e){return _api.removeValidation(this,e)};$.fn.addError=function(e){return _api.addError(this,e)};var _api={_formatValidation:function(e){e=e.toString().replace(/\s/g,"");if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"){e=e.replace(/^\[|\]$/g,"")}return e},_splitValidation:function(e){var t=this._formatValidation(e).split(","),n;for(var r=0;r]=?|==|!=)\s*([^<>=!]+?)\s*$/,LUHN:"_validateLuhn"};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){window.debug("Validation.extendOptions - Delete unsupported property - "+r+": {"+i.toString()+": "+options[n][r][i].toString()+"}");delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){$(t).unbind(options.dynamic.settings.trigger).on(options.dynamic.settings.trigger,function(e){if($(this).is(":disabled")){return false}var t=this;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t])}_executeCallback(options.dynamic.callback.onComplete,[node,t])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(options.submit.settings.trigger).on(options.submit.settings.trigger,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){window.debug("Validation.validateInput - Invalid {string} inputName on "+e.toString());return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
    ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){window.debug("Validation.displayOneError unable to find "+e);return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}t.unbind(options.submit.settings.clear).on(options.submit.settings.clear+" "+options.dynamic.settings.trigger,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!hasScrolled){hasScrolled=true;var f=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,c=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:c.offset().top+f},l)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){try{delete errors[e];hasScrolled=false}catch(s){window.debug("Validation.resetOneError unable to find and delete "+e+" inside {object} errors.");return false}if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}function resetErrors(){errors=[],hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[],hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0};this.__construct=function(){extendMessages();extendOptions();delegateDynamicValidation();delegateValidation()}();return{registerError:registerError,displayOneError:displayOneError,displayErrors:displayErrors}};$.fn.validate=$.validate=function(e){return _api.validate(this,e)};$.fn.addValidation=function(e){return _api.addValidation(this,e)};$.fn.removeValidation=function(e){return _api.removeValidation(this,e)};$.fn.addError=function(e){return _api.addError(this,e)};var _api={_formatValidation:function(e){e=e.toString().replace(/\s/g,"");if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"){e=e.replace(/^\[|\]$/g,"")}return e},_splitValidation:function(e){var t=this._formatValidation(e).split(","),n;for(var r=0;r Date: Thu, 8 May 2014 14:05:01 -0400 Subject: [PATCH 02/41] Releasing the version 1.2.0 Patch notes: http://www.runningcoder.org/jqueryvalidation/version/ --- html5-form-validation.jquery.json | 2 +- jquery.validation-1.1.1.min.js | 16 - ...alidation-1.1.1.js => jquery.validation.js | 275 +++++++++++++----- jquery.validation.min.js | 16 + 4 files changed, 226 insertions(+), 83 deletions(-) delete mode 100644 jquery.validation-1.1.1.min.js rename jquery.validation-1.1.1.js => jquery.validation.js (83%) create mode 100644 jquery.validation.min.js diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 5b30598..56be3e4 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.1.1", + "version": "1.2.0", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation-1.1.1.min.js b/jquery.validation-1.1.1.min.js deleted file mode 100644 index 8931c5d..0000000 --- a/jquery.validation-1.1.1.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * jQuery Form Validation - * - * @author Tom Bertrand - * @version 1.1.1 (2014-05-28) - * - * @copyright - * Copyright (C) 2014 Tom Bertrand. - * - * @link - * http://www.runningcoder.org/jqueryvalidation/ - * - * @license - * Licensed under the MIT license. - */ -(function(window,document,$,undefined){window.Validation={};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/,LUHN:"_validateLuhn"};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){window.debug("Validation.extendOptions - Delete unsupported property - "+r+": {"+i.toString()+": "+options[n][r][i].toString()+"}");delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){$(t).unbind(options.dynamic.settings.trigger).on(options.dynamic.settings.trigger,function(e){if($(this).is(":disabled")){return false}var t=this;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t])}_executeCallback(options.dynamic.callback.onComplete,[node,t])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(options.submit.settings.trigger).on(options.submit.settings.trigger,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){window.debug("Validation.validateInput - Invalid {string} inputName on "+e.toString());return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
      ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){window.debug("Validation.displayOneError unable to find "+e);return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}t.unbind(options.submit.settings.clear).on(options.submit.settings.clear+" "+options.dynamic.settings.trigger,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!hasScrolled){hasScrolled=true;var f=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,c=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:c.offset().top+f},l)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){try{delete errors[e];hasScrolled=false}catch(s){window.debug("Validation.resetOneError unable to find and delete "+e+" inside {object} errors.");return false}if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}function resetErrors(){errors=[],hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[],hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0};this.__construct=function(){extendMessages();extendOptions();delegateDynamicValidation();delegateValidation()}();return{registerError:registerError,displayOneError:displayOneError,displayErrors:displayErrors}};$.fn.validate=$.validate=function(e){return _api.validate(this,e)};$.fn.addValidation=function(e){return _api.addValidation(this,e)};$.fn.removeValidation=function(e){return _api.removeValidation(this,e)};$.fn.addError=function(e){return _api.addError(this,e)};var _api={_formatValidation:function(e){e=e.toString().replace(/\s/g,"");if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"){e=e.replace(/^\[|\]$/g,"")}return e},_splitValidation:function(e){var t=this._formatValidation(e).split(","),n;for(var r=0;r]=?|==|!=)\s*([^<>=!]+?)\s*$/,LUHN:"_validateLuhn"};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){window.debug("Validation.extendOptions - Delete unsupported property - "+r+": {"+i.toString()+": "+options[n][r][i].toString()+"}");delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){window.debug("Validation.validateInput - Invalid {string} inputName on "+e.toString());return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
        ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){window.debug("Validation.displayOneError unable to find "+e);return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){window.debug("Validation.resetOneError Unable to find inputName: "+e+".");return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0};this.__construct=function(){extendMessages();extendOptions();delegateDynamicValidation();delegateValidation()}();return{registerError:registerError,displayOneError:displayOneError,displayErrors:displayErrors,resetOneError:resetOneError,resetErrors:resetErrors}};$.fn.validate=$.validate=function(e){return _api.validate(this,e)};$.fn.addValidation=function(e){return _api.addValidation(this,e)};$.fn.removeValidation=function(e){return _api.removeValidation(this,e)};$.fn.addError=function(e){return _api.addError(this,e)};$.fn.removeError=function(e){return _api.removeError(this,e)};var _api={_formatValidation:function(e){e=e.toString().replace(/\s/g,"");if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"){e=e.replace(/^\[|\]$/g,"")}return e},_splitValidation:function(e){var t=this._formatValidation(e).split(","),n;for(var r=0;r Date: Thu, 8 May 2014 14:16:40 -0400 Subject: [PATCH 03/41] Direct links for the project related information --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 92ff012..4ff9da1 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,18 @@ It is a simple clientside library that will save you a lot of time when it comes The jQuery form Validation plugin is released under the MIT License. The complete documentation, demo and further instructions can be found at www.runningcoder.org + +Documentation +====================== + +www.runningcoder.org/jqueryvalidation/documentation/ + +Demos +====================== + +www.runningcoder.org/jqueryvalidation/demo/ + +Patch Notes +====================== + +www.runningcoder.org/jqueryvalidation/version/ From b9f00304fe984dfd74f5a6d528544dfc58440106 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Thu, 24 Jul 2014 02:56:11 -0400 Subject: [PATCH 04/41] Updated to version 1.3.0 - new debugging system --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 291 +++++++++++++++++++++++++----- jquery.validation.min.js | 4 +- 3 files changed, 247 insertions(+), 50 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 56be3e4..3c4648b 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.2.0", + "version": "1.3.0", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 7062aaa..0c94a98 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.2.0 (2014-05-08) + * @version 1.3.0 (2014-07-24) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -60,9 +60,10 @@ // Validate value if it is not empty OPTIONAL: /^.*$/, // Validate values or length by comparison - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ // Validate credit card number - LUHN: "_validateLuhn" + //@TODO: Implement this .. + //ZIP: /^(?!([a-y]{1}\d{1}[a-z]{1}[-\s]?\d{1}[a-z]{1}\d{1})$).*$/i.test('g1q b1g') }; /** @@ -145,7 +146,8 @@ onComplete: null } }, - messages: {} + messages: {}, + debug: false }; /** @@ -171,7 +173,8 @@ settings: { trigger: ["focusout", "keydown", "keypress", "keyup"] } - } + }, + debug: [true, false] }; // ================================================================================================================= @@ -203,6 +206,13 @@ _extendedMessages = true; + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendMessage()', + 'arguments': JSON.stringify(window.Validation.messages), + 'message': 'OK - Overriding ' + node + ' default message(s)' + }); + } /** @@ -223,12 +233,37 @@ tpmOptions.messages = $.extend(tmpMessages, options.messages || {}); for (var method in options) { - if (!options.hasOwnProperty(method) || !(options[method] instanceof Object)) { + + if (!options.hasOwnProperty(method) || method === "debug") { + continue; + } + + if (options.debug && (!_options[method] || !(options[method] instanceof Object))) { + + window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + method + ': ' + JSON.stringify(options[method]) + '}', + 'message': 'WARNING - ' + method + ' - invalid option' + }); + continue; } for (var type in options[method]) { - if (!options[method].hasOwnProperty(type) || !(options[method][type] instanceof Object)) { + if (!options[method].hasOwnProperty(type)) { + continue; + } + + if (!_options[method][type] || !(options[method][type] instanceof Object)) { + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + type + ': ' + JSON.stringify(options[method][type]) + '}', + 'message': 'WARNING - ' + type + ' - invalid option' + }); + continue; } @@ -242,10 +277,12 @@ _supported[method][type][option] && $.inArray(options[method][type][option], _supported[method][type][option]) === -1) { - window.debug( - 'Validation.extendOptions - Delete unsupported property - ' + type + - ': {' + option.toString() + ': ' + options[method][type][option].toString() + '}' - ); + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + option + ': ' + JSON.stringify(options[method][type][option]) + '}', + 'message': 'WARNING - ' + option.toString() + ': ' + JSON.stringify(options[method][type][option]) + ' - unsupported option' + }); delete options[method][type][option]; } @@ -257,6 +294,10 @@ } } + if (options.debug && $.inArray(options.debug, _supported['debug'] !== -1)) { + tpmOptions.debug = options.debug; + } + // @TODO Would there be a better fix to solve event conflict? if (tpmOptions.dynamic.settings.trigger) { if (tpmOptions.dynamic.settings.trigger === "keypress" && tpmOptions.submit.settings.clear === "keypress") { @@ -279,6 +320,23 @@ return false; } + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateDynamicValidation()', + 'arguments': JSON.stringify(options), + 'message': 'OK - Dynamic Validation activated on ' + $(node).length + ' form(s)' + }); + + if (options.debug && !$(node).find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + window.Debug.log({ + 'node': node, + 'function': 'delegateDynamicValidation()', + 'arguments': '$(node).find([' + _data.validation + '],[' + _data.regex + '])', + 'message': 'ERROR - [' + _data.validation + '] not found' + }); + return false; + } + var namespace = ".vd", // validation.delegate event = options.dynamic.settings.trigger + namespace; if (options.dynamic.settings.trigger !== "focusout") { @@ -340,6 +398,23 @@ var event = options.submit.settings.trigger + '.vd'; + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateValidation()', + 'arguments': JSON.stringify(options), + 'message': 'OK - Validation activated on ' + $(node).length + ' form(s)' + }); + + if (options.debug && !$(node).find(options.submit.settings.button)[0]) { + window.Debug.log({ + 'node': node, + 'function': 'delegateDynamicValidation()', + 'arguments': '$(node).find(' + options.submit.settings.button + ')', + 'message': 'ERROR - ' + options.submit.settings.button + ' not found' + }); + return false; + } + $(node).on("submit", false ); $(node).find(options.submit.settings.button).unbind(event).on(event, function (e) { @@ -366,6 +441,8 @@ } + options.debug && window.Debug.print(); + return false; }); @@ -410,7 +487,14 @@ var inputName = $(input).attr('name'); if (!inputName) { - window.debug('Validation.validateInput - Invalid {string} inputName on ' + input.toString()); + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateInput()', + 'arguments': '$(input).attr("name")', + 'message': 'ERROR - Missing input [name]' + }); + return false; } @@ -499,7 +583,13 @@ } catch (error) { - window.debug('Invalid data-validation-regex on ' + inputName); + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateInput()', + 'arguments': '{pattern: {' + pattern + '}, modifier: {' + patternModifier+ '}', + 'message': 'WARNING - Invalid [data-validation-regex] on input ' + inputName + }); + return true; } @@ -551,8 +641,16 @@ // Validate for comparison "data-validation" var comparison = rule.match(_rules['COMPARISON']); + if (!comparison || comparison.length !== 4) { - window.debug('Validation.validateRule - Invalid validation rule: ' + rule); + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'value: ' + value + ' rule: ' + rule, + 'message': 'WARNING - Invalid comparison' + }); + return; } @@ -566,17 +664,17 @@ // Compare input "Length" case "L": + // Only numeric value for "L" are allowed if (isNaN(compared)) { - comparedValue = $(node).find('[name="' + compared + '"]').val(); - if (!comparedValue) { - window.debug('$.Validation.validateRule - Unable to find value of input[name="' + compared + '"] inside rule ' + rule) - return false; - } + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'compare: ' + compared + ' rule: ' + rule, + 'message': 'WARNING - Invalid rule, "L" compare must be numeric' + }); - if (!value || !eval('"' + encodeURIComponent(value) + '"' + operator + '"' + encodeURIComponent(comparedValue) + '"')) { - throw [options.messages[operator], compared]; - } + return false; } else { @@ -585,17 +683,26 @@ } } + break; // Compare input "Value" case "V": default: + // Compare Field values if (isNaN(compared)) { comparedValue = $(node).find('[name="' + compared + '"]').val(); if (!comparedValue) { - window.debug('$.Validation.validateRule - Unable to find value of input[name="' + compared + '"] inside rule ' + rule) + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'compare: ' + compared + ' rule: ' + rule, + 'message': 'WARNING - Unable to find compared field [name="' + compared + '"]' + }); + return false; } @@ -603,9 +710,10 @@ throw [options.messages[operator].replace(' characters', ''), compared]; } + // Compare numeric value } else { - if (!value || !eval(value + operator + parseFloat(compared))) { + if (!value || isNaN(value) || !eval(value + operator + parseFloat(compared))) { throw [options.messages[operator].replace(' characters', ''), compared]; } @@ -672,7 +780,14 @@ label = null; if (!input[0]) { - window.debug('Validation.displayOneError unable to find ' + inputName); + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'displayOneError()', + 'arguments': '[name="' + inputName + '"]', + 'message': 'ERROR - Unable to find input by name "' + inputName + '"' + }); + return false; } @@ -741,7 +856,7 @@ } var namespace = ".vr", //validation.resetError - event = "coucou"+namespace; + event = "coucou" + namespace; if (options.submit.settings.clear) { event += " " + options.submit.settings.clear + namespace } @@ -832,13 +947,19 @@ input = $(node).find('[name="' + inputName + '"]'); if (!input[0]) { - window.debug('Validation.resetOneError Unable to find inputName: ' + inputName + '.'); + + options.debug && window.Debug.log({ + 'node': node, + 'function': 'resetOneError()', + 'arguments': '[name="' + inputName + '"]', + 'message': 'ERROR - Unable to find input by name "' + inputName + '"' + }); + return false; } } //$._data( input[0], "events" ); - input.trigger('coucou.vr'); } @@ -957,7 +1078,14 @@ } if (!_isValid || typeof _callback !== "function") { - window.debug('Validation._executeFunction - Invalid function - ' + callback[0].toString()); + + options.debug && window.Debug.log({ + 'node': node, + 'function': '_executeCallback()', + 'arguments': JSON.stringify(callback), + 'message': 'WARNING - Invalid callback function"' + }); + return false; } @@ -968,24 +1096,6 @@ }; - var _validateLuhn = function (luhn) { - - var len = luhn.length, - mul = 0, - prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]], - sum = 0; - - while (len--) { - sum += prodArr[mul][parseInt(luhn.charAt(len), 10)]; - mul ^= 1; - } - - return sum % 10 === 0 && sum > 0; - - }; - - - /** * @private * Constructs Validation @@ -998,6 +1108,8 @@ delegateDynamicValidation(); delegateValidation(); + options.debug && window.Debug.print(); + }(); return { @@ -1465,8 +1577,93 @@ } }; + window.Debug = { + + table: [], + log: function (debugObject) { + + if (!debugObject.message || typeof debugObject.message !== "string") { + return false; + } + + this.table[debugObject.message] = $.extend( + Object.preventExtensions( + { + 'node': '', + 'function': '', + 'arguments': '' + } + ), debugObject + ) + + }, + print: function () { + + if ($.isEmptyObject(this.table)) { + return false; + } + + if (console.group !== undefined || console.table !== undefined) { + + console.groupCollapsed('--- jQuery Form Validation Debug ---'); + + if (console.table) { + console.table(this.table); + } else { + $.each(this.table, function (index, data) { + console.log(data['Name'] + ': ' + data['Execution Time']+'ms'); + }); + } + + console.groupEnd(); + + } else { + console.log('Debug is not available on your current browser, try the most recent version of Chrome or Firefox.'); + } + + this.table = []; + + } + + }; + String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); } + /** + * Creates a String from a JSON object + * + * @return {string|array} str String or array of strings + */ + window.JSON.stringify = JSON.stringify || function (obj) { + var t = typeof (obj); + if (t !== "object" || obj === null) { + // simple data type + if (t === "string") { + obj = '"' + obj + '"'; + } + return String(obj); + } + else { + // recurse array or object + var n, v, json = [], arr = (obj && obj.constructor === Array); + for (n in obj) { + // jslint hack to validate for..in + if (true) { + v = obj[n]; + t = typeof(v); + if (t === "string") { + v = '"' + v + '"'; + } + else if (t === "object" && v !== null) { + v = JSON.stringify(v); + } + json.push((arr ? "" : '"' + n + '": ') + String(v)); + } + } + return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); + } + }; + }(window, document, window.jQuery)); \ No newline at end of file diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 2cb129a..f7278e5 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.2.0 (2014-05-08) + * @version 1.3.0 (2014-07-24) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/,LUHN:"_validateLuhn"};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){window.debug("Validation.extendOptions - Delete unsupported property - "+r+": {"+i.toString()+": "+options[n][r][i].toString()+"}");delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){window.debug("Validation.validateInput - Invalid {string} inputName on "+e.toString());return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
          ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){window.debug("Validation.displayOneError unable to find "+e);return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){window.debug("Validation.resetOneError Unable to find inputName: "+e+".");return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0};this.__construct=function(){extendMessages();extendOptions();delegateDynamicValidation();delegateValidation()}();return{registerError:registerError,displayOneError:displayOneError,displayErrors:displayErrors,resetOneError:resetOneError,resetErrors:resetErrors}};$.fn.validate=$.validate=function(e){return _api.validate(this,e)};$.fn.addValidation=function(e){return _api.addValidation(this,e)};$.fn.removeValidation=function(e){return _api.removeValidation(this,e)};$.fn.addError=function(e){return _api.addError(this,e)};$.fn.removeError=function(e){return _api.removeError(this,e)};var _api={_formatValidation:function(e){e=e.toString().replace(/\s/g,"");if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"){e=e.replace(/^\[|\]$/g,"")}return e},_splitValidation:function(e){var t=this._formatValidation(e).split(","),n;for(var r=0;r]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
            ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Fri, 25 Jul 2014 22:38:59 -0400 Subject: [PATCH 05/41] Ready to release tag 1.3.0 --- jquery.validation.js | 33 ++++++++++++++++++++------------- jquery.validation.min.js | 4 ++-- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 0c94a98..822c9f6 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.0 (2014-07-24) + * @version 1.3.0 (2014-07-25) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -457,6 +457,8 @@ */ function validateForm () { + var isValid = true; + $.each( $(node).find('[' + _data.validation + '],[' + _data.regex + ']'), function (index, input) { @@ -465,12 +467,14 @@ return false; } - validateInput(input); + if (!validateInput(input)) { + isValid = false; + } } ); - return $.isEmptyObject(errors); + return isValid; } @@ -515,7 +519,7 @@ } // Validates the "data-validation" - if (!$.isEmptyObject(validationArray)) { + if (validationArray instanceof Array && validationArray.length > 0) { // "OPTIONAL" input will not be validated if it's empty if (value === '' && $.inArray('OPTIONAL', validationArray) !== -1) { @@ -590,6 +594,7 @@ 'message': 'WARNING - Invalid [data-validation-regex] on input ' + inputName }); + // Do not block validation if a regexp is bad, only skip it return true; } @@ -608,7 +613,7 @@ } - return $.isEmptyObject(errors[inputName]); + return !errors[inputName] || errors[inputName] instanceof Array && errors[inputName].length === 0; } @@ -835,6 +840,11 @@ errorContainer = $(node); } + // Prevent double error list if the previous one has not been cleared. + if (options.submit.settings.display === 'inline' && errorContainer.find('[' + _data.errorList + ']')[0]) { + return false; + } + if (options.submit.settings.display === "inline" || (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) ) { @@ -870,13 +880,10 @@ input.unbind(event).on(event, function (a,b,c,d,e) { return function () { - if (e) { - if ($(c).hasClass(options.submit.settings.errorClass)) { resetOneError(a,b,c,d,e); } - } else if ($(b).hasClass(options.submit.settings.errorClass)) { resetOneError(a,b,c,d); } @@ -1466,7 +1473,7 @@ return false; } - if (typeof error !== "object" || $.isEmptyObject(error) || Object.prototype.toString.call(error) !== "[object Object]") { + if (typeof error !== "object" || Object.prototype.toString.call(error) !== "[object Object]") { window.debug('$.addError - Invalid error object.'); return false; } @@ -1518,7 +1525,7 @@ * Note: The same form jQuery selector MUST be used to recuperate the Validation configuration. * * @example - * $('#form-signup_v3').removeError([ + * $('#form-signin_v2').removeError([ * 'signin_v2[username]', * 'signin_v2[password]' * ]) @@ -1540,7 +1547,7 @@ return false; } - if (typeof inputName === "object" && ($.isEmptyObject(inputName) || Object.prototype.toString.call(inputName) !== "[object Array]")) { + if (typeof inputName === "object" && Object.prototype.toString.call(inputName) !== "[object Array]") { window.debug('$.removeError - Invalid inputName array.'); return false; } @@ -1579,7 +1586,7 @@ window.Debug = { - table: [], + table: {}, log: function (debugObject) { if (!debugObject.message || typeof debugObject.message !== "string") { @@ -1621,7 +1628,7 @@ console.log('Debug is not available on your current browser, try the most recent version of Chrome or Firefox.'); } - this.table = []; + this.table = {}; } diff --git a/jquery.validation.min.js b/jquery.validation.min.js index f7278e5..beb17a4 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.0 (2014-07-24) + * @version 1.3.0 (2014-07-25) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,t){if($(this).is(":disabled")){return false}validateInput(t)});return $.isEmptyObject(errors)}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(!$.isEmptyObject(s)){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
              ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Thu, 31 Jul 2014 16:17:19 -0400 Subject: [PATCH 06/41] Replaced the API window.debug to window.Debug to unify the debug process. --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 112 ++++++++++++++++++++++++------ jquery.validation.min.js | 4 +- 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 3c4648b..fc4d72b 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.0", + "version": "1.3.1", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 822c9f6..d992299 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.0 (2014-07-25) + * @version 1.3.1 (2014-07-31) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -1328,22 +1328,43 @@ if (typeof node === "function") { if (!options.submit.settings.form) { - window.debug('$.validate - Undefined property "options.submit.settings.form" - Validation dropped.'); + + window.Debug.log({ + 'node': node, + 'function': '$.validate()', + 'arguments': '', + 'message': 'Undefined property "options.submit.settings.form - Validation dropped' + }); + + window.Debug.print(); return; } node = $(options.submit.settings.form); if (!node[0]) { - window.debug('$.validate - Unable to find jQuery form element "options.submit.settings.form" - ' + options.submit.settings.form + ' - Validation dropped.'); + window.Debug.log({ + 'node': node, + 'function': '$.validate()', + 'arguments': JSON.stringify(options.submit.settings.form), + 'message': 'Unable to find jQuery form element - Validation dropped' + }); + + window.Debug.print(); return; } } else if (typeof node[0] === 'undefined') { - window.debug('$("' + node['selector'] + '").validate() - Unable to find jQuery element - Validation dropped.'); - return; + window.Debug.log({ + 'node': node, + 'function': '$.validate()', + 'arguments': '$("' + node['selector'] + '").validate()', + 'message': 'Unable to find jQuery form element - Validation dropped' + }); + window.Debug.print(); + return; } return node.each(function () { @@ -1469,12 +1490,28 @@ addError: function (node, error) { if (!window.Validation.form[node.selector]) { - window.debug('$.addError - Invalid node selector - Make sure you are using the same one you initialize the Validation with.'); + + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid node selector' + }); + + window.Debug.print(); return false; } if (typeof error !== "object" || Object.prototype.toString.call(error) !== "[object Object]") { - window.debug('$.addError - Invalid error object.'); + + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid argument, must be type object' + }); + + window.Debug.print(); return false; } @@ -1492,7 +1529,15 @@ input = $(node.selector).find('[name="'+ inputName + '"]'); if (!input[0]) { - window.debug('$.addError - Unable to find [name="' + inputName + '"] inside form: ' + node.selector + '.'); + + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': JSON.stringify(inputName), + 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="'+ inputName + '"]")' + }); + + window.Debug.print(); continue; } @@ -1506,7 +1551,15 @@ for (var i = 0; i < error[inputName].length; i++) { if (typeof error[inputName][i] !== "string") { - window.debug('$.addError - Invalid error object property - Accepted format: {"inputName": "errorString"} or {"inputName": ["errorString", "errorString"]}.'); + + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': JSON.stringify(error[inputName][i]), + 'message': 'ERROR - Invalid error object property - Accepted format: {"inputName": "errorString"} or {"inputName": ["errorString", "errorString"]}' + }); + + window.Debug.print(); continue; } @@ -1538,7 +1591,15 @@ removeError: function (node, inputName) { if (!window.Validation.form[node.selector]) { - window.debug('$.removeError - Invalid node selector - Make sure you are using the same one you initialize the Validation with.'); + + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid node selector' + }); + + window.Debug.print(); return false; } @@ -1548,7 +1609,15 @@ } if (typeof inputName === "object" && Object.prototype.toString.call(inputName) !== "[object Array]") { - window.debug('$.removeError - Invalid inputName array.'); + + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': JSON.stringify(inputName), + 'message': 'ERROR - Invalid inputName, must be type String or Array' + }); + + window.Debug.print(); return false; } @@ -1561,7 +1630,15 @@ input = $(node.selector).find('[name="'+ inputName[i] + '"]'); if (!input[0]) { - window.debug('$.removeError - Unable to find [name="' + inputName[i] + '"] inside form: ' + node.selector + '.'); + + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': JSON.stringify(inputName[i]), + 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="'+ inputName[i] + '"]")' + }); + + window.Debug.print(); continue; } @@ -1573,17 +1650,6 @@ }; - /** - * Creates a fail-safe debugging system inside the console - */ - window.debug = function () { - if (this.console && this.console.debug) { - this.console.debug('DEBUG: ' + Array.prototype.slice.call(arguments)); - } else { - window.log('DEBUG: ' + Array.prototype.slice.call(arguments)); - } - }; - window.Debug = { table: {}, diff --git a/jquery.validation.min.js b/jquery.validation.min.js index beb17a4..7bc147e 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.0 (2014-07-25) + * @version 1.3.1 (2014-07-31) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                  ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                    ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Fri, 1 Aug 2014 13:10:58 -0400 Subject: [PATCH 07/41] 1.3.2 Fixed some debug cases. Removed the Debug code from the minified javascript file jquery.validation.min to reduce it's size by 25% for production environment. --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 16 +++++++++------- jquery.validation.min.js | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index fc4d72b..9340dcd 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.1", + "version": "1.3.2", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index d992299..40d93e6 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.1 (2014-07-31) + * @version 1.3.2 (2014-08-1) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -238,9 +238,9 @@ continue; } - if (options.debug && (!_options[method] || !(options[method] instanceof Object))) { + if (!_options[method] || !(options[method] instanceof Object)) { - window.Debug.log({ + options.debug && window.Debug.log({ 'node': node, 'function': 'extendOptions()', 'arguments': '{' + method + ': ' + JSON.stringify(options[method]) + '}', @@ -327,8 +327,8 @@ 'message': 'OK - Dynamic Validation activated on ' + $(node).length + ' form(s)' }); - if (options.debug && !$(node).find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { - window.Debug.log({ + if ( !$(node).find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': '$(node).find([' + _data.validation + '],[' + _data.regex + '])', @@ -405,14 +405,16 @@ 'message': 'OK - Validation activated on ' + $(node).length + ' form(s)' }); - if (options.debug && !$(node).find(options.submit.settings.button)[0]) { - window.Debug.log({ + if (!$(node).find(options.submit.settings.button)[0]) { + + options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': '$(node).find(' + options.submit.settings.button + ')', 'message': 'ERROR - ' + options.submit.settings.button + ' not found' }); return false; + } $(node).on("submit", false ); diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 7bc147e..e1bf75f 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.1 (2014-07-31) + * @version 1.3.2 (2014-08-1) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true;options.debug&&window.Debug.log({node:node,"function":"extendMessage()",arguments:JSON.stringify(window.Validation.messages),message:"OK - Overriding "+node+" default message(s)"})}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"){continue}if(options.debug&&(!_options[n]||!(options[n]instanceof Object))){window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+n+": "+JSON.stringify(options[n])+"}",message:"WARNING - "+n+" - invalid option"});continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+r+": "+JSON.stringify(options[n][r])+"}",message:"WARNING - "+r+" - invalid option"});continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+i+": "+JSON.stringify(options[n][r][i])+"}",message:"WARNING - "+i.toString()+": "+JSON.stringify(options[n][r][i])+" - unsupported option"});delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(options.debug&&$.inArray(options.debug,_supported["debug"]!==-1)){e.debug=options.debug}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"});return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+$(node).length+" form(s)"});if(options.debug&&!$(node).find(options.submit.settings.button)[0]){window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"$(node).find("+options.submit.settings.button+")",message:"ERROR - "+options.submit.settings.button+" not found"});return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}options.debug&&window.Debug.print();return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"});return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                      ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+e+'"]',message:'ERROR - Unable to find input by name "'+e+'"'});return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)){continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                        ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Sat, 16 Aug 2014 17:24:36 -0400 Subject: [PATCH 08/41] Version 1.3.3 - Fixed issue where the input name was forced into the message. Documentation: http://www.runningcoder.org/jqueryvalidation/documentation/#validation-labels --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 26 +++++++++++++++++--------- jquery.validation.min.js | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 9340dcd..8f20459 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.2", + "version": "1.3.3", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 40d93e6..43f7450 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.2 (2014-08-1) + * @version 1.3.3 (2014-08-16) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -19,6 +19,7 @@ window.Validation = { form: [], messages: null, + labels: null, hasScrolled: false }; @@ -61,9 +62,6 @@ OPTIONAL: /^.*$/, // Validate values or length by comparison COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - // Validate credit card number - //@TODO: Implement this .. - //ZIP: /^(?!([a-y]{1}\d{1}[a-z]{1}[-\s]?\d{1}[a-z]{1}\d{1})$).*$/i.test('g1q b1g') }; /** @@ -101,7 +99,8 @@ validationMessage: 'data-validation-message', regex: 'data-validation-regex', regexMessage: 'data-validation-regex-message', - validationGroup: 'data-validation-group', + group: 'data-validation-group', + label: 'data-validation-label', errorList: 'data-error-list' }; @@ -147,6 +146,7 @@ } }, messages: {}, + labels: {}, debug: false }; @@ -234,7 +234,12 @@ for (var method in options) { - if (!options.hasOwnProperty(method) || method === "debug") { + if (!options.hasOwnProperty(method) || method === "debug" || method === "messages") { + continue; + } + + if (method === "labels" && options[method] instanceof Object) { + tpmOptions[method] = options[method]; continue; } @@ -507,7 +512,10 @@ var value = _getInputValue(input), matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), - inputShortName = matches[matches.length - 1], + inputShortName = window.Validation.labels[inputName] || + options.labels[inputName] || + $(input).attr(_data.label) || + matches[matches.length - 1], validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), @@ -798,7 +806,7 @@ return false; } - group = input.attr(_data.validationGroup); + group = input.attr(_data.group); if (group) { @@ -810,7 +818,7 @@ errorContainer = label; } - //$(node).find('[' + _data.validationGroup + '="' + group + '"]').addClass(options.submit.settings.errorClass) + //$(node).find('[' + _data.group + '="' + group + '"]').addClass(options.submit.settings.errorClass) } else { diff --git a/jquery.validation.min.js b/jquery.validation.min.js index e1bf75f..65fae04 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.2 (2014-08-1) + * @version 1.3.3 (2014-08-16) * * @copyright * Copyright (C) 2014 Tom Bertrand. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",validationGroup:"data-validation-group",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)){continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                          ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.validationGroup);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                            ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Wed, 10 Sep 2014 15:13:38 -0400 Subject: [PATCH 09/41] Version 1.3.4 - Fixed Major issue that would cause a JavaScript error if window.Validation.labels was not declared. - Added {debug} code blocks for easy .min file creation - Added a Demo file inside the project --- demo/demo.html | 169 +++++++++++++ demo/jquery.validation.css | 384 ++++++++++++++++++++++++++++++ demo/loader-medium.gif | Bin 0 -> 4472 bytes html5-form-validation.jquery.json | 2 +- jquery.validation.js | 87 ++++++- jquery.validation.min.js | 6 +- 6 files changed, 639 insertions(+), 9 deletions(-) create mode 100644 demo/demo.html create mode 100644 demo/jquery.validation.css create mode 100644 demo/loader-medium.gif diff --git a/demo/demo.html b/demo/demo.html new file mode 100644 index 0000000..3b9e166 --- /dev/null +++ b/demo/demo.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + +

                            Signup_v1 Demo

                            + + + +
                            + +
                            + +
                            + + + +
                            + * +
                            +
                            +
                            +
                            + +
                            + + + +
                            + * +
                            +
                            +
                            +
                            + +
                            + + + +
                            + * +
                            +
                            +
                            +
                            + +
                            + + + +
                            + * +
                            +
                            +
                            +
                            + +
                            + + + +
                            + * +
                            +
                            +
                            + + + + + +
                            + + + + + \ No newline at end of file diff --git a/demo/jquery.validation.css b/demo/jquery.validation.css new file mode 100644 index 0000000..950a587 --- /dev/null +++ b/demo/jquery.validation.css @@ -0,0 +1,384 @@ +/*------------------------------------*\ + CONTENTS +\*------------------------------------*/ +/* +NORMALIZE BUTTON & INPUT - https://github.com/necolas/normalize.css +LAYOUT +INPUT, BUTTON & LABEL +ERROR +*/ + +/*------------------------------------*\ + NORMALIZE BUTTON & INPUT +\*------------------------------------*/ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + + +/*------------------------------------*\ + LAYOUT +\*------------------------------------*/ + +.validation-form-container { + position: relative; + background-color: #fff; + font-family: "Helvetica Neue", "Helvetica", Arial; + color: rgba(0, 0, 0, 0.7); + font-size: 16px; + padding: 16px; + width: 100%; + max-width: 500px; + border-radius: 4px; + -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset; + box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset; + line-height: 16px; +} + +.validation-form-container * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.validation-form-container :last-child { + margin-bottom: 0em; +} + +.validation-form-container .field { + clear: both; + margin: 0em 0em 1em; +} + +.validation-form-container ul { + list-style: none; + margin: 0.2em 0; + padding: 0; +} + +.validation-form-container .ui.loader.active { + display: block; +} +.validation-form-container .ui.loader { + width: 32px; + height: 32px; + background: url(loader-medium.gif) no-repeat; + background-position: 48% 0px; + display: none; + position: absolute; + top: 50%; + left: 50%; + margin: 0px; + z-index: 1000; + -webkit-transform: translateX(-50%) translateY(-50%); + -ms-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); +} + + +/*------------------------------------*\ + INPUT, BUTTON & LABEL +\*------------------------------------*/ + +.validation-form-container .ui.button { + cursor: pointer; + display: inline-block; + vertical-align: middle; + min-height: 1em; + outline: none; + border: none; + background-color: #FAFAFA; + color: #808080; + margin: 0em; + padding: 0.8em 1.5em; + font-size: 1rem; + text-transform: uppercase; + line-height: 1; + font-weight: bold; + font-style: normal; + text-align: center; + text-decoration: none; + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.05))); + background-image: -webkit-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05)); + background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05)); + border-radius: 0.25em; + -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.08) inset; + box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.08) inset; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-transition: opacity 0.25s ease, background-color 0.25s ease, color 0.25s ease, background 0.25s ease, -webkit-box-shadow 0.25s ease; + transition: opacity 0.25s ease, background-color 0.25s ease, color 0.25s ease, background 0.25s ease, box-shadow 0.25s ease; +} + +.validation-form-container .ui.blue.button { + background-color: #6ECFF5; + color: #FFFFFF; +} + +.validation-form-container .ui.blue.button:hover, +.validation-form-container .ui.blue.button.active { + background-color: #1AB8F3; + color: #FFFFFF; +} + +.validation-form-container .ui.blue.button:active { + background-color: #0AA5DF; + color: #FFFFFF; +} + +.validation-form-container .ui.mini.button { + font-size: 0.8rem; + padding: 0.6em 0.8em; +} + +.validation-form-container .ui.basic.button { + background-color: transparent !important; + background-image: none; + color: #808080 !important; + font-weight: normal; + text-transform: none; + -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset; + box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset; +} + +.validation-form-container .ui.input { + width: 100%; + font-size: 1em; + display: inline-block; + position: relative; + color: rgba(0, 0, 0, 0.7); +} + +.validation-form-container .ui.labeled.input input { + padding-right: 2.5em !important; +} + +.validation-form-container textarea, +.validation-form-container input[type="text"], +.validation-form-container input[type="password"] { + width: 100%; + margin: 0em; + padding: 0.65em 1em; + font-size: 1em; + background-color: #FFFFFF; + border: 1px solid rgba(0, 0, 0, 0.15); + outline: none; + color: rgba(0, 0, 0, 0.7); + border-radius: 0.3125em; + -webkit-transition: background-color 0.3s ease-out, -webkit-box-shadow 0.2s ease, border-color 0.2s ease; + transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease; + -webkit-box-shadow: 0em 0em 0em 0em rgba(0, 0, 0, 0.3) inset; + box-shadow: 0em 0em 0em 0em rgba(0, 0, 0, 0.3) inset; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} + +.validation-form-container textarea:focus, +.validation-form-container input[type="text"]:focus, +.validation-form-container input[type="password"]:focus { + color: rgba(0, 0, 0, 0.85); + border-color: rgba(0, 0, 0, 0.2); + border-bottom-left-radius: 0; + border-top-left-radius: 0; + -webkit-appearance: none; + -webkit-box-shadow: 0.3em 0em 0em 0em rgba(0, 0, 0, 0.2) inset; + box-shadow: 0.3em 0em 0em 0em rgba(0, 0, 0, 0.2) inset; +} + +.validation-form-container textarea[readonly], +.validation-form-container textarea[disabled], +.validation-form-container input[readonly], +.validation-form-container input[disabled] { + cursor: not-allowed; + background-color: #f7f7f7; + color: #999; +} + +.validation-form-container .field > label { + margin: 0em 0em 0.3em; + display: block; + color: #555555; + font-size: 0.875em; + position: relative; +} + +.validation-form-container .ui.label { + display: inline-block; + vertical-align: middle; + margin: -0.25em 0.25em 0em; + background-color: #E8E8E8; + border-color: #E8E8E8; + padding: 0.5em 0.8em; + color: rgba(0, 0, 0, 0.65); + text-transform: uppercase; + font-weight: normal; + border-radius: 0.325em; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: background 0.1s linear; + transition: background 0.1s linear; +} + +.validation-form-container .ui.corner.label { + top: 1px; + right: 1px; + overflow: hidden; + font-size: 0.7em; + border-radius: 0 0.3125em; + background-color: transparent; + position: absolute; + z-index: 10; + margin: 0em; + width: 3em; + height: 3em; + padding: 0em; + text-align: center; + -webkit-transition: color 0.2s ease; + transition: color 0.2s ease; +} + +.validation-form-container .ui.corner.label:after { + position: absolute; + content: ""; + right: 0em; + top: 0em; + z-index: -1; + width: 0em; + height: 0em; + border-top: 0em solid transparent; + border-right: 3em solid transparent; + border-bottom: 3em solid transparent; + border-left: 0em solid transparent; + border-right-color: inherit; + -webkit-transition: border-color 0.2s ease; + transition: border-color 0.2s ease; +} + +.validation-form-container .ui.corner.label .icon { + font-size: 2em; + margin: 0.25em 0 0 0.5em; + width: auto; + display: inline-block; + height: 1em; + font-style: normal; + line-height: 1; + font-weight: normal; + text-decoration: inherit; + text-align: center; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-font-smoothing: antialiased; + font-smoothing: antialiased; +} + + +/*------------------------------------*\ + ERROR +\*------------------------------------*/ + +div.error, +div.error-list, +label.error, +input.error, +select.error { + color: #D95C5C !important; + border-color: #D95C5C !important; +} + + +.validation-form-container .error .corner.label { + border-color: #D95C5C; + color: #FFFFFF; +} \ No newline at end of file diff --git a/demo/loader-medium.gif b/demo/loader-medium.gif new file mode 100644 index 0000000000000000000000000000000000000000..386eb5af1057ba3598c4466de0ed75816a1f9bb1 GIT binary patch literal 4472 zcmd6pX;4#X8int@xe1pfU|7up3Sm`(0*%O~5_V89Y>K!{P|yg7K~WJ=NC*ZbV343J z0Ra(EBO;)U;KJsDpn{@c52Yw*yU=P|w&OPKd=Y4=cB~rzP5z`RRrlsR?|HxP94{YF zdxvlX$N&;SkZiwf@RvbFjbil0Xhmg(yhQ%#&rk9~`N-puhNgx$Z{NrYWp7@;Q5;o_ zJ{vvTcJ}k<&(M#23_p|nJ%WSW*c=a=Synh0JZtzKRaJ#35KH+Ur3?t~YG9mgZ0qbA z$4Yx;AIZv9hgfgJRW?u8%IX--;X%~%6;~)h<_CMK<9&~ZofuGT?fNb8!cc9(qFF^Z zo-`z0i{0Ti{#x+l#A{P4$}9SA_BEVt000ej4TJXv0Y=BAj!z#x0o1-beP_>~1%v=~ zj0#=c)9Dl7&{kpT&ki>CZ_j~vM@=tVolhfDy5d+J8K$ikHfC(W?-m$G?O?Su*pWW3 z>U)Bk@4t#g$2Dnu)g%Iw9(gzdL?|^iHFRI^25Nvr<#e0Q0+roYyMZR48~6Y`0TO>` zsRR~TP)X2@nHKk=j{x1v^??hl7ppX<%cTb zG``(O5!iD;0dxWc;0Le)oDo2zv;^n}EFV4rM!*Gj3b6c;Lts7eC1Br2_L+BY)|;{h z#ehj%NJV|rVV60MuJ+)`BMeD(b+JP9tjl;ULmEitU1rM_eT*IMhBq*-IE04(i`PS# zA~(pKW*Mt^h4td8&ukOW0H(SVlHxjd*Br0-3>#9kN_fILsV&}~NWr}F0}=b>4hKqq zf)6L`tuk>UgrLV=qti)=^(JSU&z?Jfp{2F0z2oAg%U3$Dc3qw@mORN=fD6#U7?jI- zrw^cmH3swOzWHT5_Xfd8CXWHlmv;Irwm}7ciyXmONZ5(+wD?881QYs zhFA13hj0`^^SvXrMcN$i-XY_jIVPlwGwdDSk^40y+{hO6!G138aa`lmJ+p~xE_r2S z2~Q3UZi|LU+aWmF5@x_*Lb1_Kh&UI`w#;Sl@|c2{LZ&3K#Lz0gTw4I+11dG~TNSk@ z>*^a$o&LG;OjEOB!f(|4?p-X2q&&rHumJ=c9$Mq*jWZK3Hw0Vo8`+OTyrbz{&1w*KhQ6 zO%P*~hyg3G5KsbQfT$#XG5Rg2@+$rEK@U@aof;_5Ws&`uoz+&7;qY?zsfP$xeBDmd z(w;n%>qPTy22Im~7Q6RRV!S%xM){)R-rnavch@d+G>XOjdr5rP(%X8znTOQ z#>Z94uC7oWzoT$pxdZ?T5RKs=>GHjX$Zrg(-0MuHM}_PWK4Hp%q}(kVg88Z=uw7JV z;|ZDn@VxDIgYSOlx9(Zvy(uQiTRm4N$~1M+dhyKq8ljh^$?&-sZI~6!a8Jn;YD?iY ze0N($VJ?x%Ga} z%iD|kW;PG)HHPRWE)N4;70zkX9=*BK#0(6JIUe1peQGN7&U~KPJpbBTzOmF_`t7O~ zR?WT;et+8h%PP62JVIB8rc>WpJ!UQmxf5y=c**V*WyW^Sgt*Ch1?msD=0PX}m7pAe z`UB2Ch%C^6KnQ^D18zK^9vqjkAV%kdygGKy{`s}$&s_8Di1j7Bqct(l&+}O~;y2t+ zs0nK4s*!_S*!ISHDo6`g6DsMcYH#qyh?oak%8Ox+8~JTZ0sjVe^sklzuG_JSGM1EM zu{w4OeQ7D*mvDZDTEF>02x>8Bu~LyW`LFaS?S|}94uUympLu$G%9>&2Q zR;Z`ncUp=v@h)|M69c9Jh64lv5o3o5s00I17M0h^ga`8hGyK~XIeu?^=L;VLTFN)W zdztj|b4w}Tn?)Dk!k9V`HG<-CQwDq!il4VO&Lma|boef{x*`j1Vw7HA_Qks3Q2Rdd z_GfUwKU5I{0ok^T5N4^ia+hQ&k~kX=6V^weWH{Y?BF-i?PLXn;0O3o9gJ4%ueE0-N z0U!ti&{O`(f29H61i*K&zW$6CgM|MspgRp|ytqaif+%)qX)R@rT=Zx(fTKq^B+6xL z*=tpZhgl2tpu2&GtnSp2$?MAE=sgcO78shyHCGe)tCI+(1X6Tp(#$Eb{(BHI8OiY{ zs&2KwkvATw^j9J0TJ0sPt8B!plO;1J*eCD&c)I~1KGAN#1i;z@On|Rk_=$EiR&CJz z-`V*AvL%i((+wkXS=D%`6r)0_GL19#HXMl&htJBVy9pxr#*i0Dc*6QAt-(mJn9WXC z8|^9kSWMQN54Y8G7-U;rwFH9t5(a)FA%cqA2$5B{Xp!K6`KW+~5xq*BhzMd=;+{*# z&2u|;I2n-`kW`6iax&SYN@wD-pB&`Mmhz>n0R&}B0p%XJd~>|1ed{Bd1%mwVXGx)J zaP=q|l2&`JWJHz!v+=&ANwo%q-p-NY$Q;|{rMfPDuz>eEIDS?VBvK8~@+MyT)jN*7 zxbU$?f_eB$cRv@2u*T%A9+A6BH^Or@1KSWw#bu()ba8N|h=$wli4as(^B_W$9)9J5 zN(f0e$VKu{B!~9jh<>=5RR5i*Sfe!Pq&XxlZH3LfB|V9n7S#evHbe;}F#ua z=G5FevUR0am~&lI@X&h7!V#$X7L84?U3{^f%ifZAz22k9KzBxr%2rb75@s+#JJ~wj zFj!@$rfZ~>PMoi@X(~PdT~99x5$fVRtcy465aGp@)ik0g1VvO;k;5Sb84afz5Yoay zYNq2b_mtSR9l8^+Dqo{Q2+RVOfh7b^DT~(!WnzPi1y_>LH2A00Ri#y3f$@y#FnZ4# zLmR1(fsDmvd624qG065^v|sF!$*qH@HVZgggIQ|AB~=d87loM*D8~j)tr{G#i@{OO z1k@Mo7&si)Qusb&=aT+w5zT*CSl-w)*TgZ&Vh!DT9Z|H1wwlkjL!=sJc00)n)3o4K z`D(>>C@k|`<*bQY?S^p7BiG6(WwoacIS|mQwS+p-L_Ggbwc{x73reSF*_Lj0%f;O; zJWel+P~$uL$u7>qRD)*XR275G*E3TT{S+j@ftHc)loR8%_K=kb#sbB+(z^-UdJgw< zbyi+h({#JUV^TO3-%K1w5D@bE=voI@LlByE%f9EX6l$p z40f!R=1}L91ud{QSs*X8UJ4(KFjcr{;5_S)MwC-`f}$6%XkB`a0W%kDuF;&p`flsk zE8nY;-}PAtLD@6pk-11#d`hjpz$-`UE$DuF#N;{MY{~r9`oA8#?DL*AkHPnjp*h+_ z@NHA(6icYNQQ=#o26)c~c9xcg>qmu6lk`UFIyu)=XjnfQbZWX+aI-nAy5BS&CWz~8 u2XuHG_cYC3`*?!kgVsM}ytN@g4*Lpp#BpyO+HL3=#-;S5VgK*t!|6Y15pcHv literal 0 HcmV?d00001 diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 8f20459..2e40d98 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.3", + "version": "1.3.4", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 43f7450..168f6c3 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,24 +2,27 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.3 (2014-08-16) + * @version 1.3.4 (2014-09-10) * * @copyright - * Copyright (C) 2014 Tom Bertrand. + * Copyright (C) 2014 RunningCoder. * * @link * http://www.runningcoder.org/jqueryvalidation/ * * @license * Licensed under the MIT license. + * + * @note + * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ (function (window, document, $, undefined) { window.Validation = { form: [], - messages: null, - labels: null, + messages: {}, + labels: {}, hasScrolled: false }; @@ -206,12 +209,14 @@ _extendedMessages = true; + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'extendMessage()', 'arguments': JSON.stringify(window.Validation.messages), 'message': 'OK - Overriding ' + node + ' default message(s)' }); + // {/debug} } @@ -245,12 +250,14 @@ if (!_options[method] || !(options[method] instanceof Object)) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'extendOptions()', 'arguments': '{' + method + ': ' + JSON.stringify(options[method]) + '}', 'message': 'WARNING - ' + method + ' - invalid option' }); + // {/debug} continue; } @@ -262,12 +269,14 @@ if (!_options[method][type] || !(options[method][type] instanceof Object)) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'extendOptions()', 'arguments': '{' + type + ': ' + JSON.stringify(options[method][type]) + '}', 'message': 'WARNING - ' + type + ' - invalid option' }); + // {/debug} continue; } @@ -282,12 +291,14 @@ _supported[method][type][option] && $.inArray(options[method][type][option], _supported[method][type][option]) === -1) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'extendOptions()', 'arguments': '{' + option + ': ' + JSON.stringify(options[method][type][option]) + '}', 'message': 'WARNING - ' + option.toString() + ': ' + JSON.stringify(options[method][type][option]) + ' - unsupported option' }); + // {/debug} delete options[method][type][option]; } @@ -299,9 +310,11 @@ } } + // {debug} if (options.debug && $.inArray(options.debug, _supported['debug'] !== -1)) { tpmOptions.debug = options.debug; } + // {/debug} // @TODO Would there be a better fix to solve event conflict? if (tpmOptions.dynamic.settings.trigger) { @@ -325,20 +338,26 @@ return false; } + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': JSON.stringify(options), 'message': 'OK - Dynamic Validation activated on ' + $(node).length + ' form(s)' }); + // {/debug} if ( !$(node).find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': '$(node).find([' + _data.validation + '],[' + _data.regex + '])', 'message': 'ERROR - [' + _data.validation + '] not found' }); + // {/debug} + return false; } @@ -403,21 +422,26 @@ var event = options.submit.settings.trigger + '.vd'; + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateValidation()', 'arguments': JSON.stringify(options), 'message': 'OK - Validation activated on ' + $(node).length + ' form(s)' }); + // {/debug} if (!$(node).find(options.submit.settings.button)[0]) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': '$(node).find(' + options.submit.settings.button + ')', 'message': 'ERROR - ' + options.submit.settings.button + ' not found' }); + // {/debug} + return false; } @@ -448,7 +472,9 @@ } + // {debug} options.debug && window.Debug.print(); + // {/debug} return false; @@ -499,12 +525,14 @@ if (!inputName) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'validateInput()', 'arguments': '$(input).attr("name")', 'message': 'ERROR - Missing input [name]' }); + // {/debug} return false; } @@ -597,12 +625,14 @@ } catch (error) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'validateInput()', 'arguments': '{pattern: {' + pattern + '}, modifier: {' + patternModifier+ '}', 'message': 'WARNING - Invalid [data-validation-regex] on input ' + inputName }); + // {/debug} // Do not block validation if a regexp is bad, only skip it return true; @@ -659,12 +689,14 @@ if (!comparison || comparison.length !== 4) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'validateRule()', 'arguments': 'value: ' + value + ' rule: ' + rule, 'message': 'WARNING - Invalid comparison' }); + // {/debug} return; } @@ -682,12 +714,14 @@ // Only numeric value for "L" are allowed if (isNaN(compared)) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'validateRule()', 'arguments': 'compare: ' + compared + ' rule: ' + rule, 'message': 'WARNING - Invalid rule, "L" compare must be numeric' }); + // {/debug} return false; @@ -711,12 +745,14 @@ comparedValue = $(node).find('[name="' + compared + '"]').val(); if (!comparedValue) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'validateRule()', 'arguments': 'compare: ' + compared + ' rule: ' + rule, 'message': 'WARNING - Unable to find compared field [name="' + compared + '"]' }); + // {/debug} return false; } @@ -796,12 +832,14 @@ if (!input[0]) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'displayOneError()', 'arguments': '[name="' + inputName + '"]', 'message': 'ERROR - Unable to find input by name "' + inputName + '"' }); + // {/debug} return false; } @@ -965,12 +1003,14 @@ if (!input[0]) { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'resetOneError()', 'arguments': '[name="' + inputName + '"]', 'message': 'ERROR - Unable to find input by name "' + inputName + '"' }); + // {/debug} return false; } @@ -1096,12 +1136,14 @@ if (!_isValid || typeof _callback !== "function") { + // {debug} options.debug && window.Debug.log({ 'node': node, 'function': '_executeCallback()', 'arguments': JSON.stringify(callback), 'message': 'WARNING - Invalid callback function"' }); + // {/debug} return false; } @@ -1125,7 +1167,9 @@ delegateDynamicValidation(); delegateValidation(); + // {debug} options.debug && window.Debug.print(); + // {/debug} }(); @@ -1339,6 +1383,7 @@ if (!options.submit.settings.form) { + // {debug} window.Debug.log({ 'node': node, 'function': '$.validate()', @@ -1347,12 +1392,16 @@ }); window.Debug.print(); + // {/debug} + return; } node = $(options.submit.settings.form); if (!node[0]) { + + // {debug} window.Debug.log({ 'node': node, 'function': '$.validate()', @@ -1361,11 +1410,14 @@ }); window.Debug.print(); + // {/debug} + return; } } else if (typeof node[0] === 'undefined') { + // {debug} window.Debug.log({ 'node': node, 'function': '$.validate()', @@ -1374,6 +1426,8 @@ }); window.Debug.print(); + // {/debug} + return; } @@ -1501,6 +1555,7 @@ if (!window.Validation.form[node.selector]) { + // {debug} window.Debug.log({ 'node': node, 'function': '$.addError()', @@ -1509,11 +1564,14 @@ }); window.Debug.print(); + // {/debug} + return false; } if (typeof error !== "object" || Object.prototype.toString.call(error) !== "[object Object]") { + // {debug} window.Debug.log({ 'node': node, 'function': '$.addError()', @@ -1522,6 +1580,8 @@ }); window.Debug.print(); + // {/debug} + return false; } @@ -1540,6 +1600,7 @@ input = $(node.selector).find('[name="'+ inputName + '"]'); if (!input[0]) { + // {debug} window.Debug.log({ 'node': node, 'function': '$.addError()', @@ -1548,6 +1609,8 @@ }); window.Debug.print(); + // {/debug} + continue; } @@ -1562,6 +1625,7 @@ if (typeof error[inputName][i] !== "string") { + // {debug} window.Debug.log({ 'node': node, 'function': '$.addError()', @@ -1570,6 +1634,8 @@ }); window.Debug.print(); + // {/debug} + continue; } @@ -1602,6 +1668,7 @@ if (!window.Validation.form[node.selector]) { + // {debug} window.Debug.log({ 'node': node, 'function': '$.removeError()', @@ -1610,6 +1677,8 @@ }); window.Debug.print(); + // {/debug} + return false; } @@ -1620,6 +1689,7 @@ if (typeof inputName === "object" && Object.prototype.toString.call(inputName) !== "[object Array]") { + // {debug} window.Debug.log({ 'node': node, 'function': '$.removeError()', @@ -1628,6 +1698,8 @@ }); window.Debug.print(); + // {/debug} + return false; } @@ -1641,6 +1713,7 @@ input = $(node.selector).find('[name="'+ inputName[i] + '"]'); if (!input[0]) { + // {debug} window.Debug.log({ 'node': node, 'function': '$.removeError()', @@ -1649,6 +1722,8 @@ }); window.Debug.print(); + // {/debug} + continue; } @@ -1660,6 +1735,7 @@ }; + // {debug} window.Debug = { table: {}, @@ -1709,10 +1785,11 @@ } }; + // {/debug} String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); - } + }; /** * Creates a String from a JSON object diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 65fae04..a2c21f8 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,10 +2,10 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.3 (2014-08-16) + * @version 1.3.4 (2014-09-10) * * @copyright - * Copyright (C) 2014 Tom Bertrand. + * Copyright (C) 2014 RunningCoder. * * @link * http://www.runningcoder.org/jqueryvalidation/ @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,labels:null,hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{}};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}}};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                              ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Wed, 10 Sep 2014 22:17:56 -0400 Subject: [PATCH 10/41] Version 1.3.5 - Fixes #2 Major error that would cause a JS error if options.debug was not declared inside the non-minified file --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 13 ++----------- jquery.validation.min.js | 4 ++-- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 2e40d98..f9770ae 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.4", + "version": "1.3.5", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 168f6c3..5ddbd41 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.4 (2014-09-10) + * @version 1.3.5 (2014-09-10) * * @copyright * Copyright (C) 2014 RunningCoder. @@ -21,7 +21,7 @@ window.Validation = { form: [], - messages: {}, + messages: null, labels: {}, hasScrolled: false }; @@ -209,15 +209,6 @@ _extendedMessages = true; - // {debug} - options.debug && window.Debug.log({ - 'node': node, - 'function': 'extendMessage()', - 'arguments': JSON.stringify(window.Validation.messages), - 'message': 'OK - Overriding ' + node + ' default message(s)' - }); - // {/debug} - } /** diff --git a/jquery.validation.min.js b/jquery.validation.min.js index a2c21f8..846c417 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.4 (2014-09-10) + * @version 1.3.5 (2014-09-10) * * @copyright * Copyright (C) 2014 RunningCoder. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:{},labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                  ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                    ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Tue, 16 Sep 2014 13:24:34 -0400 Subject: [PATCH 11/41] changed $(node) to node inside the validation class --- jquery.validation.js | 73 +++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 5ddbd41..e9f090e 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -334,17 +334,17 @@ 'node': node, 'function': 'delegateDynamicValidation()', 'arguments': JSON.stringify(options), - 'message': 'OK - Dynamic Validation activated on ' + $(node).length + ' form(s)' + 'message': 'OK - Dynamic Validation activated on ' + node.length + ' form(s)' }); // {/debug} - if ( !$(node).find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + if ( !node.find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', - 'arguments': '$(node).find([' + _data.validation + '],[' + _data.regex + '])', + 'arguments': 'node.find([' + _data.validation + '],[' + _data.regex + '])', 'message': 'ERROR - [' + _data.validation + '] not found' }); // {/debug} @@ -359,7 +359,7 @@ } $.each( - $(node).find('[' + _data.validation + '],[' + _data.regex + ']'), + node.find('[' + _data.validation + '],[' + _data.regex + ']'), function (index, input) { $(input).unbind(event).on(event, function (e) { @@ -395,14 +395,6 @@ ) } - var _typeWatch = (function(){ - var timer = 0; - return function(callback, ms){ - clearTimeout (timer); - timer = setTimeout(callback, ms); - } - })(); - /** * Delegates the submit validation on data-validation and data-validation-regex attributes based on trigger. * Note: Disable the form submit function so the callbacks are not by-passed @@ -418,17 +410,17 @@ 'node': node, 'function': 'delegateValidation()', 'arguments': JSON.stringify(options), - 'message': 'OK - Validation activated on ' + $(node).length + ' form(s)' + 'message': 'OK - Validation activated on ' + node.length + ' form(s)' }); // {/debug} - if (!$(node).find(options.submit.settings.button)[0]) { + if (!node.find(options.submit.settings.button)[0]) { // {debug} options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', - 'arguments': '$(node).find(' + options.submit.settings.button + ')', + 'arguments': 'node.find(' + options.submit.settings.button + ')', 'message': 'ERROR - ' + options.submit.settings.button + ' not found' }); // {/debug} @@ -437,8 +429,8 @@ } - $(node).on("submit", false ); - $(node).find(options.submit.settings.button).unbind(event).on(event, function (e) { + node.on("submit", false); + node.find(options.submit.settings.button).unbind(event).on(event, function (e) { e.preventDefault(); @@ -484,7 +476,7 @@ var isValid = true; $.each( - $(node).find('[' + _data.validation + '],[' + _data.regex + ']'), + node.find('[' + _data.validation + '],[' + _data.regex + ']'), function (index, input) { if ($(this).is(':disabled')) { @@ -733,7 +725,7 @@ // Compare Field values if (isNaN(compared)) { - comparedValue = $(node).find('[name="' + compared + '"]').val(); + comparedValue = node.find('[name="' + compared + '"]').val(); if (!comparedValue) { // {debug} @@ -817,7 +809,7 @@ return false; } - input = $(node).find('[name="' + inputName + '"]'); + input = node.find('[name="' + inputName + '"]'); label = null; @@ -839,15 +831,15 @@ if (group) { - groupInput = $(node).find('[name="' + inputName + '"]'); - label = $(node).find('[id="' + group + '"]'); + groupInput = node.find('[name="' + inputName + '"]'); + label = node.find('[id="' + group + '"]'); if (label[0]) { label.addClass(options.submit.settings.errorClass); errorContainer = label; } - //$(node).find('[' + _data.group + '="' + group + '"]').addClass(options.submit.settings.errorClass) + //node.find('[' + _data.group + '="' + group + '"]').addClass(options.submit.settings.errorClass) } else { @@ -860,7 +852,7 @@ inputId = input.attr('id'); if (inputId) { - label = $(node).find('label[for="' + inputId + '"]')[0]; + label = node.find('label[for="' + inputId + '"]')[0]; } if (!label) { @@ -876,7 +868,7 @@ if (options.submit.settings.display === 'inline') { errorContainer = errorContainer || input.parent(); } else if (options.submit.settings.display === 'block') { - errorContainer = $(node); + errorContainer = node; } // Prevent double error list if the previous one has not been cleared. @@ -990,7 +982,7 @@ } else { if (!input) { - input = $(node).find('[name="' + inputName + '"]'); + input = node.find('[name="' + inputName + '"]'); if (!input[0]) { @@ -1022,18 +1014,20 @@ errors = []; window.Validation.hasScrolled = false; - $(node).find('[' + _data.errorList + ']').remove(); - $(node).find('.' + options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass); + node.find('[' + _data.errorList + ']').remove(); + node.find('.' + options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass); } /** * Submits the form once it succeeded the validation process. - * Note: This function will be overridden if "options.submit.settings.onSubmit" is defined + * Note: + * - This function will be overridden if "options.submit.settings.onSubmit" is defined + * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead */ function submitForm () { - node.submit(); + node[0].submit() } @@ -1055,7 +1049,7 @@ value = ($(input).is(':checked')) ? 1 : ''; break; case 'radio': - value = $(node).find('input[name="' + $(input).attr('name') + '"]:checked').val() || ''; + value = node.find('input[name="' + $(input).attr('name') + '"]:checked').val() || ''; break; default: value = $(input).val(); @@ -1066,6 +1060,19 @@ }; + /** + * @private + * Execute function once the timer is reached. + * If the function is recalled before the timer ends, the first call will be canceled. + */ + var _typeWatch = (function(){ + var timer = 0; + return function(callback, ms){ + clearTimeout (timer); + timer = setTimeout(callback, ms); + } + })(); + /** * @private * Executes an anonymous function or a string reached from the window scope. @@ -1423,9 +1430,7 @@ } return node.each(function () { - - window.Validation.form[node.selector] = new Validation(this, options); - + window.Validation.form[node.selector] = new Validation($(this), options); }); }, From e27fb7e3db8342b1a8a5f1ff7712d8d629004c41 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Sun, 28 Sep 2014 12:23:14 -0400 Subject: [PATCH 12/41] Version 1.4.0 - Added destroy method Note - node now refers to a jQuery object instead of the DOM object. --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 224 +++++++++++++++++++----------- jquery.validation.min.js | 4 +- 3 files changed, 145 insertions(+), 85 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index f9770ae..7e7f06a 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.3.5", + "version": "1.4.0", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index e9f090e..404ea7c 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.5 (2014-09-10) + * @version 1.4.0 (2014-09-28) * * @copyright * Copyright (C) 2014 RunningCoder. @@ -72,25 +72,25 @@ * Error messages */ var _messages = Object.preventExtensions({ - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'NUMERIC': '$ must be numeric.', - 'STRING': '$ must be a string.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - //'INARRAY': '$ is not a valid option.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }), + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'NUMERIC': '$ must be numeric.', + 'STRING': '$ must be a string.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + //'INARRAY': '$ is not a valid option.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }), _extendedMessages = false; /** @@ -113,45 +113,45 @@ * * @link http://www.runningcoder.org/jqueryvalidation/documentation/ */ - var _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "input[type='submit']", - errorClass: "error", - errorListClass: "error-list", - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } - }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } - }, - messages: {}, - labels: {}, - debug: false - }; + var _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "input[type='submit']", + errorClass: "error", + errorListClass: "error-list", + inputContainer: null, + clear: "focusin", + scrollToError: false + }, + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 + }, + callback: { + onSuccess: null, + onError: null, + onComplete: null + } + }, + messages: {}, + labels: {}, + debug: false + }; /** * @private @@ -191,8 +191,11 @@ */ var Validation = function (node, options) { - var errors = []; - window.Validation.hasScrolled = false; + var errors = [], + delegateSuffix = ".vd", // validation.delegate + resetSuffix = ".vr"; // validation.resetError + + window.Validation.hasScrolled = false; /** * Extends user-defined "message" into the default Validation "_message". @@ -352,10 +355,9 @@ return false; } - var namespace = ".vd", // validation.delegate - event = options.dynamic.settings.trigger + namespace; + var event = options.dynamic.settings.trigger + delegateSuffix; if (options.dynamic.settings.trigger !== "focusout") { - event += " change" + namespace + " paste" + namespace; + event += " change" + delegateSuffix + " paste" + delegateSuffix; } $.each( @@ -419,9 +421,9 @@ // {debug} options.debug && window.Debug.log({ 'node': node, - 'function': 'delegateDynamicValidation()', - 'arguments': 'node.find(' + options.submit.settings.button + ')', - 'message': 'ERROR - ' + options.submit.settings.button + ' not found' + 'function': 'delegateValidation()', + 'arguments': '{button: ' + options.submit.settings.button + '}', + 'message': 'ERROR - node.find("' + options.submit.settings.button + '") not found' }); // {/debug} @@ -524,9 +526,9 @@ matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), inputShortName = window.Validation.labels[inputName] || - options.labels[inputName] || - $(input).attr(_data.label) || - matches[matches.length - 1], + options.labels[inputName] || + $(input).attr(_data.label) || + matches[matches.length - 1], validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), @@ -744,9 +746,8 @@ throw [options.messages[operator].replace(' characters', ''), compared]; } - // Compare numeric value } else { - + // Compare numeric value if (!value || isNaN(value) || !eval(value + operator + parseFloat(compared))) { throw [options.messages[operator].replace(' characters', ''), compared]; } @@ -878,7 +879,7 @@ if (options.submit.settings.display === "inline" || (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) - ) { + ) { if (options.submit.settings.insertion === 'append') { errorContainer.append(html); } else if (options.submit.settings.insertion === 'prepend') { @@ -896,15 +897,14 @@ input = groupInput; } - var namespace = ".vr", //validation.resetError - event = "coucou" + namespace; + var event = "coucou" + resetSuffix; if (options.submit.settings.clear) { - event += " " + options.submit.settings.clear + namespace + event += " " + options.submit.settings.clear + resetSuffix } if (options.dynamic.settings.trigger) { - event += " " + options.dynamic.settings.trigger + namespace; + event += " " + options.dynamic.settings.trigger + resetSuffix; if (options.dynamic.settings.trigger !== "focusout") { - event += " change" + namespace + " paste" + namespace; + event += " change" + resetSuffix + " paste" + resetSuffix; } } @@ -999,9 +999,7 @@ } } - //$._data( input[0], "events" ); - input.trigger('coucou.vr'); - + input.trigger('coucou' + resetSuffix); } } @@ -1031,6 +1029,38 @@ } + /** + * Submits the form once it succeeded the validation process. + * Note: + * - This function will be overridden if "options.submit.settings.onSubmit" is defined + * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead + * + * @returns {boolean} + */ + function destroy () { + + var event = options.submit.settings.trigger + delegateSuffix; + + if (options.dynamic.settings.trigger) { + event += " " + options.dynamic.settings.trigger + delegateSuffix; + if (options.dynamic.settings.trigger !== "focusout") { + event += " change" + delegateSuffix + " paste" + delegateSuffix; + } + } + + $.each( + node.find('[' + _data.validation + '],[' + _data.regex + ']'), + function (i, v) { + $(v).unbind(event); + } + ); + + //delete window.Validation.form[node.selector]; + + return true; + + } + /** * @private * Helper to get the value of an regular, radio or chackbox input @@ -1206,7 +1236,13 @@ * @public * Remove all errors */ - resetErrors: resetErrors + resetErrors: resetErrors, + + /** + * @public + * Destroy the Validation instance + */ + destroy: destroy }; @@ -1429,6 +1465,30 @@ return; } + if (options === "destroy") { + + if (!window.Validation.form[node.selector]) { + + // {debug} + window.Debug.log({ + 'node': node, + 'function': '$.validate("destroy")', + 'arguments': '', + 'message': 'Unable to destroy "' + node.selector + '", perhaps it\'s already destroyed?' + }); + + window.Debug.print(); + // {/debug} + + return; + } + + window.Validation.form[node.selector].destroy(); + + return; + + } + return node.each(function () { window.Validation.form[node.selector] = new Validation($(this), options); }); diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 846c417..fcede81 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -2,7 +2,7 @@ * jQuery Form Validation * * @author Tom Bertrand - * @version 1.3.5 (2014-09-10) + * @version 1.4.0 (2014-09-28) * * @copyright * Copyright (C) 2014 RunningCoder. @@ -13,4 +13,4 @@ * @license * Licensed under the MIT license. */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!$(node).find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=".vd",t=options.dynamic.settings.trigger+e;if(options.dynamic.settings.trigger!=="focusout"){t+=" change"+e+" paste"+e}$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(e,n){$(n).unbind(t).on(t,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!$(node).find(options.submit.settings.button)[0]){return false}$(node).on("submit",false);$(node).find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each($(node).find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                      ",o,u;if(!errors.hasOwnProperty(e)){return false}t=$(node).find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=$(node).find('[name="'+e+'"]');i=$(node).find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=$(node).find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=$(node)}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f=".vr",l="coucou"+f;if(options.submit.settings.clear){l+=" "+options.submit.settings.clear+f}if(options.dynamic.settings.trigger){l+=" "+options.dynamic.settings.trigger+f;if(options.dynamic.settings.trigger!=="focusout"){l+=" change"+f+" paste"+f}}t.unbind(l).on(l,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var c=parseFloat(options.submit.settings.scrollToError.offset)||0,h=parseFloat(options.submit.settings.scrollToError.duration)||500,p=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:p.offset().top+c},h)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=$(node).find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou.vr")}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;$(node).find("["+_data.errorList+"]").remove();$(node).find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node.submit()}var errors=[];window.Validation.hasScrolled=false;var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=$(node).find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                        ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Mon, 26 Jan 2015 20:15:30 -0500 Subject: [PATCH 13/41] - Default type="submit" is not an imput anymore - Don't validate readonly or disabled inputs - Make sure the notre is a "form" else drop validation --- jquery.validation.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 404ea7c..a2d40e5 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -121,7 +121,7 @@ insertion: "append", allErrors: false, trigger: "click", - button: "input[type='submit']", + button: "[type='submit']", errorClass: "error", errorListClass: "error-list", inputContainer: null, @@ -478,7 +478,7 @@ var isValid = true; $.each( - node.find('[' + _data.validation + '],[' + _data.regex + ']'), + node.find('[' + _data.validation + ']:not([readonly], [disabled]),[' + _data.regex + ']:not([readonly], [disabled])'), function (index, input) { if ($(this).is(':disabled')) { @@ -747,7 +747,7 @@ } } else { - // Compare numeric value + // Compare numeric value if (!value || isNaN(value) || !eval(value + operator + parseFloat(compared))) { throw [options.messages[operator].replace(' characters', ''), compared]; } @@ -879,7 +879,7 @@ if (options.submit.settings.display === "inline" || (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) - ) { + ) { if (options.submit.settings.insertion === 'append') { errorContainer.append(html); } else if (options.submit.settings.insertion === 'prepend') { @@ -1433,11 +1433,10 @@ node = $(options.submit.settings.form); - if (!node[0]) { + if (!node[0] || node[0].nodeName.toLowerCase() !== "form") { // {debug} window.Debug.log({ - 'node': node, 'function': '$.validate()', 'arguments': JSON.stringify(options.submit.settings.form), 'message': 'Unable to find jQuery form element - Validation dropped' From c4bca32a31361254888925a7d486ea2969cd3572 Mon Sep 17 00:00:00 2001 From: t_bertrand Date: Tue, 3 Feb 2015 18:53:47 -0500 Subject: [PATCH 14/41] Version 1.5.0 - Added $.addValidationRule to globally add a regex rule (ex: FILENAME see commence inside the code) - Modified NUMERIC regex (to match ex: 1,000.00 or 1000) - Added INTEGER regex - Added flexibility on data-validation-regex attribute --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 215 ++++++++++++++++++++++-------- jquery.validation.min.js | 16 +-- 3 files changed, 165 insertions(+), 68 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 7e7f06a..94820c9 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.4.0", + "version": "1.5.0", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index a2d40e5..6b8ce85 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -1,22 +1,16 @@ /** * jQuery Form Validation + * Copyright (C) 2014 RunningCoder.org + * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.4.0 (2014-09-28) - * - * @copyright - * Copyright (C) 2014 RunningCoder. - * - * @link - * http://www.runningcoder.org/jqueryvalidation/ - * - * @license - * Licensed under the MIT license. + * @version 1.5.0 (2015-02-03) + * @link http://www.runningcoder.org/jqueryvalidation/ * * @note * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -(function (window, document, $, undefined) +;(function (window, document, $, undefined) { window.Validation = { @@ -45,8 +39,10 @@ var _rules = { // Validate not empty NOTEMPTY: /./, + // Validate an integer + INTEGER: /^\d+$/, // Validate a numeric - NUMERIC: /^[0-9]+$/, + NUMERIC: /^\d+(?:,\d{3})?(?:\.\d+)?$/, // Validate an alphanumeric string (no special chars) MIXED: /^[\w\s-]+$/, // Validate a spaceless string @@ -71,10 +67,11 @@ * @private * Error messages */ - var _messages = Object.preventExtensions({ + var _messages = { 'default': '$ contain error(s).', 'NOTEMPTY': '$ must not be empty.', 'NUMERIC': '$ must be numeric.', + 'INTEGER': '$ must be an integer.', 'STRING': '$ must be a string.', 'NOSPACE': '$ must not contain spaces.', 'TRIM': '$ must not start or end with space character.', @@ -90,7 +87,7 @@ '>=': '$ must be greater or equal to % characters.', '==': '$ must be equal to %', '!=': '$ must be different than %' - }), + }, _extendedMessages = false; /** @@ -578,50 +575,11 @@ // Validates the "data-validation-regex" if (validationRegex) { - var pattern = validationRegex.split('/'); - - if (pattern.length > 1) { - - var tmpPattern = ""; - - // Do not loop through the last item knowing its a potential modifier - for (var k = 0; k < pattern.length - 1; k++) { - if (pattern[k] !== "") { - tmpPattern += pattern[k] + '/'; - } - } - // Remove last added "/" - tmpPattern = tmpPattern.slice(0, -1); - - // Test the last item for modifier(s) - if (/[gimsxeU]+/.test(pattern[pattern.length - 1])) { - var patternModifier = pattern[pattern.length - 1]; - } - - pattern = tmpPattern; - } else { - pattern = pattern[0]; - } - - // Validate the regex - try { - - var rule = new RegExp(pattern, patternModifier); - - } catch (error) { - - // {debug} - options.debug && window.Debug.log({ - 'node': node, - 'function': 'validateInput()', - 'arguments': '{pattern: {' + pattern + '}, modifier: {' + patternModifier+ '}', - 'message': 'WARNING - Invalid [data-validation-regex] on input ' + inputName - }); - // {/debug} + var rule = _buildRegexFromString(validationRegex); - // Do not block validation if a regexp is bad, only skip it + // Do not block validation if a regexp is bad, only skip it + if (!(rule instanceof RegExp)) { return true; - } try { @@ -1328,6 +1286,27 @@ }; + /** + * @public + * jQuery public function to add a validation rule. + * + * @example + * $.addValidationRule( + * 'FILENAME', + * /^[^\\/:\*\?<>\|\"\']*$/, + * '$ has an invalid filename.' + * ) + * + * @param {string} name + * @param {regex} rule + * @param {string} message + */ + $.fn.addValidationRule = $.addValidationRule = function (name, rule, message) { + + return _api.addValidationRule(this, name, rule, message); + + }; + // ================================================================================================================= /** @@ -1786,10 +1765,134 @@ } + }, + + /** + * API method to add a validation rule. + * + * @example + * $.addValidationRule( + * 'FILENAME', + * /^[^\\/:\*\?<>\|\"\']*$/, + * '$ has an invalid filename.' + * ) + * + * @param {object} node + * @param {string} name + * @param {regex} rule + * @param {string} message + */ + addValidationRule: function (node, name, rule, message) { + + if (!name || !rule || !message) { + // {debug} + window.Debug.log({ + 'node': node, + 'function': '$.addValidationRule(name, rule, message)', + 'arguments': JSON.stringify({node: node, rule: rule, message: message}), + 'message': 'ERROR - Missing one or multiple parameter(s)' + }); + + window.Debug.print(); + // {/debug} + return false; + } + + rule = _buildRegexFromString(rule); + + if (!(rule instanceof RegExp)) { + // {debug} + window.Debug.log({ + 'node': node, + 'function': '$.addValidationRule(rule)', + 'arguments': rule.toString(), + 'message': 'ERROR - Invalid rule' + }); + + window.Debug.print(); + // {/debug} + return false; + } + + name = name.toUpperCase(); + + _rules[name] = rule; + _messages[name] = message; + + return true; + } }; + /** + * @private + * Converts string into a regex + * + * @param {String|Object} regex + * @returns {Object|Boolean} rule + */ + function _buildRegexFromString(regex) { + + if (!regex || (typeof regex !== "string" && !(regex instanceof RegExp))) { + _regexDebug(); + return false; + } + + if (typeof regex !== 'string') { + regex = regex.toString(); + } + + var separator = regex.charAt(0), + index = regex.length - 1, + pattern, + modifier, + rule; + + while (index > 0) { + if (/[gimsxeU]/.test(regex.charAt(index))) { + index--; + } else { + break; + } + } + + if (regex.charAt(index) !== separator) { + separator = null; + } + + if (separator && index !== regex.length - 1) { + modifier = regex.substr(index + 1, regex.length - 1); + } + + if (separator) { + pattern = regex.substr(1, index - 1); + } else { + pattern = regex; + } + + try { + rule = new RegExp(pattern, modifier); + } catch (error) { + _regexDebug(); + return false; + } + + return rule; + + function _regexDebug() { + // {debug} + window.Debug.log({ + 'function': '_buildRegexFromString()', + 'arguments': '{pattern: {' + (pattern || '') + '}, modifier: {' + (modifier || '') + '}', + 'message': 'WARNING - Invalid regex given: ' + regex + }); + window.Debug.print(); + // {/debug} + } + + } + // {debug} window.Debug = { diff --git a/jquery.validation.min.js b/jquery.validation.min.js index fcede81..6cc0dd4 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -1,16 +1,10 @@ /** * jQuery Form Validation + * Copyright (C) 2014 RunningCoder.org + * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.4.0 (2014-09-28) - * - * @copyright - * Copyright (C) 2014 RunningCoder. - * - * @link - * http://www.runningcoder.org/jqueryvalidation/ - * - * @license - * Licensed under the MIT license. + * @version 1.5.0 (2015-02-03) + * @link http://www.runningcoder.org/jqueryvalidation/ */ -(function(window,document,$,undefined){window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,NUMERIC:/^[0-9]+$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages=Object.preventExtensions({"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"}),_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"input[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=u.split("/");if(l.length>1){var c="";for(var h=0;h
                                          ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:,\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){if(!_rules[rule].test(value)){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules["COMPARISON"]);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))==false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                            ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Wed, 4 Feb 2015 18:16:27 -0500 Subject: [PATCH 15/41] - Changed $.addValidationRule function to allow multiple addition at once - Fixed NOSPACE rule - Fixed few jshint warnings --- jquery.validation.js | 313 +++++++++++++++++++-------------------- jquery.validation.min.js | 5 +- 2 files changed, 159 insertions(+), 159 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 6b8ce85..13c4de4 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -24,7 +24,7 @@ * Fail-safe preventExtensions function for older browsers */ if (typeof Object.preventExtensions !== "function") { - Object.preventExtensions = function (obj) { return obj; } + Object.preventExtensions = function (obj) { return obj; }; } // Not using strict to avoid throwing a window error on bad config extend. @@ -37,37 +37,25 @@ * RegExp rules */ var _rules = { - // Validate not empty - NOTEMPTY: /./, - // Validate an integer - INTEGER: /^\d+$/, - // Validate a numeric - NUMERIC: /^\d+(?:,\d{3})?(?:\.\d+)?$/, - // Validate an alphanumeric string (no special chars) - MIXED: /^[\w\s-]+$/, - // Validate a spaceless string - NOSPACE: /^[^\s]+$/, - // Validate a spaceless string at start or end - TRIM: /^[^\s].*[^\s]$/, - // Validate a date YYYY-MM-DD - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - // Validate an email - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - // Validate an url - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - // Validate a north american phone number - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - // Validate value if it is not empty - OPTIONAL: /^.*$/, - // Validate values or length by comparison - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }; + NOTEMPTY: /./, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NOSPACE: /\s/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /^.*$/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }, - /** - * @private - * Error messages - */ - var _messages = { + /** + * @private + * Error messages + */ + _messages = { 'default': '$ contain error(s).', 'NOTEMPTY': '$ must not be empty.', 'NUMERIC': '$ must be numeric.', @@ -80,7 +68,6 @@ 'EMAIL': '$ is not valid.', 'URL': '$ is not valid.', 'PHONE': '$ is not a valid phone number.', - //'INARRAY': '$ is not a valid option.', '<': '$ must be less than % characters.', '<=': '$ must be less or equal to % characters.', '>': '$ must be greater than % characters.', @@ -88,94 +75,94 @@ '==': '$ must be equal to %', '!=': '$ must be different than %' }, - _extendedMessages = false; + _extendedMessages = false, - /** - * @private - * HTML5 data attributes - */ - var _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }; + /** + * @private + * HTML5 data attributes + */ + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + }, - /** - * @private - * Default options - * - * @link http://www.runningcoder.org/jqueryvalidation/documentation/ - */ - var _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - inputContainer: null, - clear: "focusin", - scrollToError: false + /** + * @private + * Default options + * + * @link http://www.runningcoder.org/jqueryvalidation/documentation/ + */ + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + inputContainer: null, + clear: "focusin", + scrollToError: false + }, + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } - }, - dynamic: { - settings: { - trigger: null, - delay: 300 + dynamic: { + settings: { + trigger: null, + delay: 300 + }, + callback: { + onSuccess: null, + onError: null, + onComplete: null + } }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + messages: {}, + labels: {}, + debug: false }, - messages: {}, - labels: {}, - debug: false - }; - /** - * @private - * Limit the supported options on matching keys - */ - var _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } - }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } - }, - debug: [true, false] - }; + /** + * @private + * Limit the supported options on matching keys + */ + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; // ================================================================================================================= @@ -302,7 +289,7 @@ } // {debug} - if (options.debug && $.inArray(options.debug, _supported['debug'] !== -1)) { + if (options.debug && $.inArray(options.debug, _supported.debug !== -1)) { tpmOptions.debug = options.debug; } // {/debug} @@ -391,7 +378,7 @@ }); } - ) + ); } /** @@ -621,14 +608,22 @@ // Validate for predefined "data-validation" _rules if (_rules[rule]) { - if (!_rules[rule].test(value)) { + var hasError = false; + if (rule === 'NOSPACE') { + if (_rules[rule].test(value)) { + hasError = true; + } + } else if (!_rules[rule].test(value)) { + hasError = true; + } + if (hasError) { throw [options.messages[rule], '']; } return; } // Validate for comparison "data-validation" - var comparison = rule.match(_rules['COMPARISON']); + var comparison = rule.match(_rules.COMPARISON); if (!comparison || comparison.length !== 4) { @@ -670,7 +665,7 @@ } else { - if (!value || eval(value.length + operator + parseFloat(compared)) == false) { + if (!value || eval(value.length + operator + parseFloat(compared)) === false) { throw [options.messages[operator], compared]; } @@ -805,7 +800,7 @@ input.addClass(options.submit.settings.errorClass); if (options.submit.settings.inputContainer) { - input.parentsUntil(node, options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass) + input.parentsUntil(node, options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass); } inputId = input.attr('id'); @@ -857,7 +852,7 @@ var event = "coucou" + resetSuffix; if (options.submit.settings.clear) { - event += " " + options.submit.settings.clear + resetSuffix + event += " " + options.submit.settings.clear + resetSuffix; } if (options.dynamic.settings.trigger) { event += " " + options.dynamic.settings.trigger + resetSuffix; @@ -878,7 +873,7 @@ } }; - }(inputName, input, label, errorContainer, group)) + }(inputName, input, label, errorContainer, group)); } if (options.submit.settings.scrollToError && !window.Validation.hasScrolled) { @@ -903,6 +898,7 @@ function displayErrors () { for (var inputName in errors) { + if (!errors.hasOwnProperty(inputName)) continue; displayOneError(inputName); } @@ -926,7 +922,7 @@ //window.Validation.hasScrolled = false; if (options.submit.settings.inputContainer) { - (group ? label : input).parentsUntil(node, options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass) + (group ? label : input).parentsUntil(node, options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass); } label && label.removeClass(options.submit.settings.errorClass); @@ -1058,7 +1054,7 @@ return function(callback, ms){ clearTimeout (timer); timer = setTimeout(callback, ms); - } + }; })(); /** @@ -1291,19 +1287,26 @@ * jQuery public function to add a validation rule. * * @example - * $.addValidationRule( - * 'FILENAME', - * /^[^\\/:\*\?<>\|\"\']*$/, - * '$ has an invalid filename.' - * ) + * $.addValidationRule({ + * rule: 'FILENAME', + * regex: /^[^\\/:\*\?<>\|\"\']*$/, + * message: '$ has an invalid filename.' + * }) * - * @param {string} name - * @param {regex} rule - * @param {string} message + * @param {Object|Array} name */ - $.fn.addValidationRule = $.addValidationRule = function (name, rule, message) { + $.fn.addValidationRule = $.addValidationRule = function (rules) { - return _api.addValidationRule(this, name, rule, message); + if (!(rules instanceof Array)) { + rules = [rules]; + } + + for (var i=0; i\|\"\']*$/, - * '$ has an invalid filename.' - * ) + * $.addValidationRule({ + * rule: 'FILENAME', + * regex: /^[^\\/:\*\?<>\|\"\']*$/, + * message: '$ has an invalid filename.' + * }) * - * @param {object} node - * @param {string} name - * @param {regex} rule - * @param {string} message + * @param {object} ruleObj */ - addValidationRule: function (node, name, rule, message) { + addValidationRule: function (ruleObj) { - if (!name || !rule || !message) { + if (!ruleObj.rule || !ruleObj.regex || !ruleObj.message) { // {debug} window.Debug.log({ - 'node': node, - 'function': '$.addValidationRule(name, rule, message)', - 'arguments': JSON.stringify({node: node, rule: rule, message: message}), - 'message': 'ERROR - Missing one or multiple parameter(s)' + 'function': '$.addValidationRule()', + 'message': 'ERROR - Missing one or multiple parameter(s) {rule, regex, message}' }); window.Debug.print(); @@ -1798,14 +1796,13 @@ return false; } - rule = _buildRegexFromString(rule); + var regex = _buildRegexFromString(ruleObj.regex); - if (!(rule instanceof RegExp)) { + if (!(regex instanceof RegExp)) { // {debug} window.Debug.log({ - 'node': node, 'function': '$.addValidationRule(rule)', - 'arguments': rule.toString(), + 'arguments': regex.toString(), 'message': 'ERROR - Invalid rule' }); @@ -1814,10 +1811,10 @@ return false; } - name = name.toUpperCase(); + ruleObj.rule = ruleObj.rule.toUpperCase(); - _rules[name] = rule; - _messages[name] = message; + _rules[ruleObj.rule] = regex; + _messages[ruleObj.rule] = ruleObj.message; return true; @@ -1911,7 +1908,7 @@ 'arguments': '' } ), debugObject - ) + ); }, print: function () { diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 6cc0dd4..0796a1f 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -6,5 +6,8 @@ * @author Tom Bertrand * @version 1.5.0 (2015-02-03) * @link http://www.runningcoder.org/jqueryvalidation/ + * + * @note + * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -(function(window,document,$,undefined){function _buildRegexFromString(e){function u(){}if(!e||typeof e!=="string"&&!(e instanceof RegExp)){u();return false}if(typeof e!=="string"){e=e.toString()}var t=e.charAt(0),n=e.length-1,r,i,s;while(n>0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:,\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^[^\s]+$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/};var _messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false;var _data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"};var _options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false};var _supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){if(!_rules[rule].test(value)){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules["COMPARISON"]);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))==false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                              ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/\s/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false,_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){var hasError=false;if(rule==="NOSPACE"){if(_rules[rule].test(value)){hasError=true}}else if(!_rules[rule].test(value)){hasError=true}if(hasError){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o Date: Sun, 8 Feb 2015 20:04:34 -0500 Subject: [PATCH 16/41] Version 1.5.0 New Features - Added $.alterValidationRules method to modify the Global Validation rules - Documentation - Demo - Modified NUMERIC rule (to match ex: 1,000.00 or 1000) - Added INTEGER rule - Added data-validation-regex-reverse attribute to reverse the data-validation-regex. Fixes - Fixes#8 data-validation-regex is not reversed anymore by default, an error will be triggered if the input value does not match the regex. - options.submit.settings.button default value is changed to [type="submit"] - Fixed NOSPACE regex Notes - Make sure the node is a
                                                or the Validation is dropped - Removed window.Validation.message configuration, use $.alterValidationRules instead --- jquery.validation.js | 495 ++++++++++++++++++++------------------- jquery.validation.min.js | 6 +- 2 files changed, 257 insertions(+), 244 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 13c4de4..9c63c5d 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -1,10 +1,10 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -15,7 +15,6 @@ window.Validation = { form: [], - messages: null, labels: {}, hasScrolled: false }; @@ -37,132 +36,133 @@ * RegExp rules */ var _rules = { - NOTEMPTY: /./, - INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, - NOSPACE: /\s/, - TRIM: /^[^\s].*[^\s]$/, - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /^.*$/, - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, + NOTEMPTY: /./, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /^.*$/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }, - /** - * @private - * Error messages - */ - _messages = { - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'NUMERIC': '$ must be numeric.', - 'INTEGER': '$ must be an integer.', - 'STRING': '$ must be a string.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }, - _extendedMessages = false, + /** + * @private + * Error messages + */ + _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'NUMERIC': '$ must be numeric.', + 'INTEGER': '$ must be an integer.', + 'STRING': '$ must be a string.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }, - /** - * @private - * HTML5 data attributes - */ - _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }, + /** + * @private + * HTML5 data attributes + */ + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + }, - /** - * @private - * Default options - * - * @link http://www.runningcoder.org/jqueryvalidation/documentation/ - */ - _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } + /** + * @private + * Default options + * + * @link http://www.runningcoder.org/jqueryvalidation/documentation/ + */ + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + inputContainer: null, + clear: "focusin", + scrollToError: false }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 }, - messages: {}, - labels: {}, - debug: false + callback: { + onSuccess: null, + onError: null, + onComplete: null + } }, + rules: {}, + messages: {}, + labels: {}, + debug: false + }, - /** - * @private - * Limit the supported options on matching keys - */ - _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } - }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } - }, - debug: [true, false] - }; + /** + * @private + * Limit the supported options on matching keys + */ + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; // ================================================================================================================= @@ -176,26 +176,34 @@ var Validation = function (node, options) { var errors = [], + messages = {}, delegateSuffix = ".vd", // validation.delegate resetSuffix = ".vr"; // validation.resetError window.Validation.hasScrolled = false; /** - * Extends user-defined "message" into the default Validation "_message". - * Notes: - * - preventExtensions prevents from modifying the Validation "_message" object structure + * Extends user-defined "options.message" into the default Validation "_message". */ - function extendMessages () { - - if (!window.Validation.messages || _extendedMessages) { - return false; - } - - _messages = $.extend(_messages, window.Validation.messages); - - _extendedMessages = true; + function extendRules () { + options.rules = $.extend( + true, + {}, + _rules, + options.rules + ); + } + /** + * Extends user-defined "options.message" into the default Validation "_message". + */ + function extendMessages () { + options.messages = $.extend( + true, + {}, + _messages, + options.messages + ); } /** @@ -210,18 +218,15 @@ options = {}; } - var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)), - tmpMessages = Object.preventExtensions($.extend(true, {}, _messages)); - - tpmOptions.messages = $.extend(tmpMessages, options.messages || {}); + var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)); for (var method in options) { - if (!options.hasOwnProperty(method) || method === "debug" || method === "messages") { + if (!options.hasOwnProperty(method) || method === "debug") { continue; } - if (method === "labels" && options[method] instanceof Object) { + if (~["labels", "messages", "rules"].indexOf(method) && options[method] instanceof Object) { tpmOptions[method] = options[method]; continue; } @@ -416,7 +421,7 @@ } node.on("submit", false); - node.find(options.submit.settings.button).unbind(event).on(event, function (e) { + node.find(options.submit.settings.button).off('.vd').on(event, function (e) { e.preventDefault(); @@ -462,17 +467,11 @@ var isValid = true; $.each( - node.find('[' + _data.validation + ']:not([readonly], [disabled]),[' + _data.regex + ']:not([readonly], [disabled])'), + node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), function (index, input) { - - if ($(this).is(':disabled')) { - return false; - } - if (!validateInput(input)) { isValid = false; } - } ); @@ -517,6 +516,7 @@ validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), validationRegex = $(input).attr(_data.regex), + validationRegexReverse = !($(input).attr(_data.regexReverse) === undefined), validationRegexMessage = $(input).attr(_data.regexMessage), validateOnce = false; @@ -571,7 +571,7 @@ try { - validateRule(value, rule); + validateRule(value, rule, validationRegexReverse); } catch (error) { @@ -593,37 +593,35 @@ * * @param {string} value * @param rule + * @param {boolean} [reversed] * * @returns {*} Error if a mismatch occurred. */ - function validateRule (value, rule) { + function validateRule (value, rule, reversed) { - // Validate for custom "data-validation-regex" + // Validate for "data-validation-regex" and "data-validation-regex-reverse" if (rule instanceof RegExp) { - if (rule.test(value)) { + var isValid = rule.test(value); + + if (reversed) { + isValid = !isValid; + } + + if (!isValid) { throw [options.messages['default'], '']; } return; } - // Validate for predefined "data-validation" _rules - if (_rules[rule]) { - var hasError = false; - if (rule === 'NOSPACE') { - if (_rules[rule].test(value)) { - hasError = true; - } - } else if (!_rules[rule].test(value)) { - hasError = true; - } - if (hasError) { + if (options.rules[rule]) { + if (!options.rules[rule].test(value)) { throw [options.messages[rule], '']; } return; } // Validate for comparison "data-validation" - var comparison = rule.match(_rules.COMPARISON); + var comparison = rule.match(options.rules.COMPARISON); if (!comparison || comparison.length !== 4) { @@ -984,30 +982,18 @@ } /** - * Submits the form once it succeeded the validation process. - * Note: - * - This function will be overridden if "options.submit.settings.onSubmit" is defined - * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead + * Destroy the Validation instance * * @returns {boolean} */ function destroy () { - var event = options.submit.settings.trigger + delegateSuffix; + resetErrors(); + node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); - if (options.dynamic.settings.trigger) { - event += " " + options.dynamic.settings.trigger + delegateSuffix; - if (options.dynamic.settings.trigger !== "focusout") { - event += " change" + delegateSuffix + " paste" + delegateSuffix; - } - } - - $.each( - node.find('[' + _data.validation + '],[' + _data.regex + ']'), - function (i, v) { - $(v).unbind(event); - } - ); + node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function () { + $(this).closest('form')[0].submit(); + }); //delete window.Validation.form[node.selector]; @@ -1143,8 +1129,9 @@ */ this.__construct = function () { - extendMessages(); extendOptions(); + extendRules(); + extendMessages(); delegateDynamicValidation(); delegateValidation(); @@ -1287,7 +1274,7 @@ * jQuery public function to add a validation rule. * * @example - * $.addValidationRule({ + * $.alterValidationRules({ * rule: 'FILENAME', * regex: /^[^\\/:\*\?<>\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1295,19 +1282,16 @@ * * @param {Object|Array} name */ - $.fn.addValidationRule = $.addValidationRule = function (rules) { + $.fn.alterValidationRules = $.alterValidationRules = function (rules) { if (!(rules instanceof Array)) { rules = [rules]; } for (var i=0; i\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1782,42 +1766,45 @@ * * @param {object} ruleObj */ - addValidationRule: function (ruleObj) { + alterValidationRules: function (ruleObj) { - if (!ruleObj.rule || !ruleObj.regex || !ruleObj.message) { + if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { // {debug} window.Debug.log({ - 'function': '$.addValidationRule()', + 'function': '$.alterValidationRules()', 'message': 'ERROR - Missing one or multiple parameter(s) {rule, regex, message}' }); - window.Debug.print(); // {/debug} return false; } - var regex = _buildRegexFromString(ruleObj.regex); + ruleObj.rule = ruleObj.rule.toUpperCase(); - if (!(regex instanceof RegExp)) { - // {debug} - window.Debug.log({ - 'function': '$.addValidationRule(rule)', - 'arguments': regex.toString(), - 'message': 'ERROR - Invalid rule' - }); + if (ruleObj.regex) { - window.Debug.print(); - // {/debug} - return false; - } + var regex = _buildRegexFromString(ruleObj.regex); - ruleObj.rule = ruleObj.rule.toUpperCase(); + if (!(regex instanceof RegExp)) { + // {debug} + window.Debug.log({ + 'function': '$.alterValidationRules(rule)', + 'arguments': regex.toString(), + 'message': 'ERROR - Invalid rule' + }); + window.Debug.print(); + // {/debug} + return false; + } - _rules[ruleObj.rule] = regex; - _messages[ruleObj.rule] = ruleObj.message; + _rules[ruleObj.rule] = regex; + } - return true; + if (ruleObj.message) { + _messages[ruleObj.rule] = ruleObj.message; + } + return true; } }; @@ -1946,39 +1933,65 @@ return this.charAt(0).toUpperCase() + this.slice(1); }; - /** - * Creates a String from a JSON object - * - * @return {string|array} str String or array of strings - */ - window.JSON.stringify = JSON.stringify || function (obj) { - var t = typeof (obj); - if (t !== "object" || obj === null) { - // simple data type - if (t === "string") { - obj = '"' + obj + '"'; - } - return String(obj); - } - else { - // recurse array or object - var n, v, json = [], arr = (obj && obj.constructor === Array); - for (n in obj) { - // jslint hack to validate for..in - if (true) { - v = obj[n]; - t = typeof(v); - if (t === "string") { - v = '"' + v + '"'; - } - else if (t === "object" && v !== null) { - v = JSON.stringify(v); + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(searchElement, fromIndex) { + var k; + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var O = Object(this); + var len = O.length >>> 0; + if (len === 0) { + return -1; + } + var n = +fromIndex || 0; + if (Math.abs(n) === Infinity) { + n = 0; + } + if (n >= len) { + return -1; + } + k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (k in O && O[k] === searchElement) { + return k; + } + k++; + } + return -1; + }; + } + + // {debug} + if (!JSON && !JSON.stringify) { + JSON.stringify = function (obj) { + var t = typeof (obj); + if (t !== "object" || obj === null) { + // simple data type + if (t === "string") { + obj = '"' + obj + '"'; + } + return String(obj); + } + else { + var n, v, json = [], arr = (obj && obj.constructor === Array); + for (n in obj) { + if (true) { + v = obj[n]; + t = typeof(v); + if (t === "string") { + v = '"' + v + '"'; + } + else if (t === "object" && v !== null) { + v = JSON.stringify(v); + } + json.push((arr ? "" : '"' + n + '": ') + String(v)); } - json.push((arr ? "" : '"' + n + '": ') + String(v)); } + return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); } - return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); - } - }; + }; + } + // {/debug} }(window, document, window.jQuery)); \ No newline at end of file diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 0796a1f..96536dc 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -1,13 +1,13 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -(function(window,document,$,undefined){function _buildRegexFromString(e){function u(){}if(!e||typeof e!=="string"&&!(e instanceof RegExp)){u();return false}if(typeof e!=="string"){e=e.toString()}var t=e.charAt(0),n=e.length-1,r,i,s;while(n>0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/\s/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false,_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){var hasError=false;if(rule==="NOSPACE"){if(_rules[rule].test(value)){hasError=true}}else if(!_rules[rule].test(value)){hasError=true}if(hasError){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                  ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendRules(){options.rules=$.extend(true,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(true,{},_messages,options.messages)}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options));for(var t in options){if(!options.hasOwnProperty(t)||t==="debug"){continue}if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object){e[t]=options[t];continue}if(!_options[t]||!(options[t]instanceof Object)){continue}for(var n in options[t]){if(!options[t].hasOwnProperty(n)){continue}if(!_options[t][n]||!(options[t][n]instanceof Object)){continue}for(var r in options[t][n]){if(!options[t][n].hasOwnProperty(r)){continue}if(_supported[t]&&_supported[t][n]&&_supported[t][n][r]&&$.inArray(options[t][n][r],_supported[t][n][r])===-1){delete options[t][n][r]}}if(e[t]&&e[t][n]){e[t][n]=$.extend(Object.preventExtensions(e[t][n]),options[t][n])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).off(".vd").on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,n){if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=!($(e).attr(_data.regexReverse)===undefined),f=$(e).attr(_data.regexMessage),l=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(l===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){l=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var c=_buildRegexFromString(u);if(!(c instanceof RegExp)){return true}try{validateRule(n,c,a)}catch(h){h[0]=f||h[0];registerError(t,h[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed){isValid=!isValid}if(!isValid){throw[options.messages["default"],""]}return}if(options.rules[rule]){if(!options.rules[rule].test(value)){throw[options.messages[rule],""]}return}var comparison=rule.match(options.rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                    ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){resetErrors();node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix);node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()});return true}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o>>0;if(i===0){return-1}var s=+t||0;if(Math.abs(s)===Infinity){s=0}if(s>=i){return-1}n=Math.max(s>=0?s:i-Math.abs(s),0);while(n Date: Sun, 8 Feb 2015 20:04:34 -0500 Subject: [PATCH 17/41] Version 1.5.0 New Features - Added $.alterValidationRules method to modify the Global Validation rules - Documentation - Demo - Modified NUMERIC rule (to match ex: 1,000.00 or 1000) - Added INTEGER rule - Added data-validation-regex-reverse attribute to reverse the data-validation-regex. Fixes - Fixes #8 data-validation-regex is not reversed anymore by default, an error will be triggered if the input value does not match the regex. - options.submit.settings.button default value is changed to [type="submit"] - Fixed NOSPACE regex Notes - Make sure the node is a or the Validation is dropped - Removed window.Validation.message configuration, use $.alterValidationRules instead --- jquery.validation.js | 495 ++++++++++++++++++++------------------- jquery.validation.min.js | 6 +- 2 files changed, 257 insertions(+), 244 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 13c4de4..9c63c5d 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -1,10 +1,10 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -15,7 +15,6 @@ window.Validation = { form: [], - messages: null, labels: {}, hasScrolled: false }; @@ -37,132 +36,133 @@ * RegExp rules */ var _rules = { - NOTEMPTY: /./, - INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, - NOSPACE: /\s/, - TRIM: /^[^\s].*[^\s]$/, - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /^.*$/, - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, + NOTEMPTY: /./, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /^.*$/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }, - /** - * @private - * Error messages - */ - _messages = { - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'NUMERIC': '$ must be numeric.', - 'INTEGER': '$ must be an integer.', - 'STRING': '$ must be a string.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }, - _extendedMessages = false, + /** + * @private + * Error messages + */ + _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'NUMERIC': '$ must be numeric.', + 'INTEGER': '$ must be an integer.', + 'STRING': '$ must be a string.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }, - /** - * @private - * HTML5 data attributes - */ - _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }, + /** + * @private + * HTML5 data attributes + */ + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + }, - /** - * @private - * Default options - * - * @link http://www.runningcoder.org/jqueryvalidation/documentation/ - */ - _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } + /** + * @private + * Default options + * + * @link http://www.runningcoder.org/jqueryvalidation/documentation/ + */ + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + inputContainer: null, + clear: "focusin", + scrollToError: false }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 }, - messages: {}, - labels: {}, - debug: false + callback: { + onSuccess: null, + onError: null, + onComplete: null + } }, + rules: {}, + messages: {}, + labels: {}, + debug: false + }, - /** - * @private - * Limit the supported options on matching keys - */ - _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } - }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } - }, - debug: [true, false] - }; + /** + * @private + * Limit the supported options on matching keys + */ + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; // ================================================================================================================= @@ -176,26 +176,34 @@ var Validation = function (node, options) { var errors = [], + messages = {}, delegateSuffix = ".vd", // validation.delegate resetSuffix = ".vr"; // validation.resetError window.Validation.hasScrolled = false; /** - * Extends user-defined "message" into the default Validation "_message". - * Notes: - * - preventExtensions prevents from modifying the Validation "_message" object structure + * Extends user-defined "options.message" into the default Validation "_message". */ - function extendMessages () { - - if (!window.Validation.messages || _extendedMessages) { - return false; - } - - _messages = $.extend(_messages, window.Validation.messages); - - _extendedMessages = true; + function extendRules () { + options.rules = $.extend( + true, + {}, + _rules, + options.rules + ); + } + /** + * Extends user-defined "options.message" into the default Validation "_message". + */ + function extendMessages () { + options.messages = $.extend( + true, + {}, + _messages, + options.messages + ); } /** @@ -210,18 +218,15 @@ options = {}; } - var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)), - tmpMessages = Object.preventExtensions($.extend(true, {}, _messages)); - - tpmOptions.messages = $.extend(tmpMessages, options.messages || {}); + var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)); for (var method in options) { - if (!options.hasOwnProperty(method) || method === "debug" || method === "messages") { + if (!options.hasOwnProperty(method) || method === "debug") { continue; } - if (method === "labels" && options[method] instanceof Object) { + if (~["labels", "messages", "rules"].indexOf(method) && options[method] instanceof Object) { tpmOptions[method] = options[method]; continue; } @@ -416,7 +421,7 @@ } node.on("submit", false); - node.find(options.submit.settings.button).unbind(event).on(event, function (e) { + node.find(options.submit.settings.button).off('.vd').on(event, function (e) { e.preventDefault(); @@ -462,17 +467,11 @@ var isValid = true; $.each( - node.find('[' + _data.validation + ']:not([readonly], [disabled]),[' + _data.regex + ']:not([readonly], [disabled])'), + node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), function (index, input) { - - if ($(this).is(':disabled')) { - return false; - } - if (!validateInput(input)) { isValid = false; } - } ); @@ -517,6 +516,7 @@ validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), validationRegex = $(input).attr(_data.regex), + validationRegexReverse = !($(input).attr(_data.regexReverse) === undefined), validationRegexMessage = $(input).attr(_data.regexMessage), validateOnce = false; @@ -571,7 +571,7 @@ try { - validateRule(value, rule); + validateRule(value, rule, validationRegexReverse); } catch (error) { @@ -593,37 +593,35 @@ * * @param {string} value * @param rule + * @param {boolean} [reversed] * * @returns {*} Error if a mismatch occurred. */ - function validateRule (value, rule) { + function validateRule (value, rule, reversed) { - // Validate for custom "data-validation-regex" + // Validate for "data-validation-regex" and "data-validation-regex-reverse" if (rule instanceof RegExp) { - if (rule.test(value)) { + var isValid = rule.test(value); + + if (reversed) { + isValid = !isValid; + } + + if (!isValid) { throw [options.messages['default'], '']; } return; } - // Validate for predefined "data-validation" _rules - if (_rules[rule]) { - var hasError = false; - if (rule === 'NOSPACE') { - if (_rules[rule].test(value)) { - hasError = true; - } - } else if (!_rules[rule].test(value)) { - hasError = true; - } - if (hasError) { + if (options.rules[rule]) { + if (!options.rules[rule].test(value)) { throw [options.messages[rule], '']; } return; } // Validate for comparison "data-validation" - var comparison = rule.match(_rules.COMPARISON); + var comparison = rule.match(options.rules.COMPARISON); if (!comparison || comparison.length !== 4) { @@ -984,30 +982,18 @@ } /** - * Submits the form once it succeeded the validation process. - * Note: - * - This function will be overridden if "options.submit.settings.onSubmit" is defined - * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead + * Destroy the Validation instance * * @returns {boolean} */ function destroy () { - var event = options.submit.settings.trigger + delegateSuffix; + resetErrors(); + node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); - if (options.dynamic.settings.trigger) { - event += " " + options.dynamic.settings.trigger + delegateSuffix; - if (options.dynamic.settings.trigger !== "focusout") { - event += " change" + delegateSuffix + " paste" + delegateSuffix; - } - } - - $.each( - node.find('[' + _data.validation + '],[' + _data.regex + ']'), - function (i, v) { - $(v).unbind(event); - } - ); + node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function () { + $(this).closest('form')[0].submit(); + }); //delete window.Validation.form[node.selector]; @@ -1143,8 +1129,9 @@ */ this.__construct = function () { - extendMessages(); extendOptions(); + extendRules(); + extendMessages(); delegateDynamicValidation(); delegateValidation(); @@ -1287,7 +1274,7 @@ * jQuery public function to add a validation rule. * * @example - * $.addValidationRule({ + * $.alterValidationRules({ * rule: 'FILENAME', * regex: /^[^\\/:\*\?<>\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1295,19 +1282,16 @@ * * @param {Object|Array} name */ - $.fn.addValidationRule = $.addValidationRule = function (rules) { + $.fn.alterValidationRules = $.alterValidationRules = function (rules) { if (!(rules instanceof Array)) { rules = [rules]; } for (var i=0; i\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1782,42 +1766,45 @@ * * @param {object} ruleObj */ - addValidationRule: function (ruleObj) { + alterValidationRules: function (ruleObj) { - if (!ruleObj.rule || !ruleObj.regex || !ruleObj.message) { + if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { // {debug} window.Debug.log({ - 'function': '$.addValidationRule()', + 'function': '$.alterValidationRules()', 'message': 'ERROR - Missing one or multiple parameter(s) {rule, regex, message}' }); - window.Debug.print(); // {/debug} return false; } - var regex = _buildRegexFromString(ruleObj.regex); + ruleObj.rule = ruleObj.rule.toUpperCase(); - if (!(regex instanceof RegExp)) { - // {debug} - window.Debug.log({ - 'function': '$.addValidationRule(rule)', - 'arguments': regex.toString(), - 'message': 'ERROR - Invalid rule' - }); + if (ruleObj.regex) { - window.Debug.print(); - // {/debug} - return false; - } + var regex = _buildRegexFromString(ruleObj.regex); - ruleObj.rule = ruleObj.rule.toUpperCase(); + if (!(regex instanceof RegExp)) { + // {debug} + window.Debug.log({ + 'function': '$.alterValidationRules(rule)', + 'arguments': regex.toString(), + 'message': 'ERROR - Invalid rule' + }); + window.Debug.print(); + // {/debug} + return false; + } - _rules[ruleObj.rule] = regex; - _messages[ruleObj.rule] = ruleObj.message; + _rules[ruleObj.rule] = regex; + } - return true; + if (ruleObj.message) { + _messages[ruleObj.rule] = ruleObj.message; + } + return true; } }; @@ -1946,39 +1933,65 @@ return this.charAt(0).toUpperCase() + this.slice(1); }; - /** - * Creates a String from a JSON object - * - * @return {string|array} str String or array of strings - */ - window.JSON.stringify = JSON.stringify || function (obj) { - var t = typeof (obj); - if (t !== "object" || obj === null) { - // simple data type - if (t === "string") { - obj = '"' + obj + '"'; - } - return String(obj); - } - else { - // recurse array or object - var n, v, json = [], arr = (obj && obj.constructor === Array); - for (n in obj) { - // jslint hack to validate for..in - if (true) { - v = obj[n]; - t = typeof(v); - if (t === "string") { - v = '"' + v + '"'; - } - else if (t === "object" && v !== null) { - v = JSON.stringify(v); + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(searchElement, fromIndex) { + var k; + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var O = Object(this); + var len = O.length >>> 0; + if (len === 0) { + return -1; + } + var n = +fromIndex || 0; + if (Math.abs(n) === Infinity) { + n = 0; + } + if (n >= len) { + return -1; + } + k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (k in O && O[k] === searchElement) { + return k; + } + k++; + } + return -1; + }; + } + + // {debug} + if (!JSON && !JSON.stringify) { + JSON.stringify = function (obj) { + var t = typeof (obj); + if (t !== "object" || obj === null) { + // simple data type + if (t === "string") { + obj = '"' + obj + '"'; + } + return String(obj); + } + else { + var n, v, json = [], arr = (obj && obj.constructor === Array); + for (n in obj) { + if (true) { + v = obj[n]; + t = typeof(v); + if (t === "string") { + v = '"' + v + '"'; + } + else if (t === "object" && v !== null) { + v = JSON.stringify(v); + } + json.push((arr ? "" : '"' + n + '": ') + String(v)); } - json.push((arr ? "" : '"' + n + '": ') + String(v)); } + return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); } - return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); - } - }; + }; + } + // {/debug} }(window, document, window.jQuery)); \ No newline at end of file diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 0796a1f..96536dc 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -1,13 +1,13 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -(function(window,document,$,undefined){function _buildRegexFromString(e){function u(){}if(!e||typeof e!=="string"&&!(e instanceof RegExp)){u();return false}if(typeof e!=="string"){e=e.toString()}var t=e.charAt(0),n=e.length-1,r,i,s;while(n>0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/\s/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false,_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){var hasError=false;if(rule==="NOSPACE"){if(_rules[rule].test(value)){hasError=true}}else if(!_rules[rule].test(value)){hasError=true}if(hasError){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                      ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendRules(){options.rules=$.extend(true,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(true,{},_messages,options.messages)}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options));for(var t in options){if(!options.hasOwnProperty(t)||t==="debug"){continue}if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object){e[t]=options[t];continue}if(!_options[t]||!(options[t]instanceof Object)){continue}for(var n in options[t]){if(!options[t].hasOwnProperty(n)){continue}if(!_options[t][n]||!(options[t][n]instanceof Object)){continue}for(var r in options[t][n]){if(!options[t][n].hasOwnProperty(r)){continue}if(_supported[t]&&_supported[t][n]&&_supported[t][n][r]&&$.inArray(options[t][n][r],_supported[t][n][r])===-1){delete options[t][n][r]}}if(e[t]&&e[t][n]){e[t][n]=$.extend(Object.preventExtensions(e[t][n]),options[t][n])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).off(".vd").on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,n){if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=!($(e).attr(_data.regexReverse)===undefined),f=$(e).attr(_data.regexMessage),l=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(l===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){l=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var c=_buildRegexFromString(u);if(!(c instanceof RegExp)){return true}try{validateRule(n,c,a)}catch(h){h[0]=f||h[0];registerError(t,h[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed){isValid=!isValid}if(!isValid){throw[options.messages["default"],""]}return}if(options.rules[rule]){if(!options.rules[rule].test(value)){throw[options.messages[rule],""]}return}var comparison=rule.match(options.rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                        ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){resetErrors();node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix);node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()});return true}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o>>0;if(i===0){return-1}var s=+t||0;if(Math.abs(s)===Infinity){s=0}if(s>=i){return-1}n=Math.max(s>=0?s:i-Math.abs(s),0);while(n Date: Tue, 10 Feb 2015 13:59:15 -0500 Subject: [PATCH 18/41] - Fixed issue with Array.prototype.indexOf --- jquery.validation.js | 487 ++++++++++++++++++++------------------- jquery.validation.min.js | 9 +- 2 files changed, 250 insertions(+), 246 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 13c4de4..de27c75 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -1,10 +1,10 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -15,7 +15,6 @@ window.Validation = { form: [], - messages: null, labels: {}, hasScrolled: false }; @@ -37,132 +36,133 @@ * RegExp rules */ var _rules = { - NOTEMPTY: /./, - INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, - NOSPACE: /\s/, - TRIM: /^[^\s].*[^\s]$/, - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /^.*$/, - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, + NOTEMPTY: /./, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /^.*$/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }, - /** - * @private - * Error messages - */ - _messages = { - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'NUMERIC': '$ must be numeric.', - 'INTEGER': '$ must be an integer.', - 'STRING': '$ must be a string.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }, - _extendedMessages = false, + /** + * @private + * Error messages + */ + _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'NUMERIC': '$ must be numeric.', + 'INTEGER': '$ must be an integer.', + 'STRING': '$ must be a string.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }, - /** - * @private - * HTML5 data attributes - */ - _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }, + /** + * @private + * HTML5 data attributes + */ + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + }, - /** - * @private - * Default options - * - * @link http://www.runningcoder.org/jqueryvalidation/documentation/ - */ - _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } + /** + * @private + * Default options + * + * @link http://www.runningcoder.org/jqueryvalidation/documentation/ + */ + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + inputContainer: null, + clear: "focusin", + scrollToError: false }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 }, - messages: {}, - labels: {}, - debug: false + callback: { + onSuccess: null, + onError: null, + onComplete: null + } }, + rules: {}, + messages: {}, + labels: {}, + debug: false + }, - /** - * @private - * Limit the supported options on matching keys - */ - _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } - }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } - }, - debug: [true, false] - }; + /** + * @private + * Limit the supported options on matching keys + */ + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; // ================================================================================================================= @@ -176,26 +176,34 @@ var Validation = function (node, options) { var errors = [], + messages = {}, delegateSuffix = ".vd", // validation.delegate resetSuffix = ".vr"; // validation.resetError window.Validation.hasScrolled = false; /** - * Extends user-defined "message" into the default Validation "_message". - * Notes: - * - preventExtensions prevents from modifying the Validation "_message" object structure + * Extends user-defined "options.message" into the default Validation "_message". */ - function extendMessages () { - - if (!window.Validation.messages || _extendedMessages) { - return false; - } - - _messages = $.extend(_messages, window.Validation.messages); - - _extendedMessages = true; + function extendRules () { + options.rules = $.extend( + true, + {}, + _rules, + options.rules + ); + } + /** + * Extends user-defined "options.message" into the default Validation "_message". + */ + function extendMessages () { + options.messages = $.extend( + true, + {}, + _messages, + options.messages + ); } /** @@ -210,18 +218,15 @@ options = {}; } - var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)), - tmpMessages = Object.preventExtensions($.extend(true, {}, _messages)); - - tpmOptions.messages = $.extend(tmpMessages, options.messages || {}); + var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)); for (var method in options) { - if (!options.hasOwnProperty(method) || method === "debug" || method === "messages") { + if (!options.hasOwnProperty(method) || method === "debug") { continue; } - if (method === "labels" && options[method] instanceof Object) { + if (~["labels", "messages", "rules"].indexOf(method) && options[method] instanceof Object) { tpmOptions[method] = options[method]; continue; } @@ -416,7 +421,7 @@ } node.on("submit", false); - node.find(options.submit.settings.button).unbind(event).on(event, function (e) { + node.find(options.submit.settings.button).off('.vd').on(event, function (e) { e.preventDefault(); @@ -462,17 +467,11 @@ var isValid = true; $.each( - node.find('[' + _data.validation + ']:not([readonly], [disabled]),[' + _data.regex + ']:not([readonly], [disabled])'), + node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), function (index, input) { - - if ($(this).is(':disabled')) { - return false; - } - if (!validateInput(input)) { isValid = false; } - } ); @@ -517,6 +516,7 @@ validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), validationRegex = $(input).attr(_data.regex), + validationRegexReverse = !($(input).attr(_data.regexReverse) === undefined), validationRegexMessage = $(input).attr(_data.regexMessage), validateOnce = false; @@ -571,7 +571,7 @@ try { - validateRule(value, rule); + validateRule(value, rule, validationRegexReverse); } catch (error) { @@ -593,37 +593,35 @@ * * @param {string} value * @param rule + * @param {boolean} [reversed] * * @returns {*} Error if a mismatch occurred. */ - function validateRule (value, rule) { + function validateRule (value, rule, reversed) { - // Validate for custom "data-validation-regex" + // Validate for "data-validation-regex" and "data-validation-regex-reverse" if (rule instanceof RegExp) { - if (rule.test(value)) { + var isValid = rule.test(value); + + if (reversed) { + isValid = !isValid; + } + + if (!isValid) { throw [options.messages['default'], '']; } return; } - // Validate for predefined "data-validation" _rules - if (_rules[rule]) { - var hasError = false; - if (rule === 'NOSPACE') { - if (_rules[rule].test(value)) { - hasError = true; - } - } else if (!_rules[rule].test(value)) { - hasError = true; - } - if (hasError) { + if (options.rules[rule]) { + if (!options.rules[rule].test(value)) { throw [options.messages[rule], '']; } return; } // Validate for comparison "data-validation" - var comparison = rule.match(_rules.COMPARISON); + var comparison = rule.match(options.rules.COMPARISON); if (!comparison || comparison.length !== 4) { @@ -984,30 +982,18 @@ } /** - * Submits the form once it succeeded the validation process. - * Note: - * - This function will be overridden if "options.submit.settings.onSubmit" is defined - * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead + * Destroy the Validation instance * * @returns {boolean} */ function destroy () { - var event = options.submit.settings.trigger + delegateSuffix; + resetErrors(); + node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); - if (options.dynamic.settings.trigger) { - event += " " + options.dynamic.settings.trigger + delegateSuffix; - if (options.dynamic.settings.trigger !== "focusout") { - event += " change" + delegateSuffix + " paste" + delegateSuffix; - } - } - - $.each( - node.find('[' + _data.validation + '],[' + _data.regex + ']'), - function (i, v) { - $(v).unbind(event); - } - ); + node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function () { + $(this).closest('form')[0].submit(); + }); //delete window.Validation.form[node.selector]; @@ -1143,8 +1129,9 @@ */ this.__construct = function () { - extendMessages(); extendOptions(); + extendRules(); + extendMessages(); delegateDynamicValidation(); delegateValidation(); @@ -1287,7 +1274,7 @@ * jQuery public function to add a validation rule. * * @example - * $.addValidationRule({ + * $.alterValidationRules({ * rule: 'FILENAME', * regex: /^[^\\/:\*\?<>\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1295,19 +1282,16 @@ * * @param {Object|Array} name */ - $.fn.addValidationRule = $.addValidationRule = function (rules) { + $.fn.alterValidationRules = $.alterValidationRules = function (rules) { if (!(rules instanceof Array)) { rules = [rules]; } for (var i=0; i\|\"\']*$/, * message: '$ has an invalid filename.' @@ -1782,42 +1766,45 @@ * * @param {object} ruleObj */ - addValidationRule: function (ruleObj) { + alterValidationRules: function (ruleObj) { - if (!ruleObj.rule || !ruleObj.regex || !ruleObj.message) { + if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { // {debug} window.Debug.log({ - 'function': '$.addValidationRule()', + 'function': '$.alterValidationRules()', 'message': 'ERROR - Missing one or multiple parameter(s) {rule, regex, message}' }); - window.Debug.print(); // {/debug} return false; } - var regex = _buildRegexFromString(ruleObj.regex); + ruleObj.rule = ruleObj.rule.toUpperCase(); - if (!(regex instanceof RegExp)) { - // {debug} - window.Debug.log({ - 'function': '$.addValidationRule(rule)', - 'arguments': regex.toString(), - 'message': 'ERROR - Invalid rule' - }); + if (ruleObj.regex) { - window.Debug.print(); - // {/debug} - return false; - } + var regex = _buildRegexFromString(ruleObj.regex); - ruleObj.rule = ruleObj.rule.toUpperCase(); + if (!(regex instanceof RegExp)) { + // {debug} + window.Debug.log({ + 'function': '$.alterValidationRules(rule)', + 'arguments': regex.toString(), + 'message': 'ERROR - Invalid rule' + }); + window.Debug.print(); + // {/debug} + return false; + } - _rules[ruleObj.rule] = regex; - _messages[ruleObj.rule] = ruleObj.message; + _rules[ruleObj.rule] = regex; + } - return true; + if (ruleObj.message) { + _messages[ruleObj.rule] = ruleObj.message; + } + return true; } }; @@ -1946,39 +1933,59 @@ return this.charAt(0).toUpperCase() + this.slice(1); }; - /** - * Creates a String from a JSON object - * - * @return {string|array} str String or array of strings - */ - window.JSON.stringify = JSON.stringify || function (obj) { - var t = typeof (obj); - if (t !== "object" || obj === null) { - // simple data type - if (t === "string") { - obj = '"' + obj + '"'; + if (!Array.prototype.indexOf) + { + Array.prototype.indexOf = function(elt /*, from*/) + { + var len = this.length >>> 0; + + var from = Number(arguments[1]) || 0; + from = (from < 0) + ? Math.ceil(from) + : Math.floor(from); + if (from < 0) + from += len; + + for (; from < len; from++) + { + if (from in this && + this[from] === elt) + return from; } - return String(obj); - } - else { - // recurse array or object - var n, v, json = [], arr = (obj && obj.constructor === Array); - for (n in obj) { - // jslint hack to validate for..in - if (true) { - v = obj[n]; - t = typeof(v); - if (t === "string") { - v = '"' + v + '"'; - } - else if (t === "object" && v !== null) { - v = JSON.stringify(v); + return -1; + }; + } + + // {debug} + if (!JSON && !JSON.stringify) { + JSON.stringify = function (obj) { + var t = typeof (obj); + if (t !== "object" || obj === null) { + // simple data type + if (t === "string") { + obj = '"' + obj + '"'; + } + return String(obj); + } + else { + var n, v, json = [], arr = (obj && obj.constructor === Array); + for (n in obj) { + if (true) { + v = obj[n]; + t = typeof(v); + if (t === "string") { + v = '"' + v + '"'; + } + else if (t === "object" && v !== null) { + v = JSON.stringify(v); + } + json.push((arr ? "" : '"' + n + '": ') + String(v)); } - json.push((arr ? "" : '"' + n + '": ') + String(v)); } + return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); } - return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); - } - }; + }; + } + // {/debug} }(window, document, window.jQuery)); \ No newline at end of file diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 0796a1f..9ec0135 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -1,13 +1,10 @@ /** * jQuery Form Validation - * Copyright (C) 2014 RunningCoder.org + * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-03) + * @version 1.5.0 (2015-02-08) * @link http://www.runningcoder.org/jqueryvalidation/ - * - * @note - * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -(function(window,document,$,undefined){function _buildRegexFromString(e){function u(){}if(!e||typeof e!=="string"&&!(e instanceof RegExp)){u();return false}if(typeof e!=="string"){e=e.toString()}var t=e.charAt(0),n=e.length-1,r,i,s;while(n>0){if(/[gimsxeU]/.test(e.charAt(n))){n--}else{break}}if(e.charAt(n)!==t){t=null}if(t&&n!==e.length-1){i=e.substr(n+1,e.length-1)}if(t){r=e.substr(1,n-1)}else{r=e}try{s=new RegExp(r,i)}catch(o){u();return false}return s}window.Validation={form:[],messages:null,labels:{},hasScrolled:false};if(typeof Object.preventExtensions!=="function"){Object.preventExtensions=function(e){return e}}var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/\s/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_extendedMessages=false,_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:false,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:false},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},messages:{},labels:{},debug:false},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[true,false],clear:["focusin","keypress",false],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[true,false]};var Validation=function(node,options){function extendMessages(){if(!window.Validation.messages||_extendedMessages){return false}_messages=$.extend(_messages,window.Validation.messages);_extendedMessages=true}function extendOptions(){if(!(options instanceof Object)){options={}}var e=Object.preventExtensions($.extend(true,{},_options)),t=Object.preventExtensions($.extend(true,{},_messages));e.messages=$.extend(t,options.messages||{});for(var n in options){if(!options.hasOwnProperty(n)||n==="debug"||n==="messages"){continue}if(n==="labels"&&options[n]instanceof Object){e[n]=options[n];continue}if(!_options[n]||!(options[n]instanceof Object)){continue}for(var r in options[n]){if(!options[n].hasOwnProperty(r)){continue}if(!_options[n][r]||!(options[n][r]instanceof Object)){continue}for(var i in options[n][r]){if(!options[n][r].hasOwnProperty(i)){continue}if(_supported[n]&&_supported[n][r]&&_supported[n][r][i]&&$.inArray(options[n][r][i],_supported[n][r][i])===-1){delete options[n][r][i]}}if(e[n]&&e[n][r]){e[n][r]=$.extend(Object.preventExtensions(e[n][r]),options[n][r])}}}if(e.dynamic.settings.trigger){if(e.dynamic.settings.trigger==="keypress"&&e.submit.settings.clear==="keypress"){e.dynamic.settings.trigger="keydown"}}options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger){return false}if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0]){return false}var e=options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e).on(e,function(e){if($(this).is(":disabled")){return false}var t=this,n=e.keyCode||null;_typeWatch(function(){if(!validateInput(t)){displayOneError(t.name);_executeCallback(options.dynamic.callback.onError,[node,t,n,errors[t.name]])}else{_executeCallback(options.dynamic.callback.onSuccess,[node,t,n])}_executeCallback(options.dynamic.callback.onComplete,[node,t,n])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";if(!node.find(options.submit.settings.button)[0]){return false}node.on("submit",false);node.find(options.submit.settings.button).unbind(e).on(e,function(e){e.preventDefault();resetErrors();_executeCallback(options.submit.callback.onValidate,[node]);if(!validateForm()){_executeCallback(options.submit.callback.onError,[node,errors]);displayErrors()}else{_executeCallback(options.submit.callback.onBeforeSubmit,[node]);options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm();_executeCallback(options.submit.callback.onAfterSubmit,[node])}return false})}function validateForm(){var e=true;$.each(node.find("["+_data.validation+"]:not([readonly], [disabled]),["+_data.regex+"]:not([readonly], [disabled])"),function(t,n){if($(this).is(":disabled")){return false}if(!validateInput(n)){e=false}});return e}function validateInput(e){var t=$(e).attr("name");if(!t){return false}var n=_getInputValue(e),r=t.replace(/]$/,"").split(/]\[|[[\]]/g),i=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||r[r.length-1],s=$(e).attr(_data.validation),o=$(e).attr(_data.validationMessage),u=$(e).attr(_data.regex),a=$(e).attr(_data.regexMessage),f=false;if(s){s=_api._splitValidation(s)}if(s instanceof Array&&s.length>0){if(n===""&&$.inArray("OPTIONAL",s)!==-1){return true}$.each(s,function(e,r){if(f===true){return true}try{validateRule(n,r)}catch(s){if(o||!options.submit.settings.allErrors){f=true}s[0]=o||s[0];registerError(t,s[0].replace("$",i).replace("%",s[1]))}})}if(u){var l=_buildRegexFromString(u);if(!(l instanceof RegExp)){return true}try{validateRule(n,l)}catch(c){c[0]=a||c[0];registerError(t,c[0].replace("$",i))}}return!errors[t]||errors[t]instanceof Array&&errors[t].length===0}function validateRule(value,rule){if(rule instanceof RegExp){if(rule.test(value)){throw[options.messages["default"],""]}return}if(_rules[rule]){var hasError=false;if(rule==="NOSPACE"){if(_rules[rule].test(value)){hasError=true}}else if(!_rules[rule].test(value)){hasError=true}if(hasError){throw[options.messages[rule],""]}return}var comparison=rule.match(_rules.COMPARISON);if(!comparison||comparison.length!==4){return}var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared)){return false}else{if(!value||eval(value.length+operator+parseFloat(compared))===false){throw[options.messages[operator],compared]}}break;case"V":default:if(isNaN(compared)){comparedValue=node.find('[name="'+compared+'"]').val();if(!comparedValue){return false}if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"')){throw[options.messages[operator].replace(" characters",""),compared]}}else{if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared))){throw[options.messages[operator].replace(" characters",""),compared]}}break}}function registerError(e,t){if(!errors[e]){errors[e]=[]}t=t.capitalize();var n=false;for(var r=0;r
                                                          ",o,u;if(!errors.hasOwnProperty(e)){return false}t=node.find('[name="'+e+'"]');i=null;if(!t[0]){return false}o=t.attr(_data.group);if(o){u=node.find('[name="'+e+'"]');i=node.find('[id="'+o+'"]');if(i[0]){i.addClass(options.submit.settings.errorClass);r=i}}else{t.addClass(options.submit.settings.errorClass);if(options.submit.settings.inputContainer){t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass)}n=t.attr("id");if(n){i=node.find('label[for="'+n+'"]')[0]}if(!i){i=t.parentsUntil(node,"label")[0]}if(i){i=$(i);i.addClass(options.submit.settings.errorClass)}}if(options.submit.settings.display==="inline"){r=r||t.parent()}else if(options.submit.settings.display==="block"){r=node}if(options.submit.settings.display==="inline"&&r.find("["+_data.errorList+"]")[0]){return false}if(options.submit.settings.display==="inline"||options.submit.settings.display==="block"&&!r.find("["+_data.errorList+"]")[0]){if(options.submit.settings.insertion==="append"){r.append(s)}else if(options.submit.settings.insertion==="prepend"){r.prepend(s)}}for(var a=0;a"+errors[e][a]+"")}if(options.submit.settings.clear||options.dynamic.settings.trigger){if(o&&u){t=u}var f="coucou"+resetSuffix;if(options.submit.settings.clear){f+=" "+options.submit.settings.clear+resetSuffix}if(options.dynamic.settings.trigger){f+=" "+options.dynamic.settings.trigger+resetSuffix;if(options.dynamic.settings.trigger!=="focusout"){f+=" change"+resetSuffix+" paste"+resetSuffix}}t.unbind(f).on(f,function(e,t,n,r,i){return function(){if(i){if($(n).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r,i)}}else if($(t).hasClass(options.submit.settings.errorClass)){resetOneError(e,t,n,r)}}}(e,t,i,r,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=true;var l=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,h=options.submit.settings.display==="block"?r:t;$("html, body").animate({scrollTop:h.offset().top+l},c)}}function displayErrors(){for(var e in errors){if(!errors.hasOwnProperty(e))continue;displayOneError(e)}}function resetOneError(e,t,n,r,i){delete errors[e];if(r){if(options.submit.settings.inputContainer){(i?n:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass)}n&&n.removeClass(options.submit.settings.errorClass);t.removeClass(options.submit.settings.errorClass);if(options.submit.settings.display==="inline"){r.find("["+_data.errorList+"]").remove()}}else{if(!t){t=node.find('[name="'+e+'"]');if(!t[0]){return false}}t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[];window.Validation.hasScrolled=false;node.find("["+_data.errorList+"]").remove();node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){var e=options.submit.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger){e+=" "+options.dynamic.settings.trigger+delegateSuffix;if(options.dynamic.settings.trigger!=="focusout"){e+=" change"+delegateSuffix+" paste"+delegateSuffix}}$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,n){$(n).unbind(e)});return true}var errors=[],delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=false;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val();break}return t};var _typeWatch=function(){var e=0;return function(t,n){clearTimeout(e);e=setTimeout(t,n)}}();var _executeCallback=function(e,t){if(!e){return false}var n;if(typeof e==="function"){n=e}else if(typeof e==="string"||e instanceof Array){n=window;if(typeof e==="string"){e=[e,[]]}var r=e[0].split("."),i=e[1],s=true,o=0;while(o0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&-1!==$.inArray("OPTIONAL",o))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                            ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From 61f4c6233a31191f0614061223ce4b8c60b6ab86 Mon Sep 17 00:00:00 2001 From: t_bertrand Date: Thu, 12 Feb 2015 18:40:49 -0500 Subject: [PATCH 19/41] Modified NUMERIC rule to match a wider possibility of numbers --- jquery.validation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jquery.validation.js b/jquery.validation.js index de27c75..0a2c3ff 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -38,7 +38,7 @@ var _rules = { NOTEMPTY: /./, INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, + NUMERIC: /^\d+(?:[\s,]\d{3})*(?:\.\d+)?$/, MIXED: /^[\w\s-]+$/, NOSPACE: /^(?!\s)\S*$/, TRIM: /^[^\s].*[^\s]$/, From cda88afac5d7484f9a43ce5e77d26fdb98a310b8 Mon Sep 17 00:00:00 2001 From: t_bertrand Date: Mon, 16 Feb 2015 13:50:47 -0500 Subject: [PATCH 20/41] Version 1.5.1 - Fixed OPTIONAL rule when validating multiline input or textarea - Not validating [READONLY] inputs anymore --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 84 +++++++++++++++---------------- jquery.validation.min.js | 4 +- 3 files changed, 44 insertions(+), 46 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 94820c9..0608b57 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.5.0", + "version": "1.5.1", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index 0a2c3ff..31394b3 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -4,14 +4,13 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-08) + * @version 1.5.1 (2015-02-16) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -;(function (window, document, $, undefined) -{ +;(function (window, document, $, undefined) { window.Validation = { form: [], @@ -23,7 +22,9 @@ * Fail-safe preventExtensions function for older browsers */ if (typeof Object.preventExtensions !== "function") { - Object.preventExtensions = function (obj) { return obj; }; + Object.preventExtensions = function (obj) { + return obj; + }; } // Not using strict to avoid throwing a window error on bad config extend. @@ -38,7 +39,7 @@ var _rules = { NOTEMPTY: /./, INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[\s,]\d{3})*(?:\.\d+)?$/, + NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, MIXED: /^[\w\s-]+$/, NOSPACE: /^(?!\s)\S*$/, TRIM: /^[^\s].*[^\s]$/, @@ -46,7 +47,7 @@ EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /^.*$/, + OPTIONAL: /./, COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ }, @@ -185,7 +186,7 @@ /** * Extends user-defined "options.message" into the default Validation "_message". */ - function extendRules () { + function extendRules() { options.rules = $.extend( true, {}, @@ -197,7 +198,7 @@ /** * Extends user-defined "options.message" into the default Validation "_message". */ - function extendMessages () { + function extendMessages() { options.messages = $.extend( true, {}, @@ -212,7 +213,7 @@ * - preventExtensions prevents from modifying the Validation "_options" object structure * - filter through the "_supported" to delete unsupported "options" */ - function extendOptions () { + function extendOptions() { if (!(options instanceof Object)) { options = {}; @@ -330,7 +331,7 @@ }); // {/debug} - if ( !node.find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + if (!node.find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { // {debug} options.debug && window.Debug.log({ @@ -390,7 +391,7 @@ * Delegates the submit validation on data-validation and data-validation-regex attributes based on trigger. * Note: Disable the form submit function so the callbacks are not by-passed */ - function delegateValidation () { + function delegateValidation() { _executeCallback(options.submit.callback.onInit, [node]); @@ -462,12 +463,12 @@ * * @returns {boolean} true if no error(s) were found (valid form) */ - function validateForm () { + function validateForm() { var isValid = true; $.each( - node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), + node.find('[' + _data.validation + ']:not([disabled],[readonly]),[' + _data.regex + ']:not([disabled],[readonly])'), function (index, input) { if (!validateInput(input)) { isValid = false; @@ -487,7 +488,7 @@ * * @returns {boolean} true if no error(s) were found (valid input) */ - function validateInput (input) { + function validateInput(input) { var inputName = $(input).attr('name'); @@ -529,7 +530,7 @@ if (validationArray instanceof Array && validationArray.length > 0) { // "OPTIONAL" input will not be validated if it's empty - if (value === '' && $.inArray('OPTIONAL', validationArray) !== -1) { + if (value === '' && ~validationArray.indexOf('OPTIONAL')) { return true; } @@ -597,7 +598,7 @@ * * @returns {*} Error if a mismatch occurred. */ - function validateRule (value, rule, reversed) { + function validateRule(value, rule, reversed) { // Validate for "data-validation-regex" and "data-validation-regex-reverse" if (rule instanceof RegExp) { @@ -716,7 +717,7 @@ * @param {string} inputName Input where the error occurred * @param {string} error Description of the error to be displayed */ - function registerError (inputName, error) { + function registerError(inputName, error) { if (!errors[inputName]) { errors[inputName] = []; @@ -747,7 +748,7 @@ * * @returns {boolean} false if an unwanted behavior occurs */ - function displayOneError (inputName) { + function displayOneError(inputName) { var input, inputId, @@ -859,15 +860,15 @@ } } - input.unbind(event).on(event, function (a,b,c,d,e) { + input.unbind(event).on(event, function (a, b, c, d, e) { return function () { if (e) { if ($(c).hasClass(options.submit.settings.errorClass)) { - resetOneError(a,b,c,d,e); + resetOneError(a, b, c, d, e); } } else if ($(b).hasClass(options.submit.settings.errorClass)) { - resetOneError(a,b,c,d); + resetOneError(a, b, c, d); } }; @@ -893,7 +894,7 @@ /** * Display all of the errors */ - function displayErrors () { + function displayErrors() { for (var inputName in errors) { if (!errors.hasOwnProperty(inputName)) continue; @@ -959,7 +960,7 @@ /** * Remove all of the input error(s) display. */ - function resetErrors () { + function resetErrors() { errors = []; window.Validation.hasScrolled = false; @@ -975,7 +976,7 @@ * - This function will be overridden if "options.submit.settings.onSubmit" is defined * - The node can't be submitted by jQuery since it has been disabled, use the form native submit function instead */ - function submitForm () { + function submitForm() { node[0].submit() @@ -986,7 +987,7 @@ * * @returns {boolean} */ - function destroy () { + function destroy() { resetErrors(); node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); @@ -1035,10 +1036,10 @@ * Execute function once the timer is reached. * If the function is recalled before the timer ends, the first call will be canceled. */ - var _typeWatch = (function(){ + var _typeWatch = (function () { var timer = 0; - return function(callback, ms){ - clearTimeout (timer); + return function (callback, ms) { + clearTimeout(timer); timer = setTimeout(callback, ms); }; })(); @@ -1288,7 +1289,7 @@ rules = [rules]; } - for (var i=0; i>> 0; var from = Number(arguments[1]) || 0; @@ -1946,8 +1945,7 @@ if (from < 0) from += len; - for (; from < len; from++) - { + for (; from < len; from++) { if (from in this && this[from] === elt) return from; diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 9ec0135..0640f3f 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.0 (2015-02-08) + * @version 1.5.1 (2015-02-16) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/^.*$/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&-1!==$.inArray("OPTIONAL",o))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                              ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/./,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From fa274b12459ed1b5f0bd4bd1dfbe6b5563c56412 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 18 Feb 2015 19:59:26 -0500 Subject: [PATCH 21/41] Fixed rules NOTEMPTY MIXED OPTIONAL --- jquery.validation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 9c63c5d..728baed 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -36,17 +36,17 @@ * RegExp rules */ var _rules = { - NOTEMPTY: /./, + NOTEMPTY: /\S/, INTEGER: /^\d+$/, NUMERIC: /^\d+(?:[,|\s]\d{3})?(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, + MIXED: /^['\w\s-]+$/, NOSPACE: /^(?!\s)\S*$/, TRIM: /^[^\s].*[^\s]$/, DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /^.*$/, + OPTIONAL: /\S/, COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ }, From 3ded91cc26dccd26c6195a75b00e21eb9312fb30 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 18 Feb 2015 21:10:05 -0500 Subject: [PATCH 22/41] Version 1.5.2 - Fixes #10 Issue with NOTEMPTY rule matching white spaces - Added NAME rule - Removed validation on [readonly] input fields --- html5-form-validation.jquery.json | 2 +- jquery.validation.js | 4 ++-- jquery.validation.min.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 0608b57..844a073 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -9,7 +9,7 @@ "validation", "input" ], - "version": "1.5.1", + "version": "1.5.2", "author": { "name": "Tom Bertrand", "url": "http://www.runningcoder.org/jqueryvalidation/" diff --git a/jquery.validation.js b/jquery.validation.js index bebe658..96c94ee 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.1 (2015-02-16) + * @version 1.5.2 (2015-02-18) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -41,7 +41,7 @@ INTEGER: /^\d+$/, NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, MIXED: /^[\w\s-]+$/, - NAME: /^['a-z\s-]+$/i, + NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, NOSPACE: /^(?!\s)\S*$/, TRIM: /^[^\s].*[^\s]$/, DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 0640f3f..ee245bd 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.1 (2015-02-16) + * @version 1.5.2 (2015-02-18) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/./,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/./,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",NUMERIC:"$ must be numeric.",INTEGER:"$ must be an integer.",STRING:"$ must be a string.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",MIXED:"$ must be letters or numbers (no special characters).",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                  ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                    ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From 6bde9130e9db74faabebba2d3575d622abaa0dd9 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Sat, 14 Mar 2015 14:21:27 -0400 Subject: [PATCH 23/41] - Adding bower file --- bower.json | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 bower.json diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..ce985ed --- /dev/null +++ b/bower.json @@ -0,0 +1,33 @@ +{ + "name": "html5-form-validation", + "main": "jquery.validation.min.js", + "description": "jQuery plugin that provides a client site form validation with builtin options and deep customization.", + "keywords": [ + "form", + "html5", + "validate", + "validation", + "input" + ], + "version": "1.5.2", + "author": { + "name": "Tom Bertrand", + "url": "http://www.runningcoder.org/jqueryvalidation/" + }, + "licenses": "MIT", + "ignore": [ + "demo", + "bower.json", + "html5-form-validation.jquery.json", + "LICENSE", + "README.md" + ], + "homepage": "http://www.runningcoder.org/jqueryvalidation/", + "repository": { + "type": "git", + "url": "git://github.com/running-coder/jquery-form-validation.git" + }, + "dependencies": { + "jquery": ">=1.7.2" + } +} \ No newline at end of file From f78b011fec8c0926295294c919bbe4c4de467220 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Sat, 14 Mar 2015 14:35:41 -0400 Subject: [PATCH 24/41] modified bower --- bower.json | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/bower.json b/bower.json index ce985ed..e87cc49 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,11 @@ { "name": "html5-form-validation", - "main": "jquery.validation.min.js", + "version": "1.5.2", + "authors": [ + "Tom Bertrand" + ], "description": "jQuery plugin that provides a client site form validation with builtin options and deep customization.", + "main": "jquery.validation.min.js", "keywords": [ "form", "html5", @@ -9,20 +13,15 @@ "validation", "input" ], - "version": "1.5.2", - "author": { - "name": "Tom Bertrand", - "url": "http://www.runningcoder.org/jqueryvalidation/" - }, "licenses": "MIT", + "homepage": "http://www.runningcoder.org/jqueryvalidation/", "ignore": [ - "demo", - "bower.json", + "demo/*", + "*.json", "html5-form-validation.jquery.json", "LICENSE", "README.md" ], - "homepage": "http://www.runningcoder.org/jqueryvalidation/", "repository": { "type": "git", "url": "git://github.com/running-coder/jquery-form-validation.git" From 361580281ee9f14187335f25f79ec1bc10005387 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Sat, 14 Mar 2015 14:41:37 -0400 Subject: [PATCH 25/41] bower removed ignore --- bower.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/bower.json b/bower.json index e87cc49..6fd611a 100644 --- a/bower.json +++ b/bower.json @@ -15,13 +15,6 @@ ], "licenses": "MIT", "homepage": "http://www.runningcoder.org/jqueryvalidation/", - "ignore": [ - "demo/*", - "*.json", - "html5-form-validation.jquery.json", - "LICENSE", - "README.md" - ], "repository": { "type": "git", "url": "git://github.com/running-coder/jquery-form-validation.git" From 6a38f6059c8a028a8d7d78ed9f02d6017e35a7d7 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Tue, 17 Mar 2015 12:07:27 -0400 Subject: [PATCH 26/41] 1.5.3 RC1 - Added errorListContainer to allow flexible error list location inside the form dom tree - Corrected onError execution order for form submit --- bower.json | 2 +- jquery.validation.js | 13 ++++++++----- jquery.validation.min.js | 7 +++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/bower.json b/bower.json index 6fd611a..6eec748 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "html5-form-validation", - "version": "1.5.2", + "version": "1.5.3", "authors": [ "Tom Bertrand" ], diff --git a/jquery.validation.js b/jquery.validation.js index 96c94ee..66ae1ca 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.2 (2015-02-18) + * @version 1.5.3 (2015-03-17) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -109,6 +109,7 @@ button: "[type='submit']", errorClass: "error", errorListClass: "error-list", + errorListContainer: null, inputContainer: null, clear: "focusin", scrollToError: false @@ -433,10 +434,8 @@ if (!validateForm()) { - // OnError function receives the "errors" object as the last "extraParam" - _executeCallback(options.submit.callback.onError, [node, errors]); - displayErrors(); + _executeCallback(options.submit.callback.onError, [node, errors]); } else { @@ -820,7 +819,11 @@ } if (options.submit.settings.display === 'inline') { - errorContainer = errorContainer || input.parent(); + if (options.submit.settings.errorListContainer) { + errorContainer = input.parentsUntil(node, options.submit.settings.errorListContainer); + } else { + errorContainer = errorContainer || input.parent(); + } } else if (options.submit.settings.display === 'block') { errorContainer = node; } diff --git a/jquery.validation.min.js b/jquery.validation.min.js index ee245bd..9e7aebc 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -4,7 +4,10 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.2 (2015-02-18) + * @version 1.5.3 (2015-03-17) * @link http://www.runningcoder.org/jqueryvalidation/ + * + * @note + * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                      ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),s=e.length-1;s>0&&/[gimsxeU]/.test(e.charAt(s));)s--;e.charAt(s)!==o&&(o=null),o&&s!==e.length-1&&(i=e.substr(s+1,e.length-1)),r=o?e.substr(1,s-1):e;try{n=new RegExp(r,i)}catch(a){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors])),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),s=$(e).attr(_data.validationMessage),a=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(s||!options.submit.settings.allErrors)&&(u=!0),o[0]=s||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(a){var c=_buildRegexFromString(a);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                        ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(s=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=options.submit.settings.errorListContainer?t.parentsUntil(node,options.submit.settings.errorListContainer):i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(a):"prepend"===options.submit.settings.insertion&&i.prepend(a));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&s&&(t=s);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,s=0;s>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From c3b364ecb85564fcdf058aa83a2a5363d1b48a77 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Tue, 17 Mar 2015 12:07:27 -0400 Subject: [PATCH 27/41] 1.5.3 RC1 - Added errorListContainer to allow flexible error list location inside the form dom tree - Corrected onError execution order for form submit - Removed "readonly restriction" #fixes 15 --- bower.json | 2 +- jquery.validation.js | 15 +++++++++------ jquery.validation.min.js | 7 +++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/bower.json b/bower.json index 6fd611a..6eec748 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "html5-form-validation", - "version": "1.5.2", + "version": "1.5.3", "authors": [ "Tom Bertrand" ], diff --git a/jquery.validation.js b/jquery.validation.js index 96c94ee..70afbae 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.2 (2015-02-18) + * @version 1.5.3 (2015-03-17) * @link http://www.runningcoder.org/jqueryvalidation/ * * @note @@ -109,6 +109,7 @@ button: "[type='submit']", errorClass: "error", errorListClass: "error-list", + errorListContainer: null, inputContainer: null, clear: "focusin", scrollToError: false @@ -433,10 +434,8 @@ if (!validateForm()) { - // OnError function receives the "errors" object as the last "extraParam" - _executeCallback(options.submit.callback.onError, [node, errors]); - displayErrors(); + _executeCallback(options.submit.callback.onError, [node, errors]); } else { @@ -469,7 +468,7 @@ var isValid = true; $.each( - node.find('[' + _data.validation + ']:not([disabled],[readonly]),[' + _data.regex + ']:not([disabled],[readonly])'), + node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), function (index, input) { if (!validateInput(input)) { isValid = false; @@ -820,7 +819,11 @@ } if (options.submit.settings.display === 'inline') { - errorContainer = errorContainer || input.parent(); + if (options.submit.settings.errorListContainer) { + errorContainer = input.parentsUntil(node, options.submit.settings.errorListContainer); + } else { + errorContainer = errorContainer || input.parent(); + } } else if (options.submit.settings.display === 'block') { errorContainer = node; } diff --git a/jquery.validation.min.js b/jquery.validation.min.js index ee245bd..e4c6cc6 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -4,7 +4,10 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.2 (2015-02-18) + * @version 1.5.3 (2015-03-17) * @link http://www.runningcoder.org/jqueryvalidation/ + * + * @note + * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled],[readonly]),["+_data.regex+"]:not([disabled],[readonly])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                          ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),s=e.length-1;s>0&&/[gimsxeU]/.test(e.charAt(s));)s--;e.charAt(s)!==o&&(o=null),o&&s!==e.length-1&&(i=e.substr(s+1,e.length-1)),r=o?e.substr(1,s-1):e;try{n=new RegExp(r,i)}catch(a){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors])),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),s=$(e).attr(_data.validationMessage),a=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(s||!options.submit.settings.allErrors)&&(u=!0),o[0]=s||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(a){var c=_buildRegexFromString(a);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                            ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(s=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=options.submit.settings.errorListContainer?t.parentsUntil(node,options.submit.settings.errorListContainer):i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(a):"prepend"===options.submit.settings.insertion&&i.prepend(a));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&s&&(t=s);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,s=0;s>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From 0e5f7ced2b228650eba0c207d2eadcc95f42831b Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Mon, 23 Mar 2015 14:41:07 -0400 Subject: [PATCH 28/41] - Fixed OPTIONAL issue when the validate field contains space character only --- jquery.validation.js | 2 +- jquery.validation.min.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 70afbae..975ca99 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -530,7 +530,7 @@ if (validationArray instanceof Array && validationArray.length > 0) { // "OPTIONAL" input will not be validated if it's empty - if (value === '' && ~validationArray.indexOf('OPTIONAL')) { + if ($.trim(value) === '' && ~validationArray.indexOf('OPTIONAL')) { return true; } diff --git a/jquery.validation.min.js b/jquery.validation.min.js index 9677f3b..5d42ddc 100644 --- a/jquery.validation.min.js +++ b/jquery.validation.min.js @@ -6,9 +6,5 @@ * @author Tom Bertrand * @version 1.5.3 (2015-03-17) * @link http://www.runningcoder.org/jqueryvalidation/ - * - * @note - * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),a=e.length-1;a>0&&/[gimsxeU]/.test(e.charAt(a));)a--;e.charAt(a)!==o&&(o=null),o&&a!==e.length-1&&(i=e.substr(a+1,e.length-1)),r=o?e.substr(1,a-1):e;try{n=new RegExp(r,i)}catch(s){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(_executeCallback(options.submit.callback.onError,[node,errors]),displayErrors()),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),a=$(e).attr(_data.validationMessage),s=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(a||!options.submit.settings.allErrors)&&(u=!0),o[0]=a||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(s){var c=_buildRegexFromString(s);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                              ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(a=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(s):"prepend"===options.submit.settings.insertion&&i.prepend(s));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&a&&(t=a);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,a=0;a>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),s=e.length-1;s>0&&/[gimsxeU]/.test(e.charAt(s));)s--;e.charAt(s)!==o&&(o=null),o&&s!==e.length-1&&(i=e.substr(s+1,e.length-1)),r=o?e.substr(1,s-1):e;try{n=new RegExp(r,i)}catch(a){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors])),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),s=$(e).attr(_data.validationMessage),a=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===r&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(s||!options.submit.settings.allErrors)&&(u=!0),o[0]=s||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(a){var c=_buildRegexFromString(a);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                                ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(s=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=options.submit.settings.errorListContainer?t.parentsUntil(node,options.submit.settings.errorListContainer):i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(a):"prepend"===options.submit.settings.insertion&&i.prepend(a));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&s&&(t=s);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,s=0;s>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),s=e.length-1;s>0&&/[gimsxeU]/.test(e.charAt(s));)s--;e.charAt(s)!==o&&(o=null),o&&s!==e.length-1&&(i=e.substr(s+1,e.length-1)),r=o?e.substr(1,s-1):e;try{n=new RegExp(r,i)}catch(a){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors])),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),s=$(e).attr(_data.validationMessage),a=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===$.trim(r)&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(s||!options.submit.settings.allErrors)&&(u=!0),o[0]=s||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(a){var c=_buildRegexFromString(a);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                                  ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(s=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=options.submit.settings.errorListContainer?t.parentsUntil(node,options.submit.settings.errorListContainer):i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(a):"prepend"===options.submit.settings.insertion&&i.prepend(a));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&s&&(t=s);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,s=0;s>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file From 572ddb6d71d52ef6a56576f834ea122a350c42f0 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Tue, 21 Apr 2015 12:12:51 -0400 Subject: [PATCH 29/41] Added formData parameter to onSubmit and onError callbacks --- jquery.validation.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jquery.validation.js b/jquery.validation.js index 975ca99..11228c2 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -180,6 +180,7 @@ var errors = [], messages = {}, + formData = {}, delegateSuffix = ".vd", // validation.delegate resetSuffix = ".vr"; // validation.resetError @@ -435,13 +436,13 @@ if (!validateForm()) { displayErrors(); - _executeCallback(options.submit.callback.onError, [node, errors]); + _executeCallback(options.submit.callback.onError, [node, errors, formData]); } else { _executeCallback(options.submit.callback.onBeforeSubmit, [node]); - (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node]) : submitForm(); + (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]) : submitForm(); _executeCallback(options.submit.callback.onAfterSubmit, [node]); @@ -467,6 +468,8 @@ var isValid = true; + formData = {}; + $.each( node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), function (index, input) { @@ -584,6 +587,8 @@ } + formData[inputName] = value; + return !errors[inputName] || errors[inputName] instanceof Array && errors[inputName].length === 0; } From b8813296c4e729befb906323bba3f63cb2c17080 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Tue, 21 Apr 2015 12:23:33 -0400 Subject: [PATCH 30/41] Fixed error where radio or checkbox input errors wouldnt clear on change --- jquery.validation.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jquery.validation.js b/jquery.validation.js index 11228c2..a8a170f 100644 --- a/jquery.validation.js +++ b/jquery.validation.js @@ -861,10 +861,13 @@ var event = "coucou" + resetSuffix; if (options.submit.settings.clear) { event += " " + options.submit.settings.clear + resetSuffix; + if (~['radio', 'checkbox'].indexOf(input[0].type)) { + event += " change" + resetSuffix; + } } if (options.dynamic.settings.trigger) { event += " " + options.dynamic.settings.trigger + resetSuffix; - if (options.dynamic.settings.trigger !== "focusout") { + if (options.dynamic.settings.trigger !== "focusout" && !~['radio', 'checkbox'].indexOf(input[0].type)) { event += " change" + resetSuffix + " paste" + resetSuffix; } } From ba4073ad275b7ef3825d65162311b39ea55861c4 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 22 Apr 2015 01:37:48 -0400 Subject: [PATCH 31/41] - Added Grunt - Modified formData to contain serialized form object --- .gitignore | 2 + Gruntfile.js | 129 ++ bower.json | 1 + dist/jquery.validation.js | 1580 +++++++++++++++++ dist/jquery.validation.min.js | 10 + {demo => example}/demo.html | 0 {demo => example}/jquery.validation.css | 0 {demo => example}/loader-medium.gif | Bin jquery.validation.min.js | 10 - package.json | 30 + .../jquery.validation.js | 55 +- 11 files changed, 1801 insertions(+), 16 deletions(-) create mode 100644 .gitignore create mode 100644 Gruntfile.js create mode 100644 dist/jquery.validation.js create mode 100644 dist/jquery.validation.min.js rename {demo => example}/demo.html (100%) rename {demo => example}/jquery.validation.css (100%) rename {demo => example}/loader-medium.gif (100%) delete mode 100644 jquery.validation.min.js create mode 100644 package.json rename jquery.validation.js => src/jquery.validation.js (98%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..93f1361 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..9ac8fca --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,129 @@ +module.exports = function (grunt) { + + grunt.initConfig({ + + pkg: grunt.file.readJSON('package.json'), + + banner: '/*!\n' + + ' * jQuery Form Validation\n' + + ' * Copyright (C) 2015 RunningCoder.org\n' + + ' * Licensed under the MIT license\n' + + ' *\n' + + ' * @author <%= pkg.author.name %>\n' + + ' * @version <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd") %>)\n' + + ' * @link http://www.runningcoder.org/jqueryvalidation/\n' + + '*/\n', + + clean: { + dist: ["dist"] + }, + + copy: { + dist: { + files: [ + { + src: ['src/jquery.validation.js'], + dest: 'dist/jquery.validation.js' + }, + { + src: ['src/jquery.validation.js'], + dest: 'dist/jquery.validation.min.js' + } + ] + } + }, + + comments: { + dist: { + options: { + singleline: true, + multiline: true + }, + src: [ 'dist/*.js'] + } + }, + + replace: { + banner: { + options: { + patterns: [ + { + match: /\/\*![\S\s]+?\*\/[\r\n]*/, + replacement: '<%= banner %>' + } + ] + }, + files: [ + { + src: ['src/jquery.validation.js'], + dest: 'src/jquery.validation.js' + } + ] + }, + removeDebug: { + options: { + patterns: [ + { + match: /\s?\{debug\}[\s\S]*?\{\/debug\}/g, + replacement: '' + } + ] + }, + files: [ + { + src: ['dist/jquery.validation.min.js'], + dest: 'dist/jquery.validation.min.js' + } + ] + }, + removeComments: { + options: { + patterns: [ + { + match: /\/\*[^!][\S\s]+?\*\/[\r\n]?/gm, + replacement: '' + } + ] + }, + files: [ + { + src: ['dist/jquery.validation.js'], + dest: 'dist/jquery.validation.js' + } + ] + } + }, + + uglify: { + dist: { + options: { + mangle: true, + compress: true, + banner: '<%= banner %>' + }, + files: { + 'dist/jquery.validation.min.js': ['dist/jquery.validation.min.js'] + } + } + + } + + }); + + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-stripcomments'); + grunt.loadNpmTasks('grunt-replace'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + + grunt.registerTask('default', [ + 'clean:dist', + 'replace:banner', + 'copy:dist', + 'comments', + 'replace:removeComments', + 'replace:removeDebug', + 'uglify' + ]); + +}; diff --git a/bower.json b/bower.json index 6eec748..5e42e12 100644 --- a/bower.json +++ b/bower.json @@ -13,6 +13,7 @@ "validation", "input" ], + "ignore": [], "licenses": "MIT", "homepage": "http://www.runningcoder.org/jqueryvalidation/", "repository": { diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js new file mode 100644 index 0000000..a5a181e --- /dev/null +++ b/dist/jquery.validation.js @@ -0,0 +1,1580 @@ +/*! + * jQuery Form Validation + * Copyright (C) 2015 RunningCoder.org + * Licensed under the MIT license + * + * @author Tom Bertrand + * @version 2.0.0 (2015-04-22) + * @link http://www.runningcoder.org/jqueryvalidation/ +*/ +;(function (window, document, $, undefined) { + + window.Validation = { + form: [], + labels: {}, + hasScrolled: false + }; + + + if (typeof Object.preventExtensions !== "function") { + Object.preventExtensions = function (obj) { + return obj; + }; + } + + var _rules = { + NOTEMPTY: /\S/, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /\S/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }, + + + _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'INTEGER': '$ must be an integer.', + 'NUMERIC': '$ must be numeric.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'NAME': '$ must not contain special characters.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }, + + + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + }, + + + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + errorListContainer: null, + inputContainer: null, + clear: "focusin", + scrollToError: false + }, + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 + }, + callback: { + onSuccess: null, + onError: null, + onComplete: null + } + }, + rules: {}, + messages: {}, + labels: {}, + debug: false + }, + + + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; + + + var Validation = function (node, options) { + + var errors = [], + messages = {}, + formData = {}, + delegateSuffix = ".vd", // validation.delegate + resetSuffix = ".vr"; // validation.resetError + + window.Validation.hasScrolled = false; + + + function extendRules() { + options.rules = $.extend( + true, + {}, + _rules, + options.rules + ); + } + + + function extendMessages() { + options.messages = $.extend( + true, + {}, + _messages, + options.messages + ); + } + + + function extendOptions() { + + if (!(options instanceof Object)) { + options = {}; + } + + var tpmOptions = Object.preventExtensions($.extend(true, {}, _options)); + + for (var method in options) { + + if (!options.hasOwnProperty(method) || method === "debug") { + continue; + } + + if (~["labels", "messages", "rules"].indexOf(method) && options[method] instanceof Object) { + tpmOptions[method] = options[method]; + continue; + } + + if (!_options[method] || !(options[method] instanceof Object)) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + method + ': ' + JSON.stringify(options[method]) + '}', + 'message': 'WARNING - ' + method + ' - invalid option' + }); + + continue; + } + + for (var type in options[method]) { + if (!options[method].hasOwnProperty(type)) { + continue; + } + + if (!_options[method][type] || !(options[method][type] instanceof Object)) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + type + ': ' + JSON.stringify(options[method][type]) + '}', + 'message': 'WARNING - ' + type + ' - invalid option' + }); + + continue; + } + + for (var option in options[method][type]) { + if (!options[method][type].hasOwnProperty(option)) { + continue; + } + + if (_supported[method] && + _supported[method][type] && + _supported[method][type][option] && + $.inArray(options[method][type][option], _supported[method][type][option]) === -1) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'extendOptions()', + 'arguments': '{' + option + ': ' + JSON.stringify(options[method][type][option]) + '}', + 'message': 'WARNING - ' + option.toString() + ': ' + JSON.stringify(options[method][type][option]) + ' - unsupported option' + }); + + delete options[method][type][option]; + } + + } + if (tpmOptions[method] && tpmOptions[method][type]) { + tpmOptions[method][type] = $.extend(Object.preventExtensions(tpmOptions[method][type]), options[method][type]); + } + } + } + if (options.debug && $.inArray(options.debug, _supported.debug !== -1)) { + tpmOptions.debug = options.debug; + } + if (tpmOptions.dynamic.settings.trigger) { + if (tpmOptions.dynamic.settings.trigger === "keypress" && tpmOptions.submit.settings.clear === "keypress") { + tpmOptions.dynamic.settings.trigger = "keydown"; + } + } + + options = tpmOptions; + + } + + + function delegateDynamicValidation() { + + if (!options.dynamic.settings.trigger) { + return false; + } + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateDynamicValidation()', + 'arguments': JSON.stringify(options), + 'message': 'OK - Dynamic Validation activated on ' + node.length + ' form(s)' + }); + + if (!node.find('[' + _data.validation + '],[' + _data.regex + ']')[0]) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateDynamicValidation()', + 'arguments': 'node.find([' + _data.validation + '],[' + _data.regex + '])', + 'message': 'ERROR - [' + _data.validation + '] not found' + }); + + return false; + } + + var event = options.dynamic.settings.trigger + delegateSuffix; + if (options.dynamic.settings.trigger !== "focusout") { + event += " change" + delegateSuffix + " paste" + delegateSuffix; + } + + $.each( + node.find('[' + _data.validation + '],[' + _data.regex + ']'), + function (index, input) { + + $(input).unbind(event).on(event, function (e) { + + if ($(this).is(':disabled')) { + return false; + } + + var input = this, + keyCode = e.keyCode || null; + + _typeWatch(function () { + + if (!validateInput(input)) { + + displayOneError(input.name); + _executeCallback(options.dynamic.callback.onError, [node, input, keyCode, errors[input.name]]); + + } else { + + _executeCallback(options.dynamic.callback.onSuccess, [node, input, keyCode]); + + } + + _executeCallback(options.dynamic.callback.onComplete, [node, input, keyCode]); + + }, options.dynamic.settings.delay); + + }); + } + ); + } + + + function delegateValidation() { + + _executeCallback(options.submit.callback.onInit, [node]); + + var event = options.submit.settings.trigger + '.vd'; + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateValidation()', + 'arguments': JSON.stringify(options), + 'message': 'OK - Validation activated on ' + node.length + ' form(s)' + }); + + if (!node.find(options.submit.settings.button)[0]) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'delegateValidation()', + 'arguments': '{button: ' + options.submit.settings.button + '}', + 'message': 'ERROR - node.find("' + options.submit.settings.button + '") not found' + }); + + return false; + + } + + node.on("submit", false); + node.find(options.submit.settings.button).off('.vd').on(event, function (e) { + + e.preventDefault(); + + resetErrors(); + + _executeCallback(options.submit.callback.onValidate, [node]); + + if (!validateForm()) { + + displayErrors(); + _executeCallback(options.submit.callback.onError, [node, errors, formData]); + + } else { + + _executeCallback(options.submit.callback.onBeforeSubmit, [node]); + + (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]) : submitForm(); + + _executeCallback(options.submit.callback.onAfterSubmit, [node]); + + } + options.debug && window.Debug.print(); + + return false; + + }); + + } + + + function validateForm() { + + var isValid = true; + + formData = {}; + + $.each( + node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), + function (index, input) { + if (!validateInput(input)) { + isValid = false; + } + } + ); + + prepareFormData(); + + return isValid; + + } + + + function prepareFormData () { + + var data = {}, + matches, + index; + + for (var i in formData) { + if (!formData.hasOwnProperty(i)) continue; + + index = 0; + matches = i.split(/\[(.+?)\]/g); + + var tmpObject = {}, + tmpArray = []; + + for (var k = matches.length - 1; k >= 0 ; k--) { + if (matches[k] === "") { + matches.splice(k, 1); + continue; + } + + if (tmpArray.length < 1) { + tmpObject[matches[k]] = formData[i] + } else { + tmpObject = {}; + tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; + } + tmpArray.push(tmpObject) + + } + + data = $.extend(true, data, tmpObject); + + } + + formData = data; + + } + + + function validateInput(input) { + + var inputName = $(input).attr('name'); + + if (!inputName) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateInput()', + 'arguments': '$(input).attr("name")', + 'message': 'ERROR - Missing input [name]' + }); + + return false; + } + + var value = _getInputValue(input), + + matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), + inputShortName = window.Validation.labels[inputName] || + options.labels[inputName] || + $(input).attr(_data.label) || + matches[matches.length - 1], + + validationArray = $(input).attr(_data.validation), + validationMessage = $(input).attr(_data.validationMessage), + validationRegex = $(input).attr(_data.regex), + validationRegexReverse = !($(input).attr(_data.regexReverse) === undefined), + validationRegexMessage = $(input).attr(_data.regexMessage), + + validateOnce = false; + + if (validationArray) { + validationArray = _api._splitValidation(validationArray); + } + if (validationArray instanceof Array && validationArray.length > 0) { + if ($.trim(value) === '' && ~validationArray.indexOf('OPTIONAL')) { + return true; + } + + $.each(validationArray, function (i, rule) { + + if (validateOnce === true) { + return true; + } + + try { + + validateRule(value, rule); + + } catch (error) { + + if (validationMessage || !options.submit.settings.allErrors) { + validateOnce = true; + } + + error[0] = validationMessage || error[0]; + + registerError(inputName, error[0].replace('$', inputShortName).replace('%', error[1])); + + } + + }); + + } + if (validationRegex) { + + var rule = _buildRegexFromString(validationRegex); + if (!(rule instanceof RegExp)) { + return true; + } + + try { + + validateRule(value, rule, validationRegexReverse); + + } catch (error) { + + error[0] = validationRegexMessage || error[0]; + + registerError(inputName, error[0].replace('$', inputShortName)); + + } + + } + + formData[inputName] = value; + + return !errors[inputName] || errors[inputName] instanceof Array && errors[inputName].length === 0; + + } + + + function validateRule(value, rule, reversed) { + if (rule instanceof RegExp) { + var isValid = rule.test(value); + + if (reversed) { + isValid = !isValid; + } + + if (!isValid) { + throw [options.messages['default'], '']; + } + return; + } + + if (options.rules[rule]) { + if (!options.rules[rule].test(value)) { + throw [options.messages[rule], '']; + } + return; + } + var comparison = rule.match(options.rules.COMPARISON); + + if (!comparison || comparison.length !== 4) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'value: ' + value + ' rule: ' + rule, + 'message': 'WARNING - Invalid comparison' + }); + + return; + } + + var type = comparison[1], + operator = comparison[2], + compared = comparison[3], + comparedValue; + + switch (type) { + case "L": + if (isNaN(compared)) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'compare: ' + compared + ' rule: ' + rule, + 'message': 'WARNING - Invalid rule, "L" compare must be numeric' + }); + + return false; + + } else { + + if (!value || eval(value.length + operator + parseFloat(compared)) === false) { + throw [options.messages[operator], compared]; + } + + } + + break; + case "V": + default: + if (isNaN(compared)) { + + comparedValue = node.find('[name="' + compared + '"]').val(); + if (!comparedValue) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'validateRule()', + 'arguments': 'compare: ' + compared + ' rule: ' + rule, + 'message': 'WARNING - Unable to find compared field [name="' + compared + '"]' + }); + + return false; + } + + if (!value || !eval('"' + encodeURIComponent(value) + '"' + operator + '"' + encodeURIComponent(comparedValue) + '"')) { + throw [options.messages[operator].replace(' characters', ''), compared]; + } + + } else { + if (!value || isNaN(value) || !eval(value + operator + parseFloat(compared))) { + throw [options.messages[operator].replace(' characters', ''), compared]; + } + + } + break; + + } + + } + + + function registerError(inputName, error) { + + if (!errors[inputName]) { + errors[inputName] = []; + } + + error = error.capitalize(); + + var hasError = false; + for (var i = 0; i < errors[inputName].length; i++) { + if (errors[inputName][i] === error) { + hasError = true; + break; + } + } + + if (!hasError) { + errors[inputName].push(error); + } + + } + + + function displayOneError(inputName) { + + var input, + inputId, + errorContainer, + label, + html = '
                                                                                    ', + group, + groupInput; + + if (!errors.hasOwnProperty(inputName)) { + return false; + } + + input = node.find('[name="' + inputName + '"]'); + + label = null; + + if (!input[0]) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'displayOneError()', + 'arguments': '[name="' + inputName + '"]', + 'message': 'ERROR - Unable to find input by name "' + inputName + '"' + }); + + return false; + } + + group = input.attr(_data.group); + + if (group) { + + groupInput = node.find('[name="' + inputName + '"]'); + label = node.find('[id="' + group + '"]'); + + if (label[0]) { + label.addClass(options.submit.settings.errorClass); + errorContainer = label; + } + + } else { + + input.addClass(options.submit.settings.errorClass); + + if (options.submit.settings.inputContainer) { + input.parentsUntil(node, options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass); + } + + inputId = input.attr('id'); + + if (inputId) { + label = node.find('label[for="' + inputId + '"]')[0]; + } + + if (!label) { + label = input.parentsUntil(node, 'label')[0]; + } + + if (label) { + label = $(label); + label.addClass(options.submit.settings.errorClass); + } + } + + if (options.submit.settings.display === 'inline') { + if (options.submit.settings.errorListContainer) { + errorContainer = input.parentsUntil(node, options.submit.settings.errorListContainer); + } else { + errorContainer = errorContainer || input.parent(); + } + } else if (options.submit.settings.display === 'block') { + errorContainer = node; + } + if (options.submit.settings.display === 'inline' && errorContainer.find('[' + _data.errorList + ']')[0]) { + return false; + } + + if (options.submit.settings.display === "inline" || + (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) + ) { + if (options.submit.settings.insertion === 'append') { + errorContainer.append(html); + } else if (options.submit.settings.insertion === 'prepend') { + errorContainer.prepend(html); + } + } + + for (var i = 0; i < errors[inputName].length; i++) { + errorContainer.find('ul').append('
                                                                                  • ' + errors[inputName][i] + '
                                                                                  • '); + } + + if (options.submit.settings.clear || options.dynamic.settings.trigger) { + + if (group && groupInput) { + input = groupInput; + } + + var event = "coucou" + resetSuffix; + if (options.submit.settings.clear) { + event += " " + options.submit.settings.clear + resetSuffix; + if (~['radio', 'checkbox'].indexOf(input[0].type)) { + event += " change" + resetSuffix; + } + } + if (options.dynamic.settings.trigger) { + event += " " + options.dynamic.settings.trigger + resetSuffix; + if (options.dynamic.settings.trigger !== "focusout" && !~['radio', 'checkbox'].indexOf(input[0].type)) { + event += " change" + resetSuffix + " paste" + resetSuffix; + } + } + + input.unbind(event).on(event, function (a, b, c, d, e) { + + return function () { + if (e) { + if ($(c).hasClass(options.submit.settings.errorClass)) { + resetOneError(a, b, c, d, e); + } + } else if ($(b).hasClass(options.submit.settings.errorClass)) { + resetOneError(a, b, c, d); + } + }; + + }(inputName, input, label, errorContainer, group)); + } + + if (options.submit.settings.scrollToError && !window.Validation.hasScrolled) { + + window.Validation.hasScrolled = true; + + var offset = parseFloat(options.submit.settings.scrollToError.offset) || 0, + duration = parseFloat(options.submit.settings.scrollToError.duration) || 500, + handle = (options.submit.settings.display === 'block') ? errorContainer : input; + + $('html, body').animate({ + scrollTop: handle.offset().top + offset + }, duration); + + } + + } + + + function displayErrors() { + + for (var inputName in errors) { + if (!errors.hasOwnProperty(inputName)) continue; + displayOneError(inputName); + } + + } + + + function resetOneError(inputName, input, label, container, group) { + + delete errors[inputName]; + + if (container) { + + if (options.submit.settings.inputContainer) { + (group ? label : input).parentsUntil(node, options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass); + } + + label && label.removeClass(options.submit.settings.errorClass); + + input.removeClass(options.submit.settings.errorClass); + + if (options.submit.settings.display === 'inline') { + container.find('[' + _data.errorList + ']').remove(); + } + + } else { + + if (!input) { + input = node.find('[name="' + inputName + '"]'); + + if (!input[0]) { + options.debug && window.Debug.log({ + 'node': node, + 'function': 'resetOneError()', + 'arguments': '[name="' + inputName + '"]', + 'message': 'ERROR - Unable to find input by name "' + inputName + '"' + }); + + return false; + } + } + + input.trigger('coucou' + resetSuffix); + } + + } + + + function resetErrors() { + + errors = []; + window.Validation.hasScrolled = false; + + node.find('[' + _data.errorList + ']').remove(); + node.find('.' + options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass); + + } + + + function submitForm() { + + node[0].submit() + + } + + + function destroy() { + + resetErrors(); + node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); + + node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function () { + $(this).closest('form')[0].submit(); + }); + + return true; + + } + + + var _getInputValue = function (input) { + + var value; + switch ($(input).attr('type')) { + case 'checkbox': + value = ($(input).is(':checked')) ? 1 : ''; + break; + case 'radio': + value = node.find('input[name="' + $(input).attr('name') + '"]:checked').val() || ''; + break; + default: + value = $(input).val(); + break; + } + + return value; + + }; + + + var _typeWatch = (function () { + var timer = 0; + return function (callback, ms) { + clearTimeout(timer); + timer = setTimeout(callback, ms); + }; + })(); + + + var _executeCallback = function (callback, extraParams) { + + if (!callback) { + return false; + } + + var _callback; + + if (typeof callback === "function") { + + _callback = callback; + + } else if (typeof callback === "string" || callback instanceof Array) { + + _callback = window; + + if (typeof callback === "string") { + callback = [callback, []]; + } + + var _exploded = callback[0].split('.'), + _params = callback[1], + _isValid = true, + _splitIndex = 0; + + while (_splitIndex < _exploded.length) { + + if (typeof _callback !== 'undefined') { + _callback = _callback[_exploded[_splitIndex++]]; + } else { + _isValid = false; + break; + } + } + + if (!_isValid || typeof _callback !== "function") { + options.debug && window.Debug.log({ + 'node': node, + 'function': '_executeCallback()', + 'arguments': JSON.stringify(callback), + 'message': 'WARNING - Invalid callback function"' + }); + + return false; + } + + } + + _callback.apply(this, $.merge(_params || [], (extraParams) ? extraParams : [])); + return true; + + }; + + + this.__construct = function () { + + extendOptions(); + extendRules(); + extendMessages(); + + delegateDynamicValidation(); + delegateValidation(); + options.debug && window.Debug.print(); + + }(); + + return { + + + registerError: registerError, + + + displayOneError: displayOneError, + + + displayErrors: displayErrors, + + + resetOneError: resetOneError, + + + resetErrors: resetErrors, + + + destroy: destroy + + }; + + }; + + + $.fn.validate = $.validate = function (options) { + + return _api.validate(this, options); + + }; + + + $.fn.addValidation = function (validation) { + + return _api.addValidation(this, validation); + + }; + + + $.fn.removeValidation = function (validation) { + + return _api.removeValidation(this, validation); + + }; + + + $.fn.addError = function (error) { + + return _api.addError(this, error); + + }; + + + $.fn.removeError = function (error) { + + return _api.removeError(this, error); + + }; + + + $.fn.alterValidationRules = $.alterValidationRules = function (rules) { + + if (!(rules instanceof Array)) { + rules = [rules]; + } + + for (var i = 0; i < rules.length; i++) { + _api.alterValidationRules(rules[i]); + } + + }; + + + var _api = { + + + _formatValidation: function (validation) { + + validation = validation.toString().replace(/\s/g, ''); + + if (validation.charAt(0) === "[" && validation.charAt(validation.length - 1) === "]") { + validation = validation.replace(/^\[|\]$/g, ''); + } + + return validation; + + }, + + + _splitValidation: function (validation) { + + var validationArray = this._formatValidation(validation).split(','), + oneValidation; + + for (var i = 0; i < validationArray.length; i++) { + oneValidation = validationArray[i]; + if (/^[a-z]+$/i.test(oneValidation)) { + validationArray[i] = oneValidation.toUpperCase(); + } + } + + return validationArray; + }, + + + _joinValidation: function (validation) { + + return '[' + validation.join(', ') + ']'; + + }, + + + validate: function (node, options) { + + if (typeof node === "function") { + + if (!options.submit.settings.form) { + window.Debug.log({ + 'node': node, + 'function': '$.validate()', + 'arguments': '', + 'message': 'Undefined property "options.submit.settings.form - Validation dropped' + }); + + window.Debug.print(); + + return; + } + + node = $(options.submit.settings.form); + + if (!node[0] || node[0].nodeName.toLowerCase() !== "form") { + window.Debug.log({ + 'function': '$.validate()', + 'arguments': JSON.stringify(options.submit.settings.form), + 'message': 'Unable to find jQuery form element - Validation dropped' + }); + + window.Debug.print(); + + return; + } + + } else if (typeof node[0] === 'undefined') { + window.Debug.log({ + 'node': node, + 'function': '$.validate()', + 'arguments': '$("' + node.selector + '").validate()', + 'message': 'Unable to find jQuery form element - Validation dropped' + }); + + window.Debug.print(); + + return; + } + + if (options === "destroy") { + + if (!window.Validation.form[node.selector]) { + window.Debug.log({ + 'node': node, + 'function': '$.validate("destroy")', + 'arguments': '', + 'message': 'Unable to destroy "' + node.selector + '", perhaps it\'s already destroyed?' + }); + + window.Debug.print(); + + return; + } + + window.Validation.form[node.selector].destroy(); + + return; + + } + + return node.each(function () { + window.Validation.form[node.selector] = new Validation($(this), options); + }); + + }, + + + addValidation: function (node, validation) { + + var self = this; + + validation = self._splitValidation(validation); + + if (!validation) { + return false; + } + + return node.each(function () { + + var $this = $(this), + validationData = $this.attr(_data.validation), + validationArray = (validationData && validationData.length) ? self._splitValidation(validationData) : [], + oneValidation; + + for (var i = 0; i < validation.length; i++) { + + oneValidation = self._formatValidation(validation[i]); + + if ($.inArray(oneValidation, validationArray) === -1) { + validationArray.push(oneValidation); + } + } + + if (validationArray.length) { + $this.attr(_data.validation, self._joinValidation(validationArray)); + } + + }); + + }, + + + removeValidation: function (node, validation) { + + var self = this; + + validation = self._splitValidation(validation); + if (!validation) { + return false; + } + + return node.each(function () { + + var $this = $(this), + validationData = $this.attr(_data.validation), + validationArray = (validationData && validationData.length) ? self._splitValidation(validationData) : [], + oneValidation, + validationIndex; + + if (!validationArray.length) { + $this.removeAttr(_data.validation); + return true; + } + + for (var i = 0; i < validation.length; i++) { + oneValidation = self._formatValidation(validation[i]); + validationIndex = $.inArray(oneValidation, validationArray); + if (validationIndex !== -1) { + validationArray.splice(validationIndex, 1); + } + + } + + if (!validationArray.length) { + $this.removeAttr(_data.validation); + return true; + } + + $this.attr(_data.validation, self._joinValidation(validationArray)); + + }); + + }, + + + addError: function (node, error) { + + if (!window.Validation.form[node.selector]) { + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid node selector' + }); + + window.Debug.print(); + + return false; + } + + if (typeof error !== "object" || Object.prototype.toString.call(error) !== "[object Object]") { + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid argument, must be type object' + }); + + window.Debug.print(); + + return false; + } + + var input, + onlyOnce = true; + for (var inputName in error) { + + if (!error.hasOwnProperty(inputName)) { + continue; + } + + if (!(error[inputName] instanceof Array)) { + error[inputName] = [error[inputName]]; + } + + input = $(node.selector).find('[name="' + inputName + '"]'); + if (!input[0]) { + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': JSON.stringify(inputName), + 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName + '"]")' + }); + + window.Debug.print(); + + continue; + } + + if (onlyOnce) { + window.Validation.hasScrolled = false; + onlyOnce = false; + } + + window.Validation.form[node.selector].resetOneError(inputName, input); + + for (var i = 0; i < error[inputName].length; i++) { + + if (typeof error[inputName][i] !== "string") { + window.Debug.log({ + 'node': node, + 'function': '$.addError()', + 'arguments': JSON.stringify(error[inputName][i]), + 'message': 'ERROR - Invalid error object property - Accepted format: {"inputName": "errorString"} or {"inputName": ["errorString", "errorString"]}' + }); + + window.Debug.print(); + + continue; + } + + window.Validation.form[node.selector].registerError(inputName, error[inputName][i]); + + } + + window.Validation.form[node.selector].displayOneError(inputName); + + } + + }, + + + removeError: function (node, inputName) { + + if (!window.Validation.form[node.selector]) { + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'message': 'ERROR - Invalid node selector' + }); + + window.Debug.print(); + + return false; + } + + if (!inputName) { + window.Validation.form[node.selector].resetErrors(); + return false; + } + + if (typeof inputName === "object" && Object.prototype.toString.call(inputName) !== "[object Array]") { + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': JSON.stringify(inputName), + 'message': 'ERROR - Invalid inputName, must be type String or Array' + }); + + window.Debug.print(); + + return false; + } + + if (!(inputName instanceof Array)) { + inputName = [inputName]; + } + + var input; + for (var i = 0; i < inputName.length; i++) { + + input = $(node.selector).find('[name="' + inputName[i] + '"]'); + if (!input[0]) { + window.Debug.log({ + 'node': node, + 'function': '$.removeError()', + 'arguments': JSON.stringify(inputName[i]), + 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName[i] + '"]")' + }); + + window.Debug.print(); + + continue; + } + + window.Validation.form[node.selector].resetOneError(inputName[i], input); + + } + + }, + + + alterValidationRules: function (ruleObj) { + + if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { + window.Debug.log({ + 'function': '$.alterValidationRules()', + 'message': 'ERROR - Missing one or multiple parameter(s) {rule, regex, message}' + }); + window.Debug.print(); + return false; + } + + ruleObj.rule = ruleObj.rule.toUpperCase(); + + if (ruleObj.regex) { + + var regex = _buildRegexFromString(ruleObj.regex); + + if (!(regex instanceof RegExp)) { + window.Debug.log({ + 'function': '$.alterValidationRules(rule)', + 'arguments': regex.toString(), + 'message': 'ERROR - Invalid rule' + }); + window.Debug.print(); + return false; + } + + _rules[ruleObj.rule] = regex; + } + + if (ruleObj.message) { + _messages[ruleObj.rule] = ruleObj.message; + } + + return true; + } + + }; + + + function _buildRegexFromString(regex) { + + if (!regex || (typeof regex !== "string" && !(regex instanceof RegExp))) { + _regexDebug(); + return false; + } + + if (typeof regex !== 'string') { + regex = regex.toString(); + } + + var separator = regex.charAt(0), + index = regex.length - 1, + pattern, + modifier, + rule; + + while (index > 0) { + if (/[gimsxeU]/.test(regex.charAt(index))) { + index--; + } else { + break; + } + } + + if (regex.charAt(index) !== separator) { + separator = null; + } + + if (separator && index !== regex.length - 1) { + modifier = regex.substr(index + 1, regex.length - 1); + } + + if (separator) { + pattern = regex.substr(1, index - 1); + } else { + pattern = regex; + } + + try { + rule = new RegExp(pattern, modifier); + } catch (error) { + _regexDebug(); + return false; + } + + return rule; + + function _regexDebug() { + window.Debug.log({ + 'function': '_buildRegexFromString()', + 'arguments': '{pattern: {' + (pattern || '') + '}, modifier: {' + (modifier || '') + '}', + 'message': 'WARNING - Invalid regex given: ' + regex + }); + window.Debug.print(); + } + + } + window.Debug = { + + table: {}, + log: function (debugObject) { + + if (!debugObject.message || typeof debugObject.message !== "string") { + return false; + } + + this.table[debugObject.message] = $.extend( + Object.preventExtensions( + { + 'node': '', + 'function': '', + 'arguments': '' + } + ), debugObject + ); + + }, + print: function () { + + if ($.isEmptyObject(this.table)) { + return false; + } + + if (console.group !== undefined || console.table !== undefined) { + + console.groupCollapsed('--- jQuery Form Validation Debug ---'); + + if (console.table) { + console.table(this.table); + } else { + $.each(this.table, function (index, data) { + console.log(data['Name'] + ': ' + data['Execution Time'] + 'ms'); + }); + } + + console.groupEnd(); + + } else { + console.log('Debug is not available on your current browser, try the most recent version of Chrome or Firefox.'); + } + + this.table = {}; + + } + + }; + + String.prototype.capitalize = function () { + return this.charAt(0).toUpperCase() + this.slice(1); + }; + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (elt ) { + var len = this.length >>> 0; + + var from = Number(arguments[1]) || 0; + from = (from < 0) + ? Math.ceil(from) + : Math.floor(from); + if (from < 0) + from += len; + + for (; from < len; from++) { + if (from in this && + this[from] === elt) + return from; + } + return -1; + }; + } + if (!JSON && !JSON.stringify) { + JSON.stringify = function (obj) { + var t = typeof (obj); + if (t !== "object" || obj === null) { + if (t === "string") { + obj = '"' + obj + '"'; + } + return String(obj); + } + else { + var n, v, json = [], arr = (obj && obj.constructor === Array); + for (n in obj) { + if (true) { + v = obj[n]; + t = typeof(v); + if (t === "string") { + v = '"' + v + '"'; + } + else if (t === "object" && v !== null) { + v = JSON.stringify(v); + } + json.push((arr ? "" : '"' + n + '": ') + String(v)); + } + } + return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); + } + }; + } + +}(window, document, window.jQuery)); \ No newline at end of file diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js new file mode 100644 index 0000000..acc7b8d --- /dev/null +++ b/dist/jquery.validation.min.js @@ -0,0 +1,10 @@ +/*! + * jQuery Form Validation + * Copyright (C) 2015 RunningCoder.org + * Licensed under the MIT license + * + * @author Tom Bertrand + * @version 2.0.0 (2015-04-22) + * @link http://www.runningcoder.org/jqueryvalidation/ +*/ +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){window.Debug.log({"function":"_buildRegexFromString()",arguments:"{pattern: {"+(c||"")+"}, modifier: {"+(d||"")+"}",message:"WARNING - Invalid regex given: "+a}),window.Debug.print()}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object){for(var c in options[b])if(options[b].hasOwnProperty(c))if(_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&(options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+d+": "+JSON.stringify(options[b][c][d])+"}",message:"WARNING - "+d.toString()+": "+JSON.stringify(options[b][c][d])+" - unsupported option"}),delete options[b][c][d]);a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+c+": "+JSON.stringify(options[b][c])+"}",message:"WARNING - "+c+" - invalid option"})}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+b+": "+JSON.stringify(options[b])+"}",message:"WARNING - "+b+" - invalid option"});options.debug&&$.inArray(options.debug,-1!==_supported.debug)&&(a.debug=options.debug),a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+node.length+" form(s)"}),!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"node.find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"}),!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+node.length+" form(s)"}),node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),options.debug&&window.Debug.print(),!1})):(options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:"{button: "+options.submit.settings.button+"}",message:'ERROR - node.find("'+options.submit.settings.button+'") not found'}),!1)}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)\]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"}),!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(!comparison||4!==comparison.length)return void(options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"value: "+value+" rule: "+rule,message:"WARNING - Invalid comparison"}));var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Invalid rule, "L" compare must be numeric'}),!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Unable to find compared field [name="'+compared+'"]'}),!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                      ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),JSON||JSON.stringify||(JSON.stringify=function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),String(a);var c,d,e=[],f=a&&a.constructor===Array;for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=JSON.stringify(d)),e.push((f?"":'"'+c+'": ')+String(d));return(f?"[":"{")+String(e)+(f?"]":"}")})}(window,document,window.jQuery); \ No newline at end of file diff --git a/demo/demo.html b/example/demo.html similarity index 100% rename from demo/demo.html rename to example/demo.html diff --git a/demo/jquery.validation.css b/example/jquery.validation.css similarity index 100% rename from demo/jquery.validation.css rename to example/jquery.validation.css diff --git a/demo/loader-medium.gif b/example/loader-medium.gif similarity index 100% rename from demo/loader-medium.gif rename to example/loader-medium.gif diff --git a/jquery.validation.min.js b/jquery.validation.min.js deleted file mode 100644 index 5d42ddc..0000000 --- a/jquery.validation.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * jQuery Form Validation - * Copyright (C) 2015 RunningCoder.org - * Licensed under the MIT license - * - * @author Tom Bertrand - * @version 1.5.3 (2015-03-17) - * @link http://www.runningcoder.org/jqueryvalidation/ - */ -!function(window,document,$,undefined){function _buildRegexFromString(e){function t(){}if(!e||"string"!=typeof e&&!(e instanceof RegExp))return t(),!1;"string"!=typeof e&&(e=e.toString());for(var r,i,n,o=e.charAt(0),s=e.length-1;s>0&&/[gimsxeU]/.test(e.charAt(s));)s--;e.charAt(s)!==o&&(o=null),o&&s!==e.length-1&&(i=e.substr(s+1,e.length-1)),r=o?e.substr(1,s-1):e;try{n=new RegExp(r,i)}catch(a){return t(),!1}return n}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(e){return e});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var e=Object.preventExtensions($.extend(!0,{},_options));for(var t in options)if(options.hasOwnProperty(t)&&"debug"!==t)if(~["labels","messages","rules"].indexOf(t)&&options[t]instanceof Object)e[t]=options[t];else if(_options[t]&&options[t]instanceof Object)for(var r in options[t])if(options[t].hasOwnProperty(r)&&_options[t][r]&&options[t][r]instanceof Object){for(var i in options[t][r])options[t][r].hasOwnProperty(i)&&_supported[t]&&_supported[t][r]&&_supported[t][r][i]&&-1===$.inArray(options[t][r][i],_supported[t][r][i])&&delete options[t][r][i];e[t]&&e[t][r]&&(e[t][r]=$.extend(Object.preventExtensions(e[t][r]),options[t][r]))}e.dynamic.settings.trigger&&"keypress"===e.dynamic.settings.trigger&&"keypress"===e.submit.settings.clear&&(e.dynamic.settings.trigger="keydown"),options=e}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var e=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(e+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(t,r){$(r).unbind(e).on(e,function(e){if($(this).is(":disabled"))return!1;var t=this,r=e.keyCode||null;_typeWatch(function(){validateInput(t)?_executeCallback(options.dynamic.callback.onSuccess,[node,t,r]):(displayOneError(t.name),_executeCallback(options.dynamic.callback.onError,[node,t,r,errors[t.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,t,r])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var e=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(e,function(e){return e.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors])),!1})):!1}function validateForm(){var e=!0;return $.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(t,r){validateInput(r)||(e=!1)}),e}function validateInput(e){var t=$(e).attr("name");if(!t)return!1;var r=_getInputValue(e),i=t.replace(/]$/,"").split(/]\[|[[\]]/g),n=window.Validation.labels[t]||options.labels[t]||$(e).attr(_data.label)||i[i.length-1],o=$(e).attr(_data.validation),s=$(e).attr(_data.validationMessage),a=$(e).attr(_data.regex),l=!($(e).attr(_data.regexReverse)===undefined),d=$(e).attr(_data.regexMessage),u=!1;if(o&&(o=_api._splitValidation(o)),o instanceof Array&&o.length>0){if(""===$.trim(r)&&~o.indexOf("OPTIONAL"))return!0;$.each(o,function(e,i){if(u===!0)return!0;try{validateRule(r,i)}catch(o){(s||!options.submit.settings.allErrors)&&(u=!0),o[0]=s||o[0],registerError(t,o[0].replace("$",n).replace("%",o[1]))}})}if(a){var c=_buildRegexFromString(a);if(!(c instanceof RegExp))return!0;try{validateRule(r,c,l)}catch(p){p[0]=d||p[0],registerError(t,p[0].replace("$",n))}}return!errors[t]||errors[t]instanceof Array&&0===errors[t].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(e,t){errors[e]||(errors[e]=[]),t=t.capitalize();for(var r=!1,i=0;i
                                                                                        ";if(!errors.hasOwnProperty(e))return!1;if(t=node.find('[name="'+e+'"]'),n=null,!t[0])return!1;if(o=t.attr(_data.group),o?(s=node.find('[name="'+e+'"]'),n=node.find('[id="'+o+'"]'),n[0]&&(n.addClass(options.submit.settings.errorClass),i=n)):(t.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&t.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),r=t.attr("id"),r&&(n=node.find('label[for="'+r+'"]')[0]),n||(n=t.parentsUntil(node,"label")[0]),n&&(n=$(n),n.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?i=options.submit.settings.errorListContainer?t.parentsUntil(node,options.submit.settings.errorListContainer):i||t.parent():"block"===options.submit.settings.display&&(i=node),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!i.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?i.append(a):"prepend"===options.submit.settings.insertion&&i.prepend(a));for(var l=0;l"+errors[e][l]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){o&&s&&(t=s);var d="coucou"+resetSuffix;options.submit.settings.clear&&(d+=" "+options.submit.settings.clear+resetSuffix),options.dynamic.settings.trigger&&(d+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"!==options.dynamic.settings.trigger&&(d+=" change"+resetSuffix+" paste"+resetSuffix)),t.unbind(d).on(d,function(e,t,r,i,n){return function(){n?$(r).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i,n):$(t).hasClass(options.submit.settings.errorClass)&&resetOneError(e,t,r,i)}}(e,t,n,i,o))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var u=parseFloat(options.submit.settings.scrollToError.offset)||0,c=parseFloat(options.submit.settings.scrollToError.duration)||500,p="block"===options.submit.settings.display?i:t;$("html, body").animate({scrollTop:p.offset().top+u},c)}}function displayErrors(){for(var e in errors)errors.hasOwnProperty(e)&&displayOneError(e)}function resetOneError(e,t,r,i,n){if(delete errors[e],i)options.submit.settings.inputContainer&&(n?r:t).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),r&&r.removeClass(options.submit.settings.errorClass),t.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&i.find("["+_data.errorList+"]").remove();else{if(!t&&(t=node.find('[name="'+e+'"]'),!t[0]))return!1;t.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(e){var t;switch($(e).attr("type")){case"checkbox":t=$(e).is(":checked")?1:"";break;case"radio":t=node.find('input[name="'+$(e).attr("name")+'"]:checked').val()||"";break;default:t=$(e).val()}return t},_typeWatch=function(){var e=0;return function(t,r){clearTimeout(e),e=setTimeout(t,r)}}(),_executeCallback=function(e,t){if(!e)return!1;var r;if("function"==typeof e)r=e;else if("string"==typeof e||e instanceof Array){r=window,"string"==typeof e&&(e=[e,[]]);for(var i=e[0].split("."),n=e[1],o=!0,s=0;s>>0,r=Number(arguments[1])||0;for(r=0>r?Math.ceil(r):Math.floor(r),0>r&&(r+=t);t>r;r++)if(r in this&&this[r]===e)return r;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..d714fe7 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "html5-form-validation", + "description": "jQuery plugin that provides a client site form validation with builtin options and deep customization.", + "keywords": [ + "form", + "html5", + "validate", + "validation", + "input" + ], + "homepage": "http://www.runningcoder.org/jqueryvalidation/", + "bugs": "https://github.com/running-coder/jquery-form-validation/issues", + "repository": { + "type": "git", + "url": "git://github.com/running-coder/jquery-form-validation.git" + }, + "author": { + "name": "Tom Bertrand" + }, + "devDependencies": { + "grunt": "~0.4", + "grunt-contrib-clean": "~0.6.0", + "grunt-contrib-uglify": "~0.9.1", + "grunt-contrib-copy": "~0.8.0", + "grunt-replace": "~0.8.0", + "grunt-stripcomments": "~0.3.1" + }, + "version": "2.0.0", + "main": "dist/jquery.validation.min.js" +} \ No newline at end of file diff --git a/jquery.validation.js b/src/jquery.validation.js similarity index 98% rename from jquery.validation.js rename to src/jquery.validation.js index a8a170f..d606cfd 100644 --- a/jquery.validation.js +++ b/src/jquery.validation.js @@ -1,15 +1,12 @@ -/** +/*! * jQuery Form Validation * Copyright (C) 2015 RunningCoder.org * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-03-17) + * @version 2.0.0 (2015-04-22) * @link http://www.runningcoder.org/jqueryvalidation/ - * - * @note - * Remove debug code: //\s?\{debug\}[\s\S]*?\{/debug\} - */ +*/ ;(function (window, document, $, undefined) { window.Validation = { @@ -479,10 +476,56 @@ } ); + prepareFormData(); + return isValid; } + /** + * Loop through formData and build an object + * + * @returns {object} data + */ + function prepareFormData () { + + var data = {}, + matches, + index; + + for (var i in formData) { + if (!formData.hasOwnProperty(i)) continue; + + index = 0; + matches = i.split(/\[(.+?)\]/g); + + var tmpObject = {}, + tmpArray = []; + + for (var k = matches.length - 1; k >= 0 ; k--) { + if (matches[k] === "") { + matches.splice(k, 1); + continue; + } + + if (tmpArray.length < 1) { + tmpObject[matches[k]] = formData[i] + } else { + tmpObject = {}; + tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; + } + tmpArray.push(tmpObject) + + } + + data = $.extend(true, data, tmpObject); + + } + + formData = data; + + } + /** * Prepare the information from the data attributes * and call the "validateRule" function. From 6dccac50fbda27d3e53ad5a579e932e2596a4c8f Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 22 Apr 2015 11:14:18 -0400 Subject: [PATCH 32/41] - Fixed issue when formData was not returning number type but string instead --- dist/jquery.validation.js | 170 ++++++++++++---------------------- dist/jquery.validation.min.js | 2 +- src/jquery.validation.js | 20 ++-- 3 files changed, 71 insertions(+), 121 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index a5a181e..1fdd4fa 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -1,12 +1,12 @@ -/*! - * jQuery Form Validation - * Copyright (C) 2015 RunningCoder.org - * Licensed under the MIT license - * - * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) - * @link http://www.runningcoder.org/jqueryvalidation/ -*/ +/*! + * jQuery Form Validation + * Copyright (C) 2015 RunningCoder.org + * Licensed under the MIT license + * + * @author Tom Bertrand + * @version 2.0.0 (2015-04-22) + * @link http://www.runningcoder.org/jqueryvalidation/ +*/ ;(function (window, document, $, undefined) { window.Validation = { @@ -15,14 +15,12 @@ hasScrolled: false }; - - if (typeof Object.preventExtensions !== "function") { + if (typeof Object.preventExtensions !== "function") { Object.preventExtensions = function (obj) { return obj; }; } - - var _rules = { + var _rules = { NOTEMPTY: /\S/, INTEGER: /^\d+$/, NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, @@ -38,8 +36,7 @@ COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ }, - - _messages = { + _messages = { 'default': '$ contain error(s).', 'NOTEMPTY': '$ must not be empty.', 'INTEGER': '$ must be an integer.', @@ -60,8 +57,7 @@ '!=': '$ must be different than %' }, - - _data = { + _data = { validation: 'data-validation', validationMessage: 'data-validation-message', regex: 'data-validation-regex', @@ -72,8 +68,7 @@ errorList: 'data-error-list' }, - - _options = { + _options = { submit: { settings: { form: null, @@ -115,8 +110,7 @@ debug: false }, - - _supported = { + _supported = { submit: { settings: { display: ["inline", "block"], @@ -139,8 +133,7 @@ debug: [true, false] }; - - var Validation = function (node, options) { + var Validation = function (node, options) { var errors = [], messages = {}, @@ -150,8 +143,7 @@ window.Validation.hasScrolled = false; - - function extendRules() { + function extendRules() { options.rules = $.extend( true, {}, @@ -160,8 +152,7 @@ ); } - - function extendMessages() { + function extendMessages() { options.messages = $.extend( true, {}, @@ -170,8 +161,7 @@ ); } - - function extendOptions() { + function extendOptions() { if (!(options instanceof Object)) { options = {}; @@ -255,8 +245,7 @@ } - - function delegateDynamicValidation() { + function delegateDynamicValidation() { if (!options.dynamic.settings.trigger) { return false; @@ -319,8 +308,7 @@ ); } - - function delegateValidation() { + function delegateValidation() { _executeCallback(options.submit.callback.onInit, [node]); @@ -375,8 +363,7 @@ } - - function validateForm() { + function validateForm() { var isValid = true; @@ -397,8 +384,7 @@ } - - function prepareFormData () { + function prepareFormData () { var data = {}, matches, @@ -420,7 +406,7 @@ } if (tmpArray.length < 1) { - tmpObject[matches[k]] = formData[i] + tmpObject[matches[k]] = Number(formData[i]) || formData[i]; } else { tmpObject = {}; tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; @@ -437,8 +423,7 @@ } - - function validateInput(input) { + function validateInput(input) { var inputName = $(input).attr('name'); @@ -529,8 +514,7 @@ } - - function validateRule(value, rule, reversed) { + function validateRule(value, rule, reversed) { if (rule instanceof RegExp) { var isValid = rule.test(value); @@ -621,8 +605,7 @@ } - - function registerError(inputName, error) { + function registerError(inputName, error) { if (!errors[inputName]) { errors[inputName] = []; @@ -644,8 +627,7 @@ } - - function displayOneError(inputName) { + function displayOneError(inputName) { var input, inputId, @@ -788,8 +770,7 @@ } - - function displayErrors() { + function displayErrors() { for (var inputName in errors) { if (!errors.hasOwnProperty(inputName)) continue; @@ -798,8 +779,7 @@ } - - function resetOneError(inputName, input, label, container, group) { + function resetOneError(inputName, input, label, container, group) { delete errors[inputName]; @@ -839,8 +819,7 @@ } - - function resetErrors() { + function resetErrors() { errors = []; window.Validation.hasScrolled = false; @@ -850,15 +829,13 @@ } - - function submitForm() { + function submitForm() { node[0].submit() } - - function destroy() { + function destroy() { resetErrors(); node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); @@ -871,8 +848,7 @@ } - - var _getInputValue = function (input) { + var _getInputValue = function (input) { var value; switch ($(input).attr('type')) { @@ -891,8 +867,7 @@ }; - - var _typeWatch = (function () { + var _typeWatch = (function () { var timer = 0; return function (callback, ms) { clearTimeout(timer); @@ -900,8 +875,7 @@ }; })(); - - var _executeCallback = function (callback, extraParams) { + var _executeCallback = function (callback, extraParams) { if (!callback) { return false; @@ -954,8 +928,7 @@ }; - - this.__construct = function () { + this.__construct = function () { extendOptions(); extendRules(); @@ -969,65 +942,53 @@ return { - - registerError: registerError, + registerError: registerError, - - displayOneError: displayOneError, + displayOneError: displayOneError, - - displayErrors: displayErrors, + displayErrors: displayErrors, - - resetOneError: resetOneError, + resetOneError: resetOneError, - - resetErrors: resetErrors, + resetErrors: resetErrors, - - destroy: destroy + destroy: destroy }; }; - - $.fn.validate = $.validate = function (options) { + $.fn.validate = $.validate = function (options) { return _api.validate(this, options); }; - - $.fn.addValidation = function (validation) { + $.fn.addValidation = function (validation) { return _api.addValidation(this, validation); }; - - $.fn.removeValidation = function (validation) { + $.fn.removeValidation = function (validation) { return _api.removeValidation(this, validation); }; - - $.fn.addError = function (error) { + $.fn.addError = function (error) { return _api.addError(this, error); }; - - $.fn.removeError = function (error) { + $.fn.removeError = function (error) { return _api.removeError(this, error); }; - - $.fn.alterValidationRules = $.alterValidationRules = function (rules) { + $.fn.alterValidationRules = $.alterValidationRules = function (rules) { if (!(rules instanceof Array)) { rules = [rules]; @@ -1039,11 +1000,9 @@ }; - - var _api = { + var _api = { - - _formatValidation: function (validation) { + _formatValidation: function (validation) { validation = validation.toString().replace(/\s/g, ''); @@ -1055,8 +1014,7 @@ }, - - _splitValidation: function (validation) { + _splitValidation: function (validation) { var validationArray = this._formatValidation(validation).split(','), oneValidation; @@ -1071,15 +1029,13 @@ return validationArray; }, - - _joinValidation: function (validation) { + _joinValidation: function (validation) { return '[' + validation.join(', ') + ']'; }, - - validate: function (node, options) { + validate: function (node, options) { if (typeof node === "function") { @@ -1150,8 +1106,7 @@ }, - - addValidation: function (node, validation) { + addValidation: function (node, validation) { var self = this; @@ -1185,8 +1140,7 @@ }, - - removeValidation: function (node, validation) { + removeValidation: function (node, validation) { var self = this; @@ -1228,8 +1182,7 @@ }, - - addError: function (node, error) { + addError: function (node, error) { if (!window.Validation.form[node.selector]) { window.Debug.log({ @@ -1315,8 +1268,7 @@ }, - - removeError: function (node, inputName) { + removeError: function (node, inputName) { if (!window.Validation.form[node.selector]) { window.Debug.log({ @@ -1376,8 +1328,7 @@ }, - - alterValidationRules: function (ruleObj) { + alterValidationRules: function (ruleObj) { if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { window.Debug.log({ @@ -1416,8 +1367,7 @@ }; - - function _buildRegexFromString(regex) { + function _buildRegexFromString(regex) { if (!regex || (typeof regex !== "string" && !(regex instanceof RegExp))) { _regexDebug(); diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index acc7b8d..8c7e0fe 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -7,4 +7,4 @@ * @version 2.0.0 (2015-04-22) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){window.Debug.log({"function":"_buildRegexFromString()",arguments:"{pattern: {"+(c||"")+"}, modifier: {"+(d||"")+"}",message:"WARNING - Invalid regex given: "+a}),window.Debug.print()}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object){for(var c in options[b])if(options[b].hasOwnProperty(c))if(_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&(options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+d+": "+JSON.stringify(options[b][c][d])+"}",message:"WARNING - "+d.toString()+": "+JSON.stringify(options[b][c][d])+" - unsupported option"}),delete options[b][c][d]);a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+c+": "+JSON.stringify(options[b][c])+"}",message:"WARNING - "+c+" - invalid option"})}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+b+": "+JSON.stringify(options[b])+"}",message:"WARNING - "+b+" - invalid option"});options.debug&&$.inArray(options.debug,-1!==_supported.debug)&&(a.debug=options.debug),a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+node.length+" form(s)"}),!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"node.find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"}),!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+node.length+" form(s)"}),node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),options.debug&&window.Debug.print(),!1})):(options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:"{button: "+options.submit.settings.button+"}",message:'ERROR - node.find("'+options.submit.settings.button+'") not found'}),!1)}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)\]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"}),!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(!comparison||4!==comparison.length)return void(options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"value: "+value+" rule: "+rule,message:"WARNING - Invalid comparison"}));var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Invalid rule, "L" compare must be numeric'}),!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Unable to find compared field [name="'+compared+'"]'}),!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                          ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),JSON||JSON.stringify||(JSON.stringify=function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),String(a);var c,d,e=[],f=a&&a.constructor===Array;for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=JSON.stringify(d)),e.push((f?"":'"'+c+'": ')+String(d));return(f?"[":"{")+String(e)+(f?"]":"}")})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){window.Debug.log({"function":"_buildRegexFromString()",arguments:"{pattern: {"+(c||"")+"}, modifier: {"+(d||"")+"}",message:"WARNING - Invalid regex given: "+a}),window.Debug.print()}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object){for(var c in options[b])if(options[b].hasOwnProperty(c))if(_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&(options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+d+": "+JSON.stringify(options[b][c][d])+"}",message:"WARNING - "+d.toString()+": "+JSON.stringify(options[b][c][d])+" - unsupported option"}),delete options[b][c][d]);a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+c+": "+JSON.stringify(options[b][c])+"}",message:"WARNING - "+c+" - invalid option"})}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+b+": "+JSON.stringify(options[b])+"}",message:"WARNING - "+b+" - invalid option"});options.debug&&$.inArray(options.debug,-1!==_supported.debug)&&(a.debug=options.debug),a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+node.length+" form(s)"}),!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"node.find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"}),!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+node.length+" form(s)"}),node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),options.debug&&window.Debug.print(),!1})):(options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:"{button: "+options.submit.settings.button+"}",message:'ERROR - node.find("'+options.submit.settings.button+'") not found'}),!1)}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)\]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"}),!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(!comparison||4!==comparison.length)return void(options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"value: "+value+" rule: "+rule,message:"WARNING - Invalid comparison"}));var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Invalid rule, "L" compare must be numeric'}),!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Unable to find compared field [name="'+compared+'"]'}),!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                            ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),JSON||JSON.stringify||(JSON.stringify=function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),String(a);var c,d,e=[],f=a&&a.constructor===Array;for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=JSON.stringify(d)),e.push((f?"":'"'+c+'": ')+String(d));return(f?"[":"{")+String(e)+(f?"]":"}")})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index d606cfd..ab6b613 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -1,12 +1,12 @@ -/*! - * jQuery Form Validation - * Copyright (C) 2015 RunningCoder.org - * Licensed under the MIT license - * - * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) - * @link http://www.runningcoder.org/jqueryvalidation/ -*/ +/*! + * jQuery Form Validation + * Copyright (C) 2015 RunningCoder.org + * Licensed under the MIT license + * + * @author Tom Bertrand + * @version 2.0.0 (2015-04-22) + * @link http://www.runningcoder.org/jqueryvalidation/ +*/ ;(function (window, document, $, undefined) { window.Validation = { @@ -509,7 +509,7 @@ } if (tmpArray.length < 1) { - tmpObject[matches[k]] = formData[i] + tmpObject[matches[k]] = Number(formData[i]) || formData[i]; } else { tmpObject = {}; tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; From 6b1e8b92dd330e9638c8734e717a6496fb0b9c4a Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 22 Apr 2015 11:14:18 -0400 Subject: [PATCH 33/41] - Fixed issue when formData was not returning number type but string instead - Fixed Grunt issue --- Gruntfile.js | 14 +- dist/jquery.validation.js | 404 +++++++++++++++------------------- dist/jquery.validation.min.js | 2 +- package.json | 1 + src/jquery.validation.js | 102 ++++----- 5 files changed, 238 insertions(+), 285 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 9ac8fca..8fbfdca 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -39,7 +39,7 @@ module.exports = function (grunt) { singleline: true, multiline: true }, - src: [ 'dist/*.js'] + src: [ 'dist/jquery.validation.js'] } }, @@ -64,7 +64,7 @@ module.exports = function (grunt) { options: { patterns: [ { - match: /\s?\{debug\}[\s\S]*?\{\/debug\}/g, + match: /\/\/\s?\{debug}[\s\S]*?\{\/debug}/g, replacement: '' } ] @@ -80,7 +80,7 @@ module.exports = function (grunt) { options: { patterns: [ { - match: /\/\*[^!][\S\s]+?\*\/[\r\n]?/gm, + match: /\/\*[^!][\S\s]+?\*\//gm, replacement: '' } ] @@ -94,6 +94,12 @@ module.exports = function (grunt) { } }, + jsbeautifier : { + files : ['dist/jquery.validation.js'], + options : { + } + }, + uglify: { dist: { options: { @@ -114,6 +120,7 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-stripcomments'); grunt.loadNpmTasks('grunt-replace'); + grunt.loadNpmTasks("grunt-jsbeautifier"); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('default', [ @@ -122,6 +129,7 @@ module.exports = function (grunt) { 'copy:dist', 'comments', 'replace:removeComments', + 'jsbeautifier', 'replace:removeDebug', 'uglify' ]); diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index a5a181e..fe7a502 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -6,8 +6,9 @@ * @author Tom Bertrand * @version 2.0.0 (2015-04-22) * @link http://www.runningcoder.org/jqueryvalidation/ -*/ -;(function (window, document, $, undefined) { + */ +; +(function(window, document, $, undefined) { window.Validation = { form: [], @@ -15,162 +16,150 @@ hasScrolled: false }; - if (typeof Object.preventExtensions !== "function") { - Object.preventExtensions = function (obj) { + Object.preventExtensions = function(obj) { return obj; }; } - var _rules = { - NOTEMPTY: /\S/, - INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, - NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, - NOSPACE: /^(?!\s)\S*$/, - TRIM: /^[^\s].*[^\s]$/, - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /\S/, - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, - - - _messages = { - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'INTEGER': '$ must be an integer.', - 'NUMERIC': '$ must be numeric.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'NAME': '$ must not contain special characters.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }, - - - _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexReverse: 'data-validation-regex-reverse', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }, - - - _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - errorListContainer: null, - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } + NOTEMPTY: /\S/, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /\S/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + + _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'INTEGER': '$ must be an integer.', + 'NUMERIC': '$ must be numeric.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'NAME': '$ must not contain special characters.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' }, - rules: {}, - messages: {}, - labels: {}, - debug: false - }, - - - _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } + + _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } + + _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + errorListContainer: null, + inputContainer: null, + clear: "focusin", + scrollToError: false + }, + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 + }, + callback: { + onSuccess: null, + onError: null, + onComplete: null + } + }, + rules: {}, + messages: {}, + labels: {}, + debug: false }, - debug: [true, false] - }; - - var Validation = function (node, options) { + _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; + + var Validation = function(node, options) { var errors = [], messages = {}, formData = {}, delegateSuffix = ".vd", // validation.delegate - resetSuffix = ".vr"; // validation.resetError + resetSuffix = ".vr"; // validation.resetError window.Validation.hasScrolled = false; - function extendRules() { options.rules = $.extend( - true, - {}, + true, {}, _rules, options.rules ); } - function extendMessages() { options.messages = $.extend( - true, - {}, + true, {}, _messages, options.messages ); } - function extendOptions() { if (!(options instanceof Object)) { @@ -255,7 +244,6 @@ } - function delegateDynamicValidation() { if (!options.dynamic.settings.trigger) { @@ -286,9 +274,9 @@ $.each( node.find('[' + _data.validation + '],[' + _data.regex + ']'), - function (index, input) { + function(index, input) { - $(input).unbind(event).on(event, function (e) { + $(input).unbind(event).on(event, function(e) { if ($(this).is(':disabled')) { return false; @@ -297,7 +285,7 @@ var input = this, keyCode = e.keyCode || null; - _typeWatch(function () { + _typeWatch(function() { if (!validateInput(input)) { @@ -319,7 +307,6 @@ ); } - function delegateValidation() { _executeCallback(options.submit.callback.onInit, [node]); @@ -345,7 +332,7 @@ } node.on("submit", false); - node.find(options.submit.settings.button).off('.vd').on(event, function (e) { + node.find(options.submit.settings.button).off('.vd').on(event, function(e) { e.preventDefault(); @@ -362,7 +349,7 @@ _executeCallback(options.submit.callback.onBeforeSubmit, [node]); - (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]) : submitForm(); + (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]): submitForm(); _executeCallback(options.submit.callback.onAfterSubmit, [node]); @@ -375,7 +362,6 @@ } - function validateForm() { var isValid = true; @@ -384,7 +370,7 @@ $.each( node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), - function (index, input) { + function(index, input) { if (!validateInput(input)) { isValid = false; } @@ -397,8 +383,7 @@ } - - function prepareFormData () { + function prepareFormData() { var data = {}, matches, @@ -408,19 +393,19 @@ if (!formData.hasOwnProperty(i)) continue; index = 0; - matches = i.split(/\[(.+?)\]/g); + matches = i.split(/\[(.+?)]/g); var tmpObject = {}, tmpArray = []; - for (var k = matches.length - 1; k >= 0 ; k--) { + for (var k = matches.length - 1; k >= 0; k--) { if (matches[k] === "") { matches.splice(k, 1); continue; } if (tmpArray.length < 1) { - tmpObject[matches[k]] = formData[i] + tmpObject[matches[k]] = Number(formData[i]) || formData[i]; } else { tmpObject = {}; tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; @@ -437,7 +422,6 @@ } - function validateInput(input) { var inputName = $(input).attr('name'); @@ -457,9 +441,9 @@ matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), inputShortName = window.Validation.labels[inputName] || - options.labels[inputName] || - $(input).attr(_data.label) || - matches[matches.length - 1], + options.labels[inputName] || + $(input).attr(_data.label) || + matches[matches.length - 1], validationArray = $(input).attr(_data.validation), validationMessage = $(input).attr(_data.validationMessage), @@ -477,7 +461,7 @@ return true; } - $.each(validationArray, function (i, rule) { + $.each(validationArray, function(i, rule) { if (validateOnce === true) { return true; @@ -529,7 +513,6 @@ } - function validateRule(value, rule, reversed) { if (rule instanceof RegExp) { var isValid = rule.test(value); @@ -621,7 +604,6 @@ } - function registerError(inputName, error) { if (!errors[inputName]) { @@ -644,7 +626,6 @@ } - function displayOneError(inputName) { var input, @@ -757,9 +738,9 @@ } } - input.unbind(event).on(event, function (a, b, c, d, e) { + input.unbind(event).on(event, function(a, b, c, d, e) { - return function () { + return function() { if (e) { if ($(c).hasClass(options.submit.settings.errorClass)) { resetOneError(a, b, c, d, e); @@ -788,7 +769,6 @@ } - function displayErrors() { for (var inputName in errors) { @@ -798,7 +778,6 @@ } - function resetOneError(inputName, input, label, container, group) { delete errors[inputName]; @@ -839,7 +818,6 @@ } - function resetErrors() { errors = []; @@ -850,20 +828,18 @@ } - function submitForm() { node[0].submit() } - function destroy() { resetErrors(); node.find('[' + _data.validation + '],[' + _data.regex + ']').off(delegateSuffix + ' ' + resetSuffix); - node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function () { + node.find(options.submit.settings.button).off(delegateSuffix).on('click' + delegateSuffix, function() { $(this).closest('form')[0].submit(); }); @@ -871,8 +847,7 @@ } - - var _getInputValue = function (input) { + var _getInputValue = function(input) { var value; switch ($(input).attr('type')) { @@ -891,17 +866,15 @@ }; - - var _typeWatch = (function () { + var _typeWatch = (function() { var timer = 0; - return function (callback, ms) { + return function(callback, ms) { clearTimeout(timer); timer = setTimeout(callback, ms); }; })(); - - var _executeCallback = function (callback, extraParams) { + var _executeCallback = function(callback, extraParams) { if (!callback) { return false; @@ -954,8 +927,7 @@ }; - - this.__construct = function () { + this.__construct = function() { extendOptions(); extendRules(); @@ -969,65 +941,53 @@ return { - registerError: registerError, - displayOneError: displayOneError, - displayErrors: displayErrors, - resetOneError: resetOneError, - resetErrors: resetErrors, - destroy: destroy }; }; - - $.fn.validate = $.validate = function (options) { + $.fn.validate = $.validate = function(options) { return _api.validate(this, options); }; - - $.fn.addValidation = function (validation) { + $.fn.addValidation = function(validation) { return _api.addValidation(this, validation); }; - - $.fn.removeValidation = function (validation) { + $.fn.removeValidation = function(validation) { return _api.removeValidation(this, validation); }; - - $.fn.addError = function (error) { + $.fn.addError = function(error) { return _api.addError(this, error); }; - - $.fn.removeError = function (error) { + $.fn.removeError = function(error) { return _api.removeError(this, error); }; - - $.fn.alterValidationRules = $.alterValidationRules = function (rules) { + $.fn.alterValidationRules = $.alterValidationRules = function(rules) { if (!(rules instanceof Array)) { rules = [rules]; @@ -1039,24 +999,21 @@ }; - var _api = { - - _formatValidation: function (validation) { + _formatValidation: function(validation) { validation = validation.toString().replace(/\s/g, ''); if (validation.charAt(0) === "[" && validation.charAt(validation.length - 1) === "]") { - validation = validation.replace(/^\[|\]$/g, ''); + validation = validation.replace(/^\[|]$/g, ''); } return validation; }, - - _splitValidation: function (validation) { + _splitValidation: function(validation) { var validationArray = this._formatValidation(validation).split(','), oneValidation; @@ -1071,15 +1028,13 @@ return validationArray; }, - - _joinValidation: function (validation) { + _joinValidation: function(validation) { return '[' + validation.join(', ') + ']'; }, - - validate: function (node, options) { + validate: function(node, options) { if (typeof node === "function") { @@ -1144,14 +1099,13 @@ } - return node.each(function () { + return node.each(function() { window.Validation.form[node.selector] = new Validation($(this), options); }); }, - - addValidation: function (node, validation) { + addValidation: function(node, validation) { var self = this; @@ -1161,7 +1115,7 @@ return false; } - return node.each(function () { + return node.each(function() { var $this = $(this), validationData = $this.attr(_data.validation), @@ -1185,8 +1139,7 @@ }, - - removeValidation: function (node, validation) { + removeValidation: function(node, validation) { var self = this; @@ -1195,7 +1148,7 @@ return false; } - return node.each(function () { + return node.each(function() { var $this = $(this), validationData = $this.attr(_data.validation), @@ -1228,8 +1181,7 @@ }, - - addError: function (node, error) { + addError: function(node, error) { if (!window.Validation.form[node.selector]) { window.Debug.log({ @@ -1315,8 +1267,7 @@ }, - - removeError: function (node, inputName) { + removeError: function(node, inputName) { if (!window.Validation.form[node.selector]) { window.Debug.log({ @@ -1376,8 +1327,7 @@ }, - - alterValidationRules: function (ruleObj) { + alterValidationRules: function(ruleObj) { if (!ruleObj.rule || (!ruleObj.regex && !ruleObj.message)) { window.Debug.log({ @@ -1416,7 +1366,6 @@ }; - function _buildRegexFromString(regex) { if (!regex || (typeof regex !== "string" && !(regex instanceof RegExp))) { @@ -1478,24 +1427,22 @@ window.Debug = { table: {}, - log: function (debugObject) { + log: function(debugObject) { if (!debugObject.message || typeof debugObject.message !== "string") { return false; } this.table[debugObject.message] = $.extend( - Object.preventExtensions( - { - 'node': '', - 'function': '', - 'arguments': '' - } - ), debugObject + Object.preventExtensions({ + 'node': '', + 'function': '', + 'arguments': '' + }), debugObject ); }, - print: function () { + print: function() { if ($.isEmptyObject(this.table)) { return false; @@ -1508,7 +1455,7 @@ if (console.table) { console.table(this.table); } else { - $.each(this.table, function (index, data) { + $.each(this.table, function(index, data) { console.log(data['Name'] + ': ' + data['Execution Time'] + 'ms'); }); } @@ -1525,18 +1472,16 @@ }; - String.prototype.capitalize = function () { + String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }; if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (elt ) { + Array.prototype.indexOf = function(elt) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; - from = (from < 0) - ? Math.ceil(from) - : Math.floor(from); + from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; @@ -1549,24 +1494,23 @@ }; } if (!JSON && !JSON.stringify) { - JSON.stringify = function (obj) { - var t = typeof (obj); + JSON.stringify = function(obj) { + var t = typeof(obj); if (t !== "object" || obj === null) { if (t === "string") { obj = '"' + obj + '"'; } return String(obj); - } - else { - var n, v, json = [], arr = (obj && obj.constructor === Array); + } else { + var n, v, json = [], + arr = (obj && obj.constructor === Array); for (n in obj) { if (true) { v = obj[n]; t = typeof(v); if (t === "string") { v = '"' + v + '"'; - } - else if (t === "object" && v !== null) { + } else if (t === "object" && v !== null) { v = JSON.stringify(v); } json.push((arr ? "" : '"' + n + '": ') + String(v)); @@ -1577,4 +1521,4 @@ }; } -}(window, document, window.jQuery)); \ No newline at end of file +}(window, document, window.jQuery)); diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index acc7b8d..8bf26b5 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -7,4 +7,4 @@ * @version 2.0.0 (2015-04-22) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){window.Debug.log({"function":"_buildRegexFromString()",arguments:"{pattern: {"+(c||"")+"}, modifier: {"+(d||"")+"}",message:"WARNING - Invalid regex given: "+a}),window.Debug.print()}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object){for(var c in options[b])if(options[b].hasOwnProperty(c))if(_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&(options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+d+": "+JSON.stringify(options[b][c][d])+"}",message:"WARNING - "+d.toString()+": "+JSON.stringify(options[b][c][d])+" - unsupported option"}),delete options[b][c][d]);a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+c+": "+JSON.stringify(options[b][c])+"}",message:"WARNING - "+c+" - invalid option"})}else options.debug&&window.Debug.log({node:node,"function":"extendOptions()",arguments:"{"+b+": "+JSON.stringify(options[b])+"}",message:"WARNING - "+b+" - invalid option"});options.debug&&$.inArray(options.debug,-1!==_supported.debug)&&(a.debug=options.debug),a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:JSON.stringify(options),message:"OK - Dynamic Validation activated on "+node.length+" form(s)"}),!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return options.debug&&window.Debug.log({node:node,"function":"delegateDynamicValidation()",arguments:"node.find(["+_data.validation+"],["+_data.regex+"])",message:"ERROR - ["+_data.validation+"] not found"}),!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:JSON.stringify(options),message:"OK - Validation activated on "+node.length+" form(s)"}),node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),options.debug&&window.Debug.print(),!1})):(options.debug&&window.Debug.log({node:node,"function":"delegateValidation()",arguments:"{button: "+options.submit.settings.button+"}",message:'ERROR - node.find("'+options.submit.settings.button+'") not found'}),!1)}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)\]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return options.debug&&window.Debug.log({node:node,"function":"validateInput()",arguments:'$(input).attr("name")',message:"ERROR - Missing input [name]"}),!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(!comparison||4!==comparison.length)return void(options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"value: "+value+" rule: "+rule,message:"WARNING - Invalid comparison"}));var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Invalid rule, "L" compare must be numeric'}),!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return options.debug&&window.Debug.log({node:node,"function":"validateRule()",arguments:"compare: "+compared+" rule: "+rule,message:'WARNING - Unable to find compared field [name="'+compared+'"]'}),!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                              ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return options.debug&&window.Debug.log({node:node,"function":"displayOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return options.debug&&window.Debug.log({node:node,"function":"resetOneError()",arguments:'[name="'+a+'"]',message:'ERROR - Unable to find input by name "'+a+'"'}),!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),JSON||JSON.stringify||(JSON.stringify=function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),String(a);var c,d,e=[],f=a&&a.constructor===Array;for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=JSON.stringify(d)),e.push((f?"":'"'+c+'": ')+String(d));return(f?"[":"{")+String(e)+(f?"]":"}")})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/package.json b/package.json index d714fe7..0fd1041 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "grunt-contrib-uglify": "~0.9.1", "grunt-contrib-copy": "~0.8.0", "grunt-replace": "~0.8.0", + "grunt-jsbeautifier": "~0.2.10", "grunt-stripcomments": "~0.3.1" }, "version": "2.0.0", diff --git a/src/jquery.validation.js b/src/jquery.validation.js index d606cfd..e7b9c29 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -1,12 +1,12 @@ -/*! - * jQuery Form Validation - * Copyright (C) 2015 RunningCoder.org - * Licensed under the MIT license - * - * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) - * @link http://www.runningcoder.org/jqueryvalidation/ -*/ +/*! + * jQuery Form Validation + * Copyright (C) 2015 RunningCoder.org + * Licensed under the MIT license + * + * @author Tom Bertrand + * @version 2.0.0 (2015-04-22) + * @link http://www.runningcoder.org/jqueryvalidation/ +*/ ;(function (window, document, $, undefined) { window.Validation = { @@ -170,8 +170,8 @@ * @constructor * Validation Class * - * @param {object} node jQuery form object - * @param {object} options User defined options + * @param {Object} node jQuery form object + * @param {Object} options User defined options */ var Validation = function (node, options) { @@ -314,7 +314,7 @@ /** * Delegates the dynamic validation on data-validation and data-validation-regex attributes based on trigger. * - * @returns {boolean} false if the option is not set + * @returns {Boolean} false if the option is not set */ function delegateDynamicValidation() { @@ -459,7 +459,7 @@ * For every "data-validation" & "data-pattern" attributes that are not disabled inside the jQuery "node" object * the "validateInput" function will be called. * - * @returns {boolean} true if no error(s) were found (valid form) + * @returns {Boolean} true if no error(s) were found (valid form) */ function validateForm() { @@ -485,7 +485,7 @@ /** * Loop through formData and build an object * - * @returns {object} data + * @returns {Object} data */ function prepareFormData () { @@ -497,7 +497,7 @@ if (!formData.hasOwnProperty(i)) continue; index = 0; - matches = i.split(/\[(.+?)\]/g); + matches = i.split(/\[(.+?)]/g); var tmpObject = {}, tmpArray = []; @@ -509,7 +509,7 @@ } if (tmpArray.length < 1) { - tmpObject[matches[k]] = formData[i] + tmpObject[matches[k]] = Number(formData[i]) || formData[i]; } else { tmpObject = {}; tmpObject[matches[k]] = tmpArray[tmpArray.length - 1]; @@ -530,9 +530,9 @@ * Prepare the information from the data attributes * and call the "validateRule" function. * - * @param {object} input Reference of the input element + * @param {Object} input Reference of the input element * - * @returns {boolean} true if no error(s) were found (valid input) + * @returns {Boolean} true if no error(s) were found (valid input) */ function validateInput(input) { @@ -640,9 +640,9 @@ * Validate an input value against one rule. * If a "value-rule" mismatch occurs, an error is thrown to the caller function. * - * @param {string} value - * @param rule - * @param {boolean} [reversed] + * @param {String} value + * @param {*} rule + * @param {Boolean} [reversed] * * @returns {*} Error if a mismatch occurred. */ @@ -762,8 +762,8 @@ /** * Register an error into the global "error" variable. * - * @param {string} inputName Input where the error occurred - * @param {string} error Description of the error to be displayed + * @param {String} inputName Input where the error occurred + * @param {String} error Description of the error to be displayed */ function registerError(inputName, error) { @@ -792,9 +792,9 @@ * The input, the label and the "inputContainer" will be given the "errorClass" and other * settings will be considered. * - * @param {string} inputName Key used for search into "errors" + * @param {String} inputName Key used for search into "errors" * - * @returns {boolean} false if an unwanted behavior occurs + * @returns {Boolean} false if an unwanted behavior occurs */ function displayOneError(inputName) { @@ -961,11 +961,11 @@ /** * Remove an input error. * - * @param {string} inputName Key reference to delete the error from "errors" global variable - * @param {object} input jQuery object of the input - * @param {object} label jQuery object of the input's label - * @param {object} container jQuery object of the "errorList" - * @param {string} [group] Name of the group if any (ex: used on input radio) + * @param {String} inputName Key reference to delete the error from "errors" global variable + * @param {Object} input jQuery object of the input + * @param {Object} label jQuery object of the input's label + * @param {Object} container jQuery object of the "errorList" + * @param {String} [group] Name of the group if any (ex: used on input radio) */ function resetOneError(inputName, input, label, container, group) { @@ -1040,7 +1040,7 @@ /** * Destroy the Validation instance * - * @returns {boolean} + * @returns {Boolean} */ function destroy() { @@ -1063,7 +1063,7 @@ * * @param input * - * @returns {string} value + * @returns {String} value */ var _getInputValue = function (input) { @@ -1118,10 +1118,10 @@ * // Anonymous function to execute a local function * onInit: function () { myFunction(':D'); } * - * @param {string|array} callback The function to be called - * @param {array} [extraParams] In some cases the function can be called with Extra parameters (onError) + * @param {String|Array} callback The function to be called + * @param {Array} [extraParams] In some cases the function can be called with Extra parameters (onError) * - * @returns {boolean} + * @returns {Boolean} */ var _executeCallback = function (callback, extraParams) { @@ -1380,7 +1380,7 @@ validation = validation.toString().replace(/\s/g, ''); if (validation.charAt(0) === "[" && validation.charAt(validation.length - 1) === "]") { - validation = validation.replace(/^\[|\]$/g, ''); + validation = validation.replace(/^\[|]$/g, ''); } return validation; @@ -1391,9 +1391,9 @@ * @private * Splits the validation into an array, Uppercase the rules if they are not comparisons * - * @param {string|array} validation + * @param {String|Array} validation * - * @returns {array} Formatted validation keys + * @returns {Array} Formatted validation keys */ _splitValidation: function (validation) { @@ -1414,9 +1414,9 @@ * @private * Joins the validation array to create the "data-validation" value * - * @param {array} validation + * @param {Array} validation * - * @returns {string} + * @returns {String} */ _joinValidation: function (validation) { @@ -1428,8 +1428,8 @@ * API method to attach the submit event type on the specified node. * Note: Clears the previous event regardless to avoid double submits or unwanted behaviors. * - * @param {object} node jQuery object(s) - * @param {object} options To configure the Validation class. + * @param {Object} node jQuery object(s) + * @param {Object} options To configure the Validation class. * * @returns {*} */ @@ -1521,8 +1521,8 @@ * Note: ONLY the predefined validation arguments are allowed to be added * inside the "data-validation" attribute (see configuration). * - * @param {object} node jQuery objects - * @param {string|array} validation arguments to add in the node(s) "data-validation" + * @param {Object} node jQuery objects + * @param {String|Array} validation arguments to add in the node(s) "data-validation" * * @returns {*} */ @@ -1563,8 +1563,8 @@ /** * API method to handle the removal of "data-validation" arguments. * - * @param {object} node jQuery objects - * @param {string|array} validation arguments to remove in the node(s) "data-validation" + * @param {Object} node jQuery objects + * @param {String|Array} validation arguments to remove in the node(s) "data-validation" * * @returns {*} */ @@ -1623,8 +1623,8 @@ * ] * }) * - * @param {object} node jQuery object - * @param {object} error Object of errors to add on the node + * @param {Object} node jQuery object + * @param {Object} error Object of errors to add on the node * * @returns {*} */ @@ -1736,8 +1736,8 @@ * 'signin_v2[password]' * ]) * - * @param {object} node jQuery object - * @param {object} inputName Object of errors to remove on the node + * @param {Object} node jQuery object + * @param {Object} inputName Object of errors to remove on the node * * @returns {*} */ @@ -1820,7 +1820,7 @@ * message: '$ has an invalid filename.' * }) * - * @param {object} ruleObj + * @param {Object} ruleObj */ alterValidationRules: function (ruleObj) { From 7a5e2c3fa8a61f5f5ef786fb62c21d0431e5e060 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 22 Apr 2015 12:28:27 -0400 Subject: [PATCH 34/41] Fixed issue where formData was ignoring OPTIONAL values --- dist/jquery.validation.js | 4 ++-- dist/jquery.validation.min.js | 2 +- src/jquery.validation.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index fe7a502..401e6a5 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -453,6 +453,8 @@ validateOnce = false; + formData[inputName] = value; + if (validationArray) { validationArray = _api._splitValidation(validationArray); } @@ -507,8 +509,6 @@ } - formData[inputName] = value; - return !errors[inputName] || errors[inputName] instanceof Array && errors[inputName].length === 0; } diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index 8bf26b5..d551fb5 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -7,4 +7,4 @@ * @version 2.0.0 (2015-04-22) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return formData[b]=c,!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                  ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(formData[b]=c,f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                    ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index e7b9c29..8df67af 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -568,6 +568,8 @@ validateOnce = false; + formData[inputName] = value; + if (validationArray) { validationArray = _api._splitValidation(validationArray); } @@ -630,8 +632,6 @@ } - formData[inputName] = value; - return !errors[inputName] || errors[inputName] instanceof Array && errors[inputName].length === 0; } From 30338a01fe7005fb9f8df84bc21ca1f6b865cafe Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Sun, 14 Jun 2015 00:51:56 -0400 Subject: [PATCH 35/41] Version 1.5.3 - Fixed possible JSON iteration issue - Fixed Error display if there was a
                                                                                                      inside the form and display set to 'block' - onSubmit formData now returns the complete data --- dist/jquery.validation.js | 260 +++++++++++++++--------------- dist/jquery.validation.min.js | 4 +- html5-form-validation.jquery.json | 58 +++---- package.json | 2 +- src/jquery.validation.js | 77 +++++---- 5 files changed, 209 insertions(+), 192 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index 401e6a5..18de501 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) + * @version 1.5.3 (2015-06-14) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -22,117 +22,117 @@ }; } var _rules = { - NOTEMPTY: /\S/, - INTEGER: /^\d+$/, - NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, - MIXED: /^[\w\s-]+$/, - NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, - NOSPACE: /^(?!\s)\S*$/, - TRIM: /^[^\s].*[^\s]$/, - DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, - EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, - URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, - PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, - OPTIONAL: /\S/, - COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, + NOTEMPTY: /\S/, + INTEGER: /^\d+$/, + NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, + MIXED: /^[\w\s-]+$/, + NAME: /^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i, + NOSPACE: /^(?!\s)\S*$/, + TRIM: /^[^\s].*[^\s]$/, + DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, + EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, + URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, + PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, + OPTIONAL: /\S/, + COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ + }; - _messages = { - 'default': '$ contain error(s).', - 'NOTEMPTY': '$ must not be empty.', - 'INTEGER': '$ must be an integer.', - 'NUMERIC': '$ must be numeric.', - 'MIXED': '$ must be letters or numbers (no special characters).', - 'NAME': '$ must not contain special characters.', - 'NOSPACE': '$ must not contain spaces.', - 'TRIM': '$ must not start or end with space character.', - 'DATE': '$ is not a valid with format YYYY-MM-DD.', - 'EMAIL': '$ is not valid.', - 'URL': '$ is not valid.', - 'PHONE': '$ is not a valid phone number.', - '<': '$ must be less than % characters.', - '<=': '$ must be less or equal to % characters.', - '>': '$ must be greater than % characters.', - '>=': '$ must be greater or equal to % characters.', - '==': '$ must be equal to %', - '!=': '$ must be different than %' - }, + var _messages = { + 'default': '$ contain error(s).', + 'NOTEMPTY': '$ must not be empty.', + 'INTEGER': '$ must be an integer.', + 'NUMERIC': '$ must be numeric.', + 'MIXED': '$ must be letters or numbers (no special characters).', + 'NAME': '$ must not contain special characters.', + 'NOSPACE': '$ must not contain spaces.', + 'TRIM': '$ must not start or end with space character.', + 'DATE': '$ is not a valid with format YYYY-MM-DD.', + 'EMAIL': '$ is not valid.', + 'URL': '$ is not valid.', + 'PHONE': '$ is not a valid phone number.', + '<': '$ must be less than % characters.', + '<=': '$ must be less or equal to % characters.', + '>': '$ must be greater than % characters.', + '>=': '$ must be greater or equal to % characters.', + '==': '$ must be equal to %', + '!=': '$ must be different than %' + }; - _data = { - validation: 'data-validation', - validationMessage: 'data-validation-message', - regex: 'data-validation-regex', - regexReverse: 'data-validation-regex-reverse', - regexMessage: 'data-validation-regex-message', - group: 'data-validation-group', - label: 'data-validation-label', - errorList: 'data-error-list' - }, + var _data = { + validation: 'data-validation', + validationMessage: 'data-validation-message', + regex: 'data-validation-regex', + regexReverse: 'data-validation-regex-reverse', + regexMessage: 'data-validation-regex-message', + group: 'data-validation-group', + label: 'data-validation-label', + errorList: 'data-error-list' + } - _options = { - submit: { - settings: { - form: null, - display: "inline", - insertion: "append", - allErrors: false, - trigger: "click", - button: "[type='submit']", - errorClass: "error", - errorListClass: "error-list", - errorListContainer: null, - inputContainer: null, - clear: "focusin", - scrollToError: false - }, - callback: { - onInit: null, - onValidate: null, - onError: null, - onBeforeSubmit: null, - onSubmit: null, - onAfterSubmit: null - } + var _options = { + submit: { + settings: { + form: null, + display: "inline", + insertion: "append", + allErrors: false, + trigger: "click", + button: "[type='submit']", + errorClass: "error", + errorListClass: "error-list", + errorListContainer: null, + inputContainer: null, + clear: "focusin", + scrollToError: false }, - dynamic: { - settings: { - trigger: null, - delay: 300 - }, - callback: { - onSuccess: null, - onError: null, - onComplete: null - } + callback: { + onInit: null, + onValidate: null, + onError: null, + onBeforeSubmit: null, + onSubmit: null, + onAfterSubmit: null + } + }, + dynamic: { + settings: { + trigger: null, + delay: 300 }, - rules: {}, - messages: {}, - labels: {}, - debug: false + callback: { + onSuccess: null, + onError: null, + onComplete: null + } }, + rules: {}, + messages: {}, + labels: {}, + debug: false + }; - _supported = { - submit: { - settings: { - display: ["inline", "block"], - insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" - allErrors: [true, false], - clear: ["focusin", "keypress", false], - trigger: [ - "click", "dblclick", "focusout", - "hover", "mousedown", "mouseenter", - "mouseleave", "mousemove", "mouseout", - "mouseover", "mouseup", "toggle" - ] - } - }, - dynamic: { - settings: { - trigger: ["focusout", "keydown", "keypress", "keyup"] - } - }, - debug: [true, false] - }; + var _supported = { + submit: { + settings: { + display: ["inline", "block"], + insertion: ["append", "prepend"], //"before", "insertBefore", "after", "insertAfter" + allErrors: [true, false], + clear: ["focusin", "keypress", false], + trigger: [ + "click", "dblclick", "focusout", + "hover", "mousedown", "mouseenter", + "mouseleave", "mousemove", "mouseout", + "mouseover", "mouseup", "toggle" + ] + } + }, + dynamic: { + settings: { + trigger: ["focusout", "keydown", "keypress", "keyup"] + } + }, + debug: [true, false] + }; var Validation = function(node, options) { @@ -252,7 +252,6 @@ options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', - 'arguments': JSON.stringify(options), 'message': 'OK - Dynamic Validation activated on ' + node.length + ' form(s)' }); @@ -315,7 +314,6 @@ options.debug && window.Debug.log({ 'node': node, 'function': 'delegateValidation()', - 'arguments': JSON.stringify(options), 'message': 'OK - Validation activated on ' + node.length + ' form(s)' }); @@ -368,11 +366,24 @@ formData = {}; + $.each( - node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), + node.find('input:not([type="submit"]), select, textarea'), function(index, input) { - if (!validateInput(input)) { - isValid = false; + + input = $(input); + + var value = _getInputValue(input[0]), + inputName = input.attr('name'); + + if (inputName) { + formData[inputName] = value; + } + + if (!input.attr('disabled') && (!!input.attr(_data.validation) || !!input.attr(_data.regex))) { + if (!validateInput(input[0], value)) { + isValid = false; + } } } ); @@ -422,9 +433,10 @@ } - function validateInput(input) { + function validateInput(input, value) { - var inputName = $(input).attr('name'); + var inputName = $(input).attr('name'), + value = value || _getInputValue(input); if (!inputName) { options.debug && window.Debug.log({ @@ -437,9 +449,7 @@ return false; } - var value = _getInputValue(input), - - matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), + var matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), inputShortName = window.Validation.labels[inputName] || options.labels[inputName] || $(input).attr(_data.label) || @@ -453,8 +463,6 @@ validateOnce = false; - formData[inputName] = value; - if (validationArray) { validationArray = _api._splitValidation(validationArray); } @@ -715,7 +723,7 @@ } for (var i = 0; i < errors[inputName].length; i++) { - errorContainer.find('ul').append('
                                                                                                    • ' + errors[inputName][i] + '
                                                                                                    • '); + errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                    • ' + errors[inputName][i] + '
                                                                                                    • '); } if (options.submit.settings.clear || options.dynamic.settings.trigger) { @@ -1056,7 +1064,7 @@ if (!node[0] || node[0].nodeName.toLowerCase() !== "form") { window.Debug.log({ 'function': '$.validate()', - 'arguments': JSON.stringify(options.submit.settings.form), + 'arguments': options.submit.settings.form, 'message': 'Unable to find jQuery form element - Validation dropped' }); @@ -1187,7 +1195,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid node selector' }); @@ -1200,7 +1208,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid argument, must be type object' }); @@ -1226,7 +1234,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': JSON.stringify(inputName), + 'arguments': inputName, 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName + '"]")' }); @@ -1248,7 +1256,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': JSON.stringify(error[inputName][i]), + 'arguments': error[inputName][i], 'message': 'ERROR - Invalid error object property - Accepted format: {"inputName": "errorString"} or {"inputName": ["errorString", "errorString"]}' }); @@ -1273,7 +1281,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid node selector' }); @@ -1291,7 +1299,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': JSON.stringify(inputName), + 'arguments': inputName, 'message': 'ERROR - Invalid inputName, must be type String or Array' }); @@ -1312,7 +1320,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': JSON.stringify(inputName[i]), + 'arguments': inputName[i], 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName[i] + '"]")' }); diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index d551fb5..85fc32d 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) + * @version 1.5.3 (2015-06-14) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find("["+_data.validation+"]:not([disabled]),["+_data.regex+"]:not([disabled])"),function(b,c){validateInput(c)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a){var b=$(a).attr("name");if(!b)return!1;var c=_getInputValue(a),d=b.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[b]||options.labels[b]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(formData[b]=c,f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(c)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(c,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(b,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(c,l,i)}catch(m){m[0]=j||m[0],registerError(b,m[0].replace("$",e))}}return!errors[b]||errors[b]instanceof Array&&0===errors[b].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                        ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea'),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(formData[e]=d),c.attr("disabled")||!c.attr(_data.validation)&&!c.attr(_data.regex)||validateInput(c[0],d)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                          ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/html5-form-validation.jquery.json b/html5-form-validation.jquery.json index 844a073..a041b20 100644 --- a/html5-form-validation.jquery.json +++ b/html5-form-validation.jquery.json @@ -1,30 +1,30 @@ -{ - "name": "html5-form-validation", - "title": "jQuery Form Validation", - "description": "jQuery plugin that provides a client site form validation with builtin options and deep customization.", - "keywords": [ - "form", - "html5", - "validate", - "validation", - "input" - ], - "version": "1.5.2", - "author": { - "name": "Tom Bertrand", - "url": "http://www.runningcoder.org/jqueryvalidation/" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/running-coder/jquery-form-validation/blob/master/LICENSE" - } - ], - "bugs": "https://github.com/running-coder/jquery-form-validation/issues", - "homepage": "http://www.runningcoder.org/jqueryvalidation/", - "docs": "http://www.runningcoder.org/jqueryvalidation/documentation/", - "demo": "http://www.runningcoder.org/jqueryvalidation/demo/", - "dependencies": { - "jquery": ">=1.7.2" - } +{ + "name": "html5-form-validation", + "title": "jQuery Form Validation", + "description": "jQuery plugin that provides a client site form validation with builtin options and deep customization.", + "keywords": [ + "form", + "html5", + "validate", + "validation", + "input" + ], + "version": "1.5.3", + "author": { + "name": "Tom Bertrand", + "url": "http://www.runningcoder.org/jqueryvalidation/" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/running-coder/jquery-form-validation/blob/master/LICENSE" + } + ], + "bugs": "https://github.com/running-coder/jquery-form-validation/issues", + "homepage": "http://www.runningcoder.org/jqueryvalidation/", + "docs": "http://www.runningcoder.org/jqueryvalidation/documentation/", + "demo": "http://www.runningcoder.org/jqueryvalidation/demo/", + "dependencies": { + "jquery": ">=1.7.2" + } } \ No newline at end of file diff --git a/package.json b/package.json index 0fd1041..d568bb5 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,6 @@ "grunt-jsbeautifier": "~0.2.10", "grunt-stripcomments": "~0.3.1" }, - "version": "2.0.0", + "version": "1.5.3", "main": "dist/jquery.validation.min.js" } \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index 8df67af..512e837 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,10 +4,11 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 2.0.0 (2015-04-22) + * @version 1.5.3 (2015-06-14) * @link http://www.runningcoder.org/jqueryvalidation/ */ -;(function (window, document, $, undefined) { +; +(function (window, document, $, undefined) { window.Validation = { form: [], @@ -47,13 +48,13 @@ PHONE: /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/, OPTIONAL: /\S/, COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ - }, + }; /** * @private * Error messages */ - _messages = { + var _messages = { 'default': '$ contain error(s).', 'NOTEMPTY': '$ must not be empty.', 'INTEGER': '$ must be an integer.', @@ -72,13 +73,13 @@ '>=': '$ must be greater or equal to % characters.', '==': '$ must be equal to %', '!=': '$ must be different than %' - }, + }; /** * @private * HTML5 data attributes */ - _data = { + var _data = { validation: 'data-validation', validationMessage: 'data-validation-message', regex: 'data-validation-regex', @@ -87,7 +88,7 @@ group: 'data-validation-group', label: 'data-validation-label', errorList: 'data-error-list' - }, + } /** * @private @@ -95,7 +96,7 @@ * * @link http://www.runningcoder.org/jqueryvalidation/documentation/ */ - _options = { + var _options = { submit: { settings: { form: null, @@ -135,13 +136,13 @@ messages: {}, labels: {}, debug: false - }, + }; /** * @private * Limit the supported options on matching keys */ - _supported = { + var _supported = { submit: { settings: { display: ["inline", "block"], @@ -326,7 +327,6 @@ options.debug && window.Debug.log({ 'node': node, 'function': 'delegateDynamicValidation()', - 'arguments': JSON.stringify(options), 'message': 'OK - Dynamic Validation activated on ' + node.length + ' form(s)' }); // {/debug} @@ -401,7 +401,6 @@ options.debug && window.Debug.log({ 'node': node, 'function': 'delegateValidation()', - 'arguments': JSON.stringify(options), 'message': 'OK - Validation activated on ' + node.length + ' form(s)' }); // {/debug} @@ -467,11 +466,24 @@ formData = {}; + $.each( - node.find('[' + _data.validation + ']:not([disabled]),[' + _data.regex + ']:not([disabled])'), + node.find('input:not([type="submit"]), select, textarea'), function (index, input) { - if (!validateInput(input)) { - isValid = false; + + input = $(input); + + var value = _getInputValue(input[0]), + inputName = input.attr('name'); + + if (inputName) { + formData[inputName] = value; + } + + if (!input.attr('disabled') && (!!input.attr(_data.validation) || !!input.attr(_data.regex))) { + if (!validateInput(input[0], value)) { + isValid = false; + } } } ); @@ -487,7 +499,7 @@ * * @returns {Object} data */ - function prepareFormData () { + function prepareFormData() { var data = {}, matches, @@ -502,7 +514,7 @@ var tmpObject = {}, tmpArray = []; - for (var k = matches.length - 1; k >= 0 ; k--) { + for (var k = matches.length - 1; k >= 0; k--) { if (matches[k] === "") { matches.splice(k, 1); continue; @@ -534,9 +546,10 @@ * * @returns {Boolean} true if no error(s) were found (valid input) */ - function validateInput(input) { + function validateInput(input, value) { - var inputName = $(input).attr('name'); + var inputName = $(input).attr('name'), + value = value || _getInputValue(input); if (!inputName) { @@ -552,9 +565,7 @@ return false; } - var value = _getInputValue(input), - - matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), + var matches = inputName.replace(/]$/, '').split(/]\[|[[\]]/g), inputShortName = window.Validation.labels[inputName] || options.labels[inputName] || $(input).attr(_data.label) || @@ -568,8 +579,6 @@ validateOnce = false; - formData[inputName] = value; - if (validationArray) { validationArray = _api._splitValidation(validationArray); } @@ -883,7 +892,7 @@ if (options.submit.settings.display === "inline" || (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) - ) { + ) { if (options.submit.settings.insertion === 'append') { errorContainer.append(html); } else if (options.submit.settings.insertion === 'prepend') { @@ -892,7 +901,7 @@ } for (var i = 0; i < errors[inputName].length; i++) { - errorContainer.find('ul').append('
                                                                                                        • ' + errors[inputName][i] + '
                                                                                                        • '); + errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                        • ' + errors[inputName][i] + '
                                                                                                        • '); } if (options.submit.settings.clear || options.dynamic.settings.trigger) { @@ -1460,7 +1469,7 @@ // {debug} window.Debug.log({ 'function': '$.validate()', - 'arguments': JSON.stringify(options.submit.settings.form), + 'arguments': options.submit.settings.form, 'message': 'Unable to find jQuery form element - Validation dropped' }); @@ -1636,7 +1645,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid node selector' }); @@ -1652,7 +1661,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid argument, must be type object' }); @@ -1681,7 +1690,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': JSON.stringify(inputName), + 'arguments': inputName, 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName + '"]")' }); @@ -1706,7 +1715,7 @@ window.Debug.log({ 'node': node, 'function': '$.addError()', - 'arguments': JSON.stringify(error[inputName][i]), + 'arguments': error[inputName][i], 'message': 'ERROR - Invalid error object property - Accepted format: {"inputName": "errorString"} or {"inputName": ["errorString", "errorString"]}' }); @@ -1749,7 +1758,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': 'window.Validation.form[' + JSON.stringify(node.selector) + ']', + 'arguments': 'window.Validation.form[' + node.selector + ']', 'message': 'ERROR - Invalid node selector' }); @@ -1770,7 +1779,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': JSON.stringify(inputName), + 'arguments': inputName, 'message': 'ERROR - Invalid inputName, must be type String or Array' }); @@ -1794,7 +1803,7 @@ window.Debug.log({ 'node': node, 'function': '$.removeError()', - 'arguments': JSON.stringify(inputName[i]), + 'arguments': inputName[i], 'message': 'ERROR - Unable to find ' + '$(' + node.selector + ').find("[name="' + inputName[i] + '"]")' }); From b3d17fde543f16a7aadc250ac16bd3859bf10dcb Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Mon, 15 Jun 2015 13:29:59 -0400 Subject: [PATCH 36/41] adding .idea files to git ignore list --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 93f1361..67d713f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +.idea node_modules npm-debug.log From 89a5994c8539297557e20e50c558a60d9e761538 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Thu, 2 Jul 2015 11:54:16 -0400 Subject: [PATCH 37/41] Fixed issue where form submit was sending DISABLED inputs --- dist/jquery.validation.js | 6 +++--- dist/jquery.validation.min.js | 4 ++-- src/jquery.validation.js | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index 18de501..bfd10f9 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-06-14) + * @version 1.5.3 (2015-07-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -368,7 +368,7 @@ $.each( - node.find('input:not([type="submit"]), select, textarea'), + node.find('input:not([type="submit"]), select, textarea').not(':disabled'), function(index, input) { input = $(input); @@ -380,7 +380,7 @@ formData[inputName] = value; } - if (!input.attr('disabled') && (!!input.attr(_data.validation) || !!input.attr(_data.regex))) { + if (!!input.attr(_data.validation) || !!input.attr(_data.regex)) { if (!validateInput(input[0], value)) { isValid = false; } diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index 85fc32d..7847947 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-06-14) + * @version 1.5.3 (2015-07-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea'),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(formData[e]=d),c.attr("disabled")||!c.attr(_data.validation)&&!c.attr(_data.regex)||validateInput(c[0],d)||(a=!1)}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                            ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                              ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index 512e837..caa239a 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-06-14) + * @version 1.5.3 (2015-07-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -468,8 +468,8 @@ $.each( - node.find('input:not([type="submit"]), select, textarea'), - function (index, input) { + node.find('input:not([type="submit"]), select, textarea').not(':disabled'), + function(index, input) { input = $(input); @@ -480,7 +480,7 @@ formData[inputName] = value; } - if (!input.attr('disabled') && (!!input.attr(_data.validation) || !!input.attr(_data.regex))) { + if (!!input.attr(_data.validation) || !!input.attr(_data.regex)) { if (!validateInput(input[0], value)) { isValid = false; } From 14d4ea4efdc3f54b9a26a4b0813196a28672cdfc Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 8 Jul 2015 14:12:39 -0400 Subject: [PATCH 38/41] Allow formData to be built as Array instead of Object only using "inputname[]" --- dist/jquery.validation.js | 13 ++++++++++--- dist/jquery.validation.min.js | 4 ++-- src/jquery.validation.js | 15 +++++++++++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index bfd10f9..e26ba59 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-02) + * @version 1.5.3 (2015-07-08) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -366,7 +366,6 @@ formData = {}; - $.each( node.find('input:not([type="submit"]), select, textarea').not(':disabled'), function(index, input) { @@ -377,7 +376,15 @@ inputName = input.attr('name'); if (inputName) { - formData[inputName] = value; + if (/\[]$/.test(inputName)) { + inputName = inputName.replace(/\[]$/, ''); + if (!(formData[inputName] instanceof Array)) { + formData[inputName] = []; + } + formData[inputName].push(value) + } else { + formData[inputName] = value; + } } if (!!input.attr(_data.validation) || !!input.attr(_data.regex)) { diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index 7847947..bc16588 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-02) + * @version 1.5.3 (2015-07-08) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                  ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index caa239a..27fab39 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-02) + * @version 1.5.3 (2015-07-08) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -466,7 +466,6 @@ formData = {}; - $.each( node.find('input:not([type="submit"]), select, textarea').not(':disabled'), function(index, input) { @@ -477,7 +476,15 @@ inputName = input.attr('name'); if (inputName) { - formData[inputName] = value; + if (/\[]$/.test(inputName)) { + inputName = inputName.replace(/\[]$/, ''); + if (!(formData[inputName] instanceof Array)) { + formData[inputName] = []; + } + formData[inputName].push(value) + } else { + formData[inputName] = value; + } } if (!!input.attr(_data.validation) || !!input.attr(_data.regex)) { @@ -892,7 +899,7 @@ if (options.submit.settings.display === "inline" || (options.submit.settings.display === "block" && !errorContainer.find('[' + _data.errorList + ']')[0]) - ) { + ) { if (options.submit.settings.insertion === 'append') { errorContainer.append(html); } else if (options.submit.settings.insertion === 'prepend') { From aeebc3b6d8f40603b7e96b1e2d645ceb7fdb3436 Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Fri, 17 Jul 2015 10:27:03 -0400 Subject: [PATCH 39/41] - Allow addError to be interpreted in the onValidate callback --- dist/jquery.validation.js | 15 ++++++++++++--- dist/jquery.validation.min.js | 4 ++-- src/jquery.validation.js | 15 ++++++++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index e26ba59..65a9feb 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-08) + * @version 1.5.3 (2015-07-16) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -362,7 +362,7 @@ function validateForm() { - var isValid = true; + var isValid = isEmpty(errors); formData = {}; @@ -1459,7 +1459,7 @@ }, print: function() { - if ($.isEmptyObject(this.table)) { + if (isEmpty(this.table)) { return false; } @@ -1491,6 +1491,15 @@ return this.charAt(0).toUpperCase() + this.slice(1); }; + function isEmpty(obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) + return false; + } + + return true; + } + if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt) { var len = this.length >>> 0; diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index bc16588..9f3ad96 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-08) + * @version 1.5.3 (2015-07-16) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=!0;return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                    ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}function isEmpty(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=isEmpty(errors);return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                      ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index 27fab39..5b3cab5 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-08) + * @version 1.5.3 (2015-07-16) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -462,7 +462,7 @@ */ function validateForm() { - var isValid = true; + var isValid = isEmpty(errors); formData = {}; @@ -1972,7 +1972,7 @@ }, print: function () { - if ($.isEmptyObject(this.table)) { + if (isEmpty(this.table)) { return false; } @@ -2005,6 +2005,15 @@ return this.charAt(0).toUpperCase() + this.slice(1); }; + function isEmpty (obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) + return false; + } + + return true; + } + if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (elt /*, from*/) { var len = this.length >>> 0; From 927d021bae6b9b12ce7fbf203bf0b3082037df6b Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Thu, 3 Sep 2015 17:39:52 -0400 Subject: [PATCH 40/41] Adding "errorTemplate" option --- dist/jquery.validation.js | 10 ++++++++-- dist/jquery.validation.min.js | 4 ++-- src/jquery.validation.js | 10 ++++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index 65a9feb..a9137bb 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-16) + * @version 1.5.3 (2015-09-03) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -81,6 +81,7 @@ errorClass: "error", errorListClass: "error-list", errorListContainer: null, + errorTemplate: null, inputContainer: null, clear: "focusin", scrollToError: false @@ -730,7 +731,12 @@ } for (var i = 0; i < errors[inputName].length; i++) { - errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                                    • ' + errors[inputName][i] + '
                                                                                                                    • '); + if (options.submit.settings.errorTemplate) { + errorContainer.find('[' + _data.errorList + '] ul') + .append('
                                                                                                                    • ' + options.submit.settings.errorTemplate.replace('{{validation-message}}', errors[inputName][i]) + '
                                                                                                                    • '); + } else { + errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                                    • ' + errors[inputName][i] + '
                                                                                                                    • '); + } } if (options.submit.settings.clear || options.dynamic.settings.trigger) { diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index 9f3ad96..dabe154 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-16) + * @version 1.5.3 (2015-09-03) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}function isEmpty(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=isEmpty(errors);return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                        ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+errors[a][i]+"");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}function isEmpty(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,errorTemplate:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=isEmpty(errors);return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                          ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+options.submit.settings.errorTemplate.replace("{{validation-message}}",errors[a][i])+"":"
                                                                                                                        • "+errors[a][i]+"
                                                                                                                        • ");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index 5b3cab5..fff1daa 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-07-16) + * @version 1.5.3 (2015-09-03) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -108,6 +108,7 @@ errorClass: "error", errorListClass: "error-list", errorListContainer: null, + errorTemplate: null, inputContainer: null, clear: "focusin", scrollToError: false @@ -908,7 +909,12 @@ } for (var i = 0; i < errors[inputName].length; i++) { - errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                                        • ' + errors[inputName][i] + '
                                                                                                                        • '); + if (options.submit.settings.errorTemplate) { + errorContainer.find('[' + _data.errorList + '] ul') + .append('
                                                                                                                        • ' + options.submit.settings.errorTemplate.replace('{{validation-message}}', errors[inputName][i]) + '
                                                                                                                        • '); + } else { + errorContainer.find('[' + _data.errorList + '] ul').append('
                                                                                                                        • ' + errors[inputName][i] + '
                                                                                                                        • '); + } } if (options.submit.settings.clear || options.dynamic.settings.trigger) { From 196540a32e6dea66f2c1c2baea078931369c26cd Mon Sep 17 00:00:00 2001 From: tom bertrand Date: Wed, 2 Dec 2015 12:25:55 -0500 Subject: [PATCH 41/41] onSubmit callback will now submit the form is true is returned --- dist/jquery.validation.js | 13 +++++++++---- dist/jquery.validation.min.js | 4 ++-- src/jquery.validation.js | 13 +++++++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/dist/jquery.validation.js b/dist/jquery.validation.js index a9137bb..0d16d61 100644 --- a/dist/jquery.validation.js +++ b/dist/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-09-03) + * @version 1.5.3 (2015-12-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -348,7 +348,13 @@ _executeCallback(options.submit.callback.onBeforeSubmit, [node]); - (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]): submitForm(); + if (typeof options.submit.callback.onSubmit === "function") { + if (_executeCallback(options.submit.callback.onSubmit, [node, formData]) === true) { + submitForm(); + } + } else { + submitForm(); + } _executeCallback(options.submit.callback.onAfterSubmit, [node]); @@ -943,8 +949,7 @@ } - _callback.apply(this, $.merge(_params || [], (extraParams) ? extraParams : [])); - return true; + return _callback.apply(this, $.merge(_params || [], (extraParams) ? extraParams : [])); }; diff --git a/dist/jquery.validation.min.js b/dist/jquery.validation.min.js index dabe154..95e1d6b 100644 --- a/dist/jquery.validation.min.js +++ b/dist/jquery.validation.min.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-09-03) + * @version 1.5.3 (2015-12-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ -!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}function isEmpty(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,errorTemplate:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData]):submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=isEmpty(errors);return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                            ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+options.submit.settings.errorTemplate.replace("{{validation-message}}",errors[a][i])+"":"
                                                                                                                          • "+errors[a][i]+"
                                                                                                                          • ");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file +!function(window,document,$,undefined){function _buildRegexFromString(a){function b(){}if(!a||"string"!=typeof a&&!(a instanceof RegExp))return b(),!1;"string"!=typeof a&&(a=a.toString());for(var c,d,e,f=a.charAt(0),g=a.length-1;g>0&&/[gimsxeU]/.test(a.charAt(g));)g--;a.charAt(g)!==f&&(f=null),f&&g!==a.length-1&&(d=a.substr(g+1,a.length-1)),c=f?a.substr(1,g-1):a;try{e=new RegExp(c,d)}catch(h){return b(),!1}return e}function isEmpty(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}window.Validation={form:[],labels:{},hasScrolled:!1},"function"!=typeof Object.preventExtensions&&(Object.preventExtensions=function(a){return a});var _rules={NOTEMPTY:/\S/,INTEGER:/^\d+$/,NUMERIC:/^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/,MIXED:/^[\w\s-]+$/,NAME:/^['a-zãàáäâẽèéëêìíïîõòóöôùúüûñç\s-]+$/i,NOSPACE:/^(?!\s)\S*$/,TRIM:/^[^\s].*[^\s]$/,DATE:/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/,EMAIL:/^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i,URL:/^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/,PHONE:/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/,OPTIONAL:/\S/,COMPARISON:/^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/},_messages={"default":"$ contain error(s).",NOTEMPTY:"$ must not be empty.",INTEGER:"$ must be an integer.",NUMERIC:"$ must be numeric.",MIXED:"$ must be letters or numbers (no special characters).",NAME:"$ must not contain special characters.",NOSPACE:"$ must not contain spaces.",TRIM:"$ must not start or end with space character.",DATE:"$ is not a valid with format YYYY-MM-DD.",EMAIL:"$ is not valid.",URL:"$ is not valid.",PHONE:"$ is not a valid phone number.","<":"$ must be less than % characters.","<=":"$ must be less or equal to % characters.",">":"$ must be greater than % characters.",">=":"$ must be greater or equal to % characters.","==":"$ must be equal to %","!=":"$ must be different than %"},_data={validation:"data-validation",validationMessage:"data-validation-message",regex:"data-validation-regex",regexReverse:"data-validation-regex-reverse",regexMessage:"data-validation-regex-message",group:"data-validation-group",label:"data-validation-label",errorList:"data-error-list"},_options={submit:{settings:{form:null,display:"inline",insertion:"append",allErrors:!1,trigger:"click",button:"[type='submit']",errorClass:"error",errorListClass:"error-list",errorListContainer:null,errorTemplate:null,inputContainer:null,clear:"focusin",scrollToError:!1},callback:{onInit:null,onValidate:null,onError:null,onBeforeSubmit:null,onSubmit:null,onAfterSubmit:null}},dynamic:{settings:{trigger:null,delay:300},callback:{onSuccess:null,onError:null,onComplete:null}},rules:{},messages:{},labels:{},debug:!1},_supported={submit:{settings:{display:["inline","block"],insertion:["append","prepend"],allErrors:[!0,!1],clear:["focusin","keypress",!1],trigger:["click","dblclick","focusout","hover","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","toggle"]}},dynamic:{settings:{trigger:["focusout","keydown","keypress","keyup"]}},debug:[!0,!1]},Validation=function(node,options){function extendRules(){options.rules=$.extend(!0,{},_rules,options.rules)}function extendMessages(){options.messages=$.extend(!0,{},_messages,options.messages)}function extendOptions(){options instanceof Object||(options={});var a=Object.preventExtensions($.extend(!0,{},_options));for(var b in options)if(options.hasOwnProperty(b)&&"debug"!==b)if(~["labels","messages","rules"].indexOf(b)&&options[b]instanceof Object)a[b]=options[b];else if(_options[b]&&options[b]instanceof Object)for(var c in options[b])if(options[b].hasOwnProperty(c)&&_options[b][c]&&options[b][c]instanceof Object){for(var d in options[b][c])options[b][c].hasOwnProperty(d)&&_supported[b]&&_supported[b][c]&&_supported[b][c][d]&&-1===$.inArray(options[b][c][d],_supported[b][c][d])&&delete options[b][c][d];a[b]&&a[b][c]&&(a[b][c]=$.extend(Object.preventExtensions(a[b][c]),options[b][c]))}a.dynamic.settings.trigger&&"keypress"===a.dynamic.settings.trigger&&"keypress"===a.submit.settings.clear&&(a.dynamic.settings.trigger="keydown"),options=a}function delegateDynamicValidation(){if(!options.dynamic.settings.trigger)return!1;if(!node.find("["+_data.validation+"],["+_data.regex+"]")[0])return!1;var a=options.dynamic.settings.trigger+delegateSuffix;"focusout"!==options.dynamic.settings.trigger&&(a+=" change"+delegateSuffix+" paste"+delegateSuffix),$.each(node.find("["+_data.validation+"],["+_data.regex+"]"),function(b,c){$(c).unbind(a).on(a,function(a){if($(this).is(":disabled"))return!1;var b=this,c=a.keyCode||null;_typeWatch(function(){validateInput(b)?_executeCallback(options.dynamic.callback.onSuccess,[node,b,c]):(displayOneError(b.name),_executeCallback(options.dynamic.callback.onError,[node,b,c,errors[b.name]])),_executeCallback(options.dynamic.callback.onComplete,[node,b,c])},options.dynamic.settings.delay)})})}function delegateValidation(){_executeCallback(options.submit.callback.onInit,[node]);var a=options.submit.settings.trigger+".vd";return node.find(options.submit.settings.button)[0]?(node.on("submit",!1),void node.find(options.submit.settings.button).off(".vd").on(a,function(a){return a.preventDefault(),resetErrors(),_executeCallback(options.submit.callback.onValidate,[node]),validateForm()?(_executeCallback(options.submit.callback.onBeforeSubmit,[node]),"function"==typeof options.submit.callback.onSubmit?_executeCallback(options.submit.callback.onSubmit,[node,formData])===!0&&submitForm():submitForm(),_executeCallback(options.submit.callback.onAfterSubmit,[node])):(displayErrors(),_executeCallback(options.submit.callback.onError,[node,errors,formData])),!1})):!1}function validateForm(){var a=isEmpty(errors);return formData={},$.each(node.find('input:not([type="submit"]), select, textarea').not(":disabled"),function(b,c){c=$(c);var d=_getInputValue(c[0]),e=c.attr("name");e&&(/\[]$/.test(e)?(e=e.replace(/\[]$/,""),formData[e]instanceof Array||(formData[e]=[]),formData[e].push(d)):formData[e]=d),(c.attr(_data.validation)||c.attr(_data.regex))&&(validateInput(c[0],d)||(a=!1))}),prepareFormData(),a}function prepareFormData(){var a,b,c={};for(var d in formData)if(formData.hasOwnProperty(d)){b=0,a=d.split(/\[(.+?)]/g);for(var e={},f=[],g=a.length-1;g>=0;g--)""!==a[g]?(f.length<1?e[a[g]]=Number(formData[d])||formData[d]:(e={},e[a[g]]=f[f.length-1]),f.push(e)):a.splice(g,1);c=$.extend(!0,c,e)}formData=c}function validateInput(a,b){var c=$(a).attr("name"),b=b||_getInputValue(a);if(!c)return!1;var d=c.replace(/]$/,"").split(/]\[|[[\]]/g),e=window.Validation.labels[c]||options.labels[c]||$(a).attr(_data.label)||d[d.length-1],f=$(a).attr(_data.validation),g=$(a).attr(_data.validationMessage),h=$(a).attr(_data.regex),i=!($(a).attr(_data.regexReverse)===undefined),j=$(a).attr(_data.regexMessage),k=!1;if(f&&(f=_api._splitValidation(f)),f instanceof Array&&f.length>0){if(""===$.trim(b)&&~f.indexOf("OPTIONAL"))return!0;$.each(f,function(a,d){if(k===!0)return!0;try{validateRule(b,d)}catch(f){(g||!options.submit.settings.allErrors)&&(k=!0),f[0]=g||f[0],registerError(c,f[0].replace("$",e).replace("%",f[1]))}})}if(h){var l=_buildRegexFromString(h);if(!(l instanceof RegExp))return!0;try{validateRule(b,l,i)}catch(m){m[0]=j||m[0],registerError(c,m[0].replace("$",e))}}return!errors[c]||errors[c]instanceof Array&&0===errors[c].length}function validateRule(value,rule,reversed){if(rule instanceof RegExp){var isValid=rule.test(value);if(reversed&&(isValid=!isValid),!isValid)throw[options.messages["default"],""]}else if(options.rules[rule]){if(!options.rules[rule].test(value))throw[options.messages[rule],""]}else{var comparison=rule.match(options.rules.COMPARISON);if(comparison&&4===comparison.length){var type=comparison[1],operator=comparison[2],compared=comparison[3],comparedValue;switch(type){case"L":if(isNaN(compared))return!1;if(!value||eval(value.length+operator+parseFloat(compared))===!1)throw[options.messages[operator],compared];break;case"V":default:if(isNaN(compared)){if(comparedValue=node.find('[name="'+compared+'"]').val(),!comparedValue)return!1;if(!value||!eval('"'+encodeURIComponent(value)+'"'+operator+'"'+encodeURIComponent(comparedValue)+'"'))throw[options.messages[operator].replace(" characters",""),compared]}else if(!value||isNaN(value)||!eval(value+operator+parseFloat(compared)))throw[options.messages[operator].replace(" characters",""),compared]}}}}function registerError(a,b){errors[a]||(errors[a]=[]),b=b.capitalize();for(var c=!1,d=0;d
                                                                                                                              ";if(!errors.hasOwnProperty(a))return!1;if(b=node.find('[name="'+a+'"]'),e=null,!b[0])return!1;if(f=b.attr(_data.group),f?(g=node.find('[name="'+a+'"]'),e=node.find('[id="'+f+'"]'),e[0]&&(e.addClass(options.submit.settings.errorClass),d=e)):(b.addClass(options.submit.settings.errorClass),options.submit.settings.inputContainer&&b.parentsUntil(node,options.submit.settings.inputContainer).addClass(options.submit.settings.errorClass),c=b.attr("id"),c&&(e=node.find('label[for="'+c+'"]')[0]),e||(e=b.parentsUntil(node,"label")[0]),e&&(e=$(e),e.addClass(options.submit.settings.errorClass))),"inline"===options.submit.settings.display?d=options.submit.settings.errorListContainer?b.parentsUntil(node,options.submit.settings.errorListContainer):d||b.parent():"block"===options.submit.settings.display&&(d=node),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]")[0])return!1;("inline"===options.submit.settings.display||"block"===options.submit.settings.display&&!d.find("["+_data.errorList+"]")[0])&&("append"===options.submit.settings.insertion?d.append(h):"prepend"===options.submit.settings.insertion&&d.prepend(h));for(var i=0;i"+options.submit.settings.errorTemplate.replace("{{validation-message}}",errors[a][i])+"":"
                                                                                                                            • "+errors[a][i]+"
                                                                                                                            • ");if(options.submit.settings.clear||options.dynamic.settings.trigger){f&&g&&(b=g);var j="coucou"+resetSuffix;options.submit.settings.clear&&(j+=" "+options.submit.settings.clear+resetSuffix,~["radio","checkbox"].indexOf(b[0].type)&&(j+=" change"+resetSuffix)),options.dynamic.settings.trigger&&(j+=" "+options.dynamic.settings.trigger+resetSuffix,"focusout"===options.dynamic.settings.trigger||~["radio","checkbox"].indexOf(b[0].type)||(j+=" change"+resetSuffix+" paste"+resetSuffix)),b.unbind(j).on(j,function(a,b,c,d,e){return function(){e?$(c).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d,e):$(b).hasClass(options.submit.settings.errorClass)&&resetOneError(a,b,c,d)}}(a,b,e,d,f))}if(options.submit.settings.scrollToError&&!window.Validation.hasScrolled){window.Validation.hasScrolled=!0;var k=parseFloat(options.submit.settings.scrollToError.offset)||0,l=parseFloat(options.submit.settings.scrollToError.duration)||500,m="block"===options.submit.settings.display?d:b;$("html, body").animate({scrollTop:m.offset().top+k},l)}}function displayErrors(){for(var a in errors)errors.hasOwnProperty(a)&&displayOneError(a)}function resetOneError(a,b,c,d,e){if(delete errors[a],d)options.submit.settings.inputContainer&&(e?c:b).parentsUntil(node,options.submit.settings.inputContainer).removeClass(options.submit.settings.errorClass),c&&c.removeClass(options.submit.settings.errorClass),b.removeClass(options.submit.settings.errorClass),"inline"===options.submit.settings.display&&d.find("["+_data.errorList+"]").remove();else{if(!b&&(b=node.find('[name="'+a+'"]'),!b[0]))return!1;b.trigger("coucou"+resetSuffix)}}function resetErrors(){errors=[],window.Validation.hasScrolled=!1,node.find("["+_data.errorList+"]").remove(),node.find("."+options.submit.settings.errorClass).removeClass(options.submit.settings.errorClass)}function submitForm(){node[0].submit()}function destroy(){return resetErrors(),node.find("["+_data.validation+"],["+_data.regex+"]").off(delegateSuffix+" "+resetSuffix),node.find(options.submit.settings.button).off(delegateSuffix).on("click"+delegateSuffix,function(){$(this).closest("form")[0].submit()}),!0}var errors=[],messages={},formData={},delegateSuffix=".vd",resetSuffix=".vr";window.Validation.hasScrolled=!1;var _getInputValue=function(a){var b;switch($(a).attr("type")){case"checkbox":b=$(a).is(":checked")?1:"";break;case"radio":b=node.find('input[name="'+$(a).attr("name")+'"]:checked').val()||"";break;default:b=$(a).val()}return b},_typeWatch=function(){var a=0;return function(b,c){clearTimeout(a),a=setTimeout(b,c)}}(),_executeCallback=function(a,b){if(!a)return!1;var c;if("function"==typeof a)c=a;else if("string"==typeof a||a instanceof Array){c=window,"string"==typeof a&&(a=[a,[]]);for(var d=a[0].split("."),e=a[1],f=!0,g=0;g>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1})}(window,document,window.jQuery); \ No newline at end of file diff --git a/src/jquery.validation.js b/src/jquery.validation.js index fff1daa..858fea6 100644 --- a/src/jquery.validation.js +++ b/src/jquery.validation.js @@ -4,7 +4,7 @@ * Licensed under the MIT license * * @author Tom Bertrand - * @version 1.5.3 (2015-09-03) + * @version 1.5.3 (2015-12-02) * @link http://www.runningcoder.org/jqueryvalidation/ */ ; @@ -439,7 +439,13 @@ _executeCallback(options.submit.callback.onBeforeSubmit, [node]); - (options.submit.callback.onSubmit) ? _executeCallback(options.submit.callback.onSubmit, [node, formData]) : submitForm(); + if (typeof options.submit.callback.onSubmit === "function") { + if (_executeCallback(options.submit.callback.onSubmit, [node, formData]) === true) { + submitForm(); + } + } else { + submitForm(); + } _executeCallback(options.submit.callback.onAfterSubmit, [node]); @@ -1196,8 +1202,7 @@ } - _callback.apply(this, $.merge(_params || [], (extraParams) ? extraParams : [])); - return true; + return _callback.apply(this, $.merge(_params || [], (extraParams) ? extraParams : [])); };