diff --git a/media/system/js/validate-uncompressed.js b/media/system/js/validate-uncompressed.js index 7ce75e498e006..2867413818906 100644 --- a/media/system/js/validate-uncompressed.js +++ b/media/system/js/validate-uncompressed.js @@ -191,6 +191,33 @@ var JFormValidator = function() { var regex = /^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; return regex.test(value); }); + setHandler('range', function(value, element) { + + if (handlers.numeric && ! handlers.numeric.exec(value, element)) { + return false; + } + + var min = parseFloat(element.prop('min')), + max = parseFloat(element.prop('max')), + step = parseFloat(element.prop('step')); + + // min attr is valid float and min greater than value + if(!isNaN(min) && min > value){ + return false; + } + + // max attr is valid float and max less than value + if(!isNaN(max) && max < value){ + return false; + } + + // step attr is valid float and value is not a multiple of step value + if(!isNaN(step) && value % step !== 0){ + return false; + } + + return true; + }); // Attach to forms with class 'form-validate' var forms = jQuery('form.form-validate'); for (var i = 0, l = forms.length; i < l; i++) { diff --git a/media/system/js/validate.js b/media/system/js/validate.js index 5dbfb1ae8251a..3354ec4f2b16e 100644 --- a/media/system/js/validate.js +++ b/media/system/js/validate.js @@ -1 +1 @@ -var JFormValidator=function(){"use strict";var e,t,n,r=function(t,n,r){r=r===""?!0:r,e[t]={enabled:r,exec:n}},i=function(e,t){var n,r=jQuery(t);return e?(n=r.find("#"+e+"-lbl"),n.length?n:(n=r.find('label[for="'+e+'"]'),n.length?n:!1)):!1},s=function(e,t){var n=t.data("label");n===undefined&&(n=i(t.attr("id"),t.get(0).form),t.data("label",n)),e===!1?(t.addClass("invalid").attr("aria-invalid","true"),n&&n.addClass("invalid")):(t.removeClass("invalid").attr("aria-invalid","false"),n&&n.removeClass("invalid"))},o=function(t){var n=jQuery(t),r,i;if(n.attr("disabled"))return s(!0,n),!0;if(n.attr("required")||n.hasClass("required")){r=n.prop("tagName").toLowerCase();if(r==="fieldset"&&(n.hasClass("radio")||n.hasClass("checkboxes"))){if(!n.find("input:checked").length)return s(!1,n),!1}else if(!n.val()||n.hasClass("placeholder")||n.attr("type")==="checkbox"&&!n.is(":checked"))return s(!1,n),!1}return i=n.attr("class")&&n.attr("class").match(/validate-([a-zA-Z0-9\_\-]+)/)?n.attr("class").match(/validate-([a-zA-Z0-9\_\-]+)/)[1]:"",i===""?(s(!0,n),!0):i&&i!=="none"&&e[i]&&n.val()&&e[i].exec(n.val(),n)!==!0?(s(!1,n),!1):(s(!0,n),!0)},u=function(e){var t,r=!0,i,s,u,a=[],f,l;t=jQuery(e).find("input, textarea, select, fieldset");for(f=0,l=t.length;f0){i=Joomla.JText._("JLIB_FORM_FIELD_INVALID"),s={error:[]};for(f=a.length-1;f>=0;f--)u=jQuery(a[f]).data("label"),u&&s.error.push(i+u.text().replace("*",""));Joomla.renderMessages(s)}return r},a=function(e){var n=[],r,i=jQuery(e);r=i.find("input, textarea, select, fieldset, button");for(var s=0,a=r.length;s|\"|'|%|;|(|)|&]","i");return!n.test(e)}),r("password",function(e,t){var n=/^\S[\S ]{2,98}\S$/;return n.test(e)}),r("numeric",function(e,t){var n=/^(\d|-)?(\d|,)*\.?\d*$/;return n.test(e)}),r("email",function(e,t){e=punycode.toASCII(e);var n=/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;return n.test(e)});var i=jQuery("form.form-validate");for(var s=0,o=i.length;s0){i=Joomla.JText._("JLIB_FORM_FIELD_INVALID"),s={error:[]};for(f=a.length-1;f>=0;f--)u=jQuery(a[f]).data("label"),u&&s.error.push(i+u.text().replace("*",""));Joomla.renderMessages(s)}return r},a=function(e){var n=[],r,i=jQuery(e);r=i.find("input, textarea, select, fieldset, button");for(var s=0,a=r.length;s|\"|'|%|;|(|)|&]","i");return!n.test(e)}),r("password",function(e,t){var n=/^\S[\S ]{2,98}\S$/;return n.test(e)}),r("numeric",function(e,t){var n=/^(\d|-)?(\d|,)*\.?\d*$/;return n.test(e)}),r("email",function(e,t){e=punycode.toASCII(e);var n=/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;return n.test(e)}),r("range",function(t,n){if(e.numeric&&!e.numeric.exec(t,n))return!1;var r=parseFloat(n.prop("min")),i=parseFloat(n.prop("max")),s=parseFloat(n.prop("step"));return!isNaN(r)&&r>t?!1:!isNaN(i)&&i