123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923 |
- /*
- * Really easy field validation with Prototype
- * http://tetlaw.id.au/view/javascript/really-easy-field-validation
- * Andrew Tetlaw
- * Version 1.5.4.1 (2007-01-05)
- *
- * Copyright (c) 2007 Andrew Tetlaw
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
- var Validator = Class.create();
- Validator.prototype = {
- initialize : function(className, error, test, options) {
- if(typeof test == 'function'){
- this.options = $H(options);
- this._test = test;
- } else {
- this.options = $H(test);
- this._test = function(){return true};
- }
- this.error = error || 'Validation failed.';
- this.className = className;
- },
- test : function(v, elm) {
- return (this._test(v,elm) && this.options.all(function(p){
- return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
- }));
- }
- }
- Validator.methods = {
- pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
- minLength : function(v,elm,opt) {return v.length >= opt},
- maxLength : function(v,elm,opt) {return v.length <= opt},
- min : function(v,elm,opt) {return v >= parseFloat(opt)},
- max : function(v,elm,opt) {return v <= parseFloat(opt)},
- notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
- return v != value;
- })},
- oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
- return v == value;
- })},
- is : function(v,elm,opt) {return v == opt},
- isNot : function(v,elm,opt) {return v != opt},
- equalToField : function(v,elm,opt) {return v == $F(opt)},
- notEqualToField : function(v,elm,opt) {return v != $F(opt)},
- include : function(v,elm,opt) {return $A(opt).all(function(value) {
- return Validation.get(value).test(v,elm);
- })}
- }
- var Validation = Class.create();
- Validation.defaultOptions = {
- onSubmit : true,
- stopOnFirst : false,
- immediate : false,
- focusOnError : true,
- useTitles : false,
- addClassNameToContainer: false,
- containerClassName: '.input-box',
- onFormValidate : function(result, form) {},
- onElementValidate : function(result, elm) {}
- };
- Validation.prototype = {
- initialize : function(form, options){
- this.form = $(form);
- if (!this.form) {
- return;
- }
- this.options = Object.extend({
- onSubmit : Validation.defaultOptions.onSubmit,
- stopOnFirst : Validation.defaultOptions.stopOnFirst,
- immediate : Validation.defaultOptions.immediate,
- focusOnError : Validation.defaultOptions.focusOnError,
- useTitles : Validation.defaultOptions.useTitles,
- onFormValidate : Validation.defaultOptions.onFormValidate,
- onElementValidate : Validation.defaultOptions.onElementValidate
- }, options || {});
- if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
- if(this.options.immediate) {
- Form.getElements(this.form).each(function(input) { // Thanks Mike!
- if (input.tagName.toLowerCase() == 'select') {
- Event.observe(input, 'blur', this.onChange.bindAsEventListener(this));
- }
- if (input.type.toLowerCase() == 'radio' || input.type.toLowerCase() == 'checkbox') {
- Event.observe(input, 'click', this.onChange.bindAsEventListener(this));
- } else {
- Event.observe(input, 'change', this.onChange.bindAsEventListener(this));
- }
- }, this);
- }
- },
- onChange : function (ev) {
- Validation.isOnChange = true;
- Validation.validate(Event.element(ev),{
- useTitle : this.options.useTitles,
- onElementValidate : this.options.onElementValidate
- });
- Validation.isOnChange = false;
- },
- onSubmit : function(ev){
- if(!this.validate()) Event.stop(ev);
- },
- validate : function() {
- var result = false;
- var useTitles = this.options.useTitles;
- var callback = this.options.onElementValidate;
- try {
- if(this.options.stopOnFirst) {
- result = Form.getElements(this.form).all(function(elm) {
- if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
- return true;
- }
- return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
- }, this);
- } else {
- result = Form.getElements(this.form).collect(function(elm) {
- if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
- return true;
- }
- if (elm.hasClassName('validation-disabled')) {
- return true;
- }
- return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
- }, this).all();
- }
- } catch (e) {
- }
- if(!result && this.options.focusOnError) {
- try{
- Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
- }
- catch(e){
- }
- }
- this.options.onFormValidate(result, this.form);
- return result;
- },
- reset : function() {
- Form.getElements(this.form).each(Validation.reset);
- },
- isElementInForm : function(elm, form) {
- var domForm = elm.up('form');
- if (domForm == form) {
- return true;
- }
- return false;
- }
- }
- Object.extend(Validation, {
- validate : function(elm, options){
- options = Object.extend({
- useTitle : false,
- onElementValidate : function(result, elm) {}
- }, options || {});
- elm = $(elm);
- var cn = $w(elm.className);
- return result = cn.all(function(value) {
- var test = Validation.test(value,elm,options.useTitle);
- options.onElementValidate(test, elm);
- return test;
- });
- },
- insertAdvice : function(elm, advice){
- var container = $(elm).up('.field-row');
- if(container){
- Element.insert(container, {after: advice});
- } else if (elm.up('td.value')) {
- elm.up('td.value').insert({bottom: advice});
- } else if (elm.advaiceContainer && $(elm.advaiceContainer)) {
- $(elm.advaiceContainer).update(advice);
- }
- else {
- switch (elm.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- var p = elm.parentNode;
- if(p) {
- Element.insert(p, {'bottom': advice});
- } else {
- Element.insert(elm, {'after': advice});
- }
- break;
- default:
- Element.insert(elm, {'after': advice});
- }
- }
- },
- showAdvice : function(elm, advice, adviceName){
- if(!elm.advices){
- elm.advices = new Hash();
- }
- else{
- elm.advices.each(function(pair){
- if (!advice || pair.value.id != advice.id) {
- // hide non-current advice after delay
- this.hideAdvice(elm, pair.value);
- }
- }.bind(this));
- }
- elm.advices.set(adviceName, advice);
- if(typeof Effect == 'undefined') {
- advice.style.display = 'block';
- } else {
- if(!advice._adviceAbsolutize) {
- new Effect.Appear(advice, {duration : 1 });
- } else {
- Position.absolutize(advice);
- advice.show();
- advice.setStyle({
- 'top':advice._adviceTop,
- 'left': advice._adviceLeft,
- 'width': advice._adviceWidth,
- 'z-index': 1000
- });
- advice.addClassName('advice-absolute');
- }
- }
- },
- hideAdvice : function(elm, advice){
- if (advice != null) {
- new Effect.Fade(advice, {duration : 1, afterFinishInternal : function() {advice.hide();}});
- }
- },
- updateCallback : function(elm, status) {
- if (typeof elm.callbackFunction != 'undefined') {
- eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');
- }
- },
- ajaxError : function(elm, errorMsg) {
- var name = 'validate-ajax';
- var advice = Validation.getAdvice(name, elm);
- if (advice == null) {
- advice = this.createAdvice(name, elm, false, errorMsg);
- }
- this.showAdvice(elm, advice, 'validate-ajax');
- this.updateCallback(elm, 'failed');
- elm.addClassName('validation-failed');
- elm.addClassName('validate-ajax');
- if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
- var container = elm.up(Validation.defaultOptions.containerClassName);
- if (container && this.allowContainerClassName(elm)) {
- container.removeClassName('validation-passed');
- container.addClassName('validation-error');
- }
- }
- },
- allowContainerClassName: function (elm) {
- if (elm.type == 'radio' || elm.type == 'checkbox') {
- return elm.hasClassName('change-container-classname');
- }
- return true;
- },
- test : function(name, elm, useTitle) {
- var v = Validation.get(name);
- var prop = '__advice'+name.camelize();
- try {
- if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
- //if(!elm[prop]) {
- var advice = Validation.getAdvice(name, elm);
- if (advice == null) {
- advice = this.createAdvice(name, elm, useTitle);
- }
- this.showAdvice(elm, advice, name);
- this.updateCallback(elm, 'failed');
- //}
- elm[prop] = 1;
- if (!elm.advaiceContainer) {
- elm.removeClassName('validation-passed');
- elm.addClassName('validation-failed');
- }
- if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
- var container = elm.up(Validation.defaultOptions.containerClassName);
- if (container && this.allowContainerClassName(elm)) {
- container.removeClassName('validation-passed');
- container.addClassName('validation-error');
- }
- }
- return false;
- } else {
- var advice = Validation.getAdvice(name, elm);
- this.hideAdvice(elm, advice);
- this.updateCallback(elm, 'passed');
- elm[prop] = '';
- elm.removeClassName('validation-failed');
- elm.addClassName('validation-passed');
- if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
- var container = elm.up(Validation.defaultOptions.containerClassName);
- if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) {
- if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) {
- container.addClassName('validation-passed');
- } else {
- container.removeClassName('validation-passed');
- }
- container.removeClassName('validation-error');
- }
- }
- return true;
- }
- } catch(e) {
- throw(e)
- }
- },
- isVisible : function(elm) {
- while(elm.tagName != 'BODY') {
- if(!$(elm).visible()) return false;
- elm = elm.parentNode;
- }
- return true;
- },
- getAdvice : function(name, elm) {
- return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
- },
- createAdvice : function(name, elm, useTitle, customError) {
- var v = Validation.get(name);
- var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
- if (customError) {
- errorMsg = customError;
- }
- if (jQuery.mage.__){
- errorMsg = jQuery.mage.__(errorMsg);
- }
- advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'
- Validation.insertAdvice(elm, advice);
- advice = Validation.getAdvice(name, elm);
- if($(elm).hasClassName('absolute-advice')) {
- var dimensions = $(elm).getDimensions();
- var originalPosition = Position.cumulativeOffset(elm);
- advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px';
- advice._adviceLeft = (originalPosition[0]) + 'px';
- advice._adviceWidth = (dimensions.width) + 'px';
- advice._adviceAbsolutize = true;
- }
- return advice;
- },
- getElmID : function(elm) {
- return elm.id ? elm.id : elm.name;
- },
- reset : function(elm) {
- elm = $(elm);
- var cn = $w(elm.className);
- cn.each(function(value) {
- var prop = '__advice'+value.camelize();
- if(elm[prop]) {
- var advice = Validation.getAdvice(value, elm);
- if (advice) {
- advice.hide();
- }
- elm[prop] = '';
- }
- elm.removeClassName('validation-failed');
- elm.removeClassName('validation-passed');
- if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
- var container = elm.up(Validation.defaultOptions.containerClassName);
- if (container) {
- container.removeClassName('validation-passed');
- container.removeClassName('validation-error');
- }
- }
- });
- },
- add : function(className, error, test, options) {
- var nv = {};
- nv[className] = new Validator(className, error, test, options);
- Object.extend(Validation.methods, nv);
- },
- addAllThese : function(validators) {
- var nv = {};
- $A(validators).each(function(value) {
- nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
- });
- Object.extend(Validation.methods, nv);
- },
- get : function(name) {
- return Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
- },
- methods : {
- '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
- }
- });
- Validation.add('IsEmpty', '', function(v) {
- return (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v));
- });
- Validation.addAllThese([
- ['validate-no-html-tags', 'HTML tags are not allowed', function(v) {
- return !/<(\/)?\w+/.test(v);
- }],
- ['validate-select', 'Please select an option.', function(v) {
- return ((v != "none") && (v != null) && (v.length != 0));
- }],
- ['required-entry', 'This is a required field.', function(v) {
- return !Validation.get('IsEmpty').test(v);
- }],
- ['validate-number', 'Please enter a valid number in this field.', function(v) {
- return Validation.get('IsEmpty').test(v)
- || (!isNaN(parseNumber(v)) && /^\s*-?\d*(\.\d*)?\s*$/.test(v));
- }],
- ['validate-number-range', 'The value is not within the specified range.', function(v, elm) {
- if (Validation.get('IsEmpty').test(v)) {
- return true;
- }
- var numValue = parseNumber(v);
- if (isNaN(numValue)) {
- return false;
- }
- var reRange = /^number-range-(-?[\d.,]+)?-(-?[\d.,]+)?$/,
- result = true;
- $w(elm.className).each(function(name) {
- var m = reRange.exec(name);
- if (m) {
- result = result
- && (m[1] == null || m[1] == '' || numValue >= parseNumber(m[1]))
- && (m[2] == null || m[2] == '' || numValue <= parseNumber(m[2]));
- }
- });
- return result;
- }],
- ['validate-digits', 'Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.', function(v) {
- return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v);
- }],
- ['validate-digits-range', 'The value is not within the specified range.', function(v, elm) {
- if (Validation.get('IsEmpty').test(v)) {
- return true;
- }
- var numValue = parseNumber(v);
- if (isNaN(numValue)) {
- return false;
- }
- var reRange = /^digits-range-(-?\d+)?-(-?\d+)?$/,
- result = true;
- $w(elm.className).each(function(name) {
- var m = reRange.exec(name);
- if (m) {
- result = result
- && (m[1] == null || m[1] == '' || numValue >= parseNumber(m[1]))
- && (m[2] == null || m[2] == '' || numValue <= parseNumber(m[2]));
- }
- });
- return result;
- }],
- ['validate-range', 'The value is not within the specified range.', function(v, elm) {
- var minValue, maxValue;
- if (Validation.get('IsEmpty').test(v)) {
- return true;
- } else if (Validation.get('validate-digits').test(v)) {
- minValue = maxValue = parseNumber(v);
- } else {
- var ranges = /^(-?\d+)?-(-?\d+)?$/.exec(v);
- if (ranges) {
- minValue = parseNumber(ranges[1]);
- maxValue = parseNumber(ranges[2]);
- if (minValue > maxValue) {
- return false;
- }
- } else {
- return false;
- }
- }
- var reRange = /^range-(-?\d+)?-(-?\d+)?$/,
- result = true;
- $w(elm.className).each(function(name) {
- var validRange = reRange.exec(name);
- if (validRange) {
- var minValidRange = parseNumber(validRange[1]);
- var maxValidRange = parseNumber(validRange[2]);
- result = result
- && (isNaN(minValidRange) || minValue >= minValidRange)
- && (isNaN(maxValidRange) || maxValue <= maxValidRange);
- }
- });
- return result;
- }],
- ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) {
- return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v)
- }],
- ['validate-code', 'Please use only lowercase letters (a-z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.', function (v) {
- return Validation.get('IsEmpty').test(v) || /^[a-z]+[a-z0-9_]+$/.test(v)
- }],
- ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) in this field. No spaces or other characters are allowed.', function(v) {
- return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9]+$/.test(v)
- }],
- ['validate-alphanum-with-spaces', 'Please use only letters (a-z or A-Z), numbers (0-9) or spaces only in this field.', function(v) {
- return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9 ]+$/.test(v)
- }],
- ['validate-street', 'Please use only letters (a-z or A-Z), numbers (0-9), spaces and "#" in this field.', function(v) {
- return Validation.get('IsEmpty').test(v) || /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)
- }],
- ['validate-phoneStrict', 'Please enter a valid phone number (Ex: 123-456-7890).', function(v) {
- return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
- }],
- ['validate-phoneLax', 'Please enter a valid phone number (Ex: 123-456-7890).', function(v) {
- return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);
- }],
- ['validate-fax', 'Please enter a valid fax number (Ex: 123-456-7890).', function(v) {
- return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
- }],
- ['validate-date', 'Please enter a valid date.', function(v) {
- var test = new Date(v);
- return Validation.get('IsEmpty').test(v) || !isNaN(test);
- }],
- ['validate-date-range', 'Make sure the To Date is later than or the same as the From Date.', function(v, elm) {
- var m = /\bdate-range-(\w+)-(\w+)\b/.exec(elm.className);
- if (!m || m[2] == 'to' || Validation.get('IsEmpty').test(v)) {
- return true;
- }
- var currentYear = new Date().getFullYear() + '';
- var normalizedTime = function(v) {
- v = v.split(/[.\/]/);
- if (v[2] && v[2].length < 4) {
- v[2] = currentYear.substr(0, v[2].length) + v[2];
- }
- return new Date(v.join('/')).getTime();
- };
- var dependentElements = Element.select(elm.form, '.validate-date-range.date-range-' + m[1] + '-to');
- return !dependentElements.length || Validation.get('IsEmpty').test(dependentElements[0].value)
- || normalizedTime(v) <= normalizedTime(dependentElements[0].value);
- }],
- ['validate-email', 'Please enter a valid email address (Ex: johndoe@domain.com).', function (v) {
- //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
- //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
- return Validation.get('IsEmpty').test(v) || /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(v)
- }],
- ['validate-emailSender', 'Please use only visible characters and spaces.', function (v) {
- return Validation.get('IsEmpty').test(v) || /^[\S ]+$/.test(v)
- }],
- ['validate-password', 'Please enter 6 or more characters. Leading and trailing spaces will be ignored.', function(v) {
- var pass=v.strip(); /*strip leading and trailing spaces*/
- return !(pass.length>0 && pass.length < 6);
- }],
- ['validate-admin-password', 'Please enter 7 or more characters, using both numeric and alphabetic.', function(v) {
- var pass=v.strip();
- if (0 == pass.length) {
- return true;
- }
- if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) {
- return false;
- }
- return !(pass.length < 7);
- }],
- ['validate-cpassword', 'Please make sure your passwords match.', function(v) {
- var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0];
- var pass = false;
- if ($('password')) {
- pass = $('password');
- }
- var passwordElements = $$('.validate-password');
- for (var i = 0; i < passwordElements.size(); i++) {
- var passwordElement = passwordElements[i];
- if (passwordElement.up('form').id == conf.up('form').id) {
- pass = passwordElement;
- }
- }
- if ($$('.validate-admin-password').size()) {
- pass = $$('.validate-admin-password')[0];
- }
- return (pass.value == conf.value);
- }],
- ['validate-both-passwords', 'Please make sure your passwords match.', function(v, input) {
- var dependentInput = $(input.form[input.name == 'password' ? 'confirmation' : 'password']),
- isEqualValues = input.value == dependentInput.value;
- if (isEqualValues && dependentInput.hasClassName('validation-failed')) {
- Validation.test(this.className, dependentInput);
- }
- return dependentInput.value == '' || isEqualValues;
- }],
- ['validate-url', 'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)', function (v) {
- v = (v || '').replace(/^\s+/, '').replace(/\s+$/, '');
- return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))(\.[A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))*)(:(\d+))?(\/[A-Z0-9~](([A-Z0-9_~-]|\.)*[A-Z0-9~]|))*\/?(.*)?$/i.test(v)
- }],
- ['validate-clean-url', 'Please enter a valid URL (Ex: "http://www.example.com" or "www.example.com").', function (v) {
- return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
- }],
- ['validate-identifier', 'Please enter a valid URL Key (Ex: "example-page", "example-page.html" or "anotherlevel/example-page").', function (v) {
- return Validation.get('IsEmpty').test(v) || /^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/.test(v)
- }],
- ['validate-xml-identifier', 'Please enter a valid XML-identifier (Ex: something_1, block5, id-4).', function (v) {
- return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v)
- }],
- ['validate-ssn', 'Please enter a valid social security number (Ex: 123-45-6789).', function(v) {
- return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v);
- }],
- ['validate-zip-us', 'Please enter a valid zip code (Ex: 90602 or 90602-1234).', function(v) {
- return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);
- }],
- ['validate-zip-international', 'Please enter a valid zip code.', function(v) {
- //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v);
- return true;
- }],
- ['validate-date-au', 'Please use this date format: dd/mm/yyyy (Ex: "17/03/2006" for the 17th of March, 2006).', function(v) {
- if(Validation.get('IsEmpty').test(v)) return true;
- var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
- if(!regex.test(v)) return false;
- var d = new Date(v.replace(regex, '$2/$1/$3'));
- return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
- (parseInt(RegExp.$1, 10) == d.getDate()) &&
- (parseInt(RegExp.$3, 10) == d.getFullYear() );
- }],
- ['validate-currency-dollar', 'Please enter a valid $ amount (Ex: $100.00).', function(v) {
- // [$]1[##][,###]+[.##]
- // [$]1###+[.##]
- // [$]0.##
- // [$].##
- return Validation.get('IsEmpty').test(v) || /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
- }],
- ['validate-one-required', 'Please select one of the options above.', function (v,elm) {
- var p = elm.parentNode;
- var options = p.getElementsByTagName('INPUT');
- return $A(options).any(function(elm) {
- return $F(elm);
- });
- }],
- ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) {
- var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]');
- var error = 1;
- for(var i=0;i<inputs.length;i++) {
- if((inputs[i].type == 'checkbox' || inputs[i].type == 'radio') && inputs[i].checked == true) {
- error = 0;
- }
- if(Validation.isOnChange && (inputs[i].type == 'checkbox' || inputs[i].type == 'radio')) {
- Validation.reset(inputs[i]);
- }
- }
- if( error == 0 ) {
- return true;
- } else {
- return false;
- }
- }],
- ['validate-not-negative-number', 'Please enter a number 0 or greater in this field.', function(v) {
- if (Validation.get('IsEmpty').test(v)) {
- return true;
- }
- v = parseNumber(v);
- return !isNaN(v) && v >= 0;
- }],
- ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) {
- return Validation.get('validate-not-negative-number').test(v);
- }],
- ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) {
- if (Validation.get('IsEmpty').test(v)) {
- return true;
- }
- v = parseNumber(v);
- return !isNaN(v) && v > 0;
- }],
- ['validate-state', 'Please select State/Province.', function(v) {
- return (v!=0 || v == '');
- }],
- ['validate-new-password', 'Please enter 6 or more characters. Leading and trailing spaces will be ignored.', function(v) {
- if (!Validation.get('validate-password').test(v)) return false;
- if (Validation.get('IsEmpty').test(v) && v != '') return false;
- return true;
- }],
- ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) {
- // remove non-numerics
- var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
- if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
- && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
- if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
- return true;
- } else {
- return false;
- }
- }
- return validateCreditCard(v);
- }],
- ['validate-cc-type', 'Credit card number does not match credit card type.', function(v, elm) {
- // remove credit card number delimiters such as "-" and space
- elm.value = removeDelimiters(elm.value);
- v = removeDelimiters(v);
- var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
- if (!ccTypeContainer) {
- return true;
- }
- var ccType = ccTypeContainer.value;
- if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
- return false;
- }
- // Other card type or switch or solo card
- if (Validation.creditCartTypes.get(ccType)[0]==false) {
- return true;
- }
- // Matched credit card type
- var ccMatchedType = '';
- Validation.creditCartTypes.each(function (pair) {
- if (pair.value[0] && v.match(pair.value[0])) {
- ccMatchedType = pair.key;
- throw $break;
- }
- });
- if(ccMatchedType != ccType) {
- return false;
- }
- if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) {
- Validation.validate(ccTypeContainer);
- }
- return true;
- }],
- ['validate-cc-type-select', 'Card type does not match credit card number.', function(v, elm) {
- var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
- if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) {
- return true;
- }
- if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) {
- Validation.validate(ccNumberContainer);
- }
- return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer);
- }],
- ['validate-cc-exp', 'Incorrect credit card expiration date.', function(v, elm) {
- var ccExpMonth = v;
- var ccExpYear = $(elm.id.substr(0,elm.id.indexOf('_expiration')) + '_expiration_yr').value;
- var currentTime = new Date();
- var currentMonth = currentTime.getMonth() + 1;
- var currentYear = currentTime.getFullYear();
- if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
- return false;
- }
- return true;
- }],
- ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
- var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
- if (!ccTypeContainer) {
- return true;
- }
- var ccType = ccTypeContainer.value;
- if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
- return false;
- }
- var re = Validation.creditCartTypes.get(ccType)[1];
- if (v.match(re)) {
- return true;
- }
- return false;
- }],
- ['validate-ajax', '', function(v, elm) { return true; }],
- ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.', function (v) {
- if(v != '' && v) {
- return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);
- }
- return true;
- }],
- ['validate-css-length', 'Please input a valid CSS-length (Ex: 100px, 77pt, 20em, .5ex or 50%).', function (v) {
- if (v != '' && v) {
- return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v));
- }
- return true;
- }],
- ['validate-length', 'Text length does not meet the specified text range.', function (v, elm) {
- var reMax = new RegExp(/^maximum-length-[0-9]+$/);
- var reMin = new RegExp(/^minimum-length-[0-9]+$/);
- var result = true;
- $w(elm.className).each(function(name, index) {
- if (name.match(reMax) && result) {
- var length = name.split('-')[2];
- result = (v.length <= length);
- }
- if (name.match(reMin) && result && !Validation.get('IsEmpty').test(v)) {
- var length = name.split('-')[2];
- result = (v.length >= length);
- }
- });
- return result;
- }],
- ['validate-percents', 'Please enter a number lower than 100.', {max:100}],
- ['required-file', 'Please select a file.', function(v, elm) {
- var result = !Validation.get('IsEmpty').test(v);
- if (result === false) {
- ovId = elm.id + '_value';
- if ($(ovId)) {
- result = !Validation.get('IsEmpty').test($(ovId).value);
- }
- }
- return result;
- }],
- ['validate-cc-ukss', 'Please enter issue number or start date for switch/solo card type.', function(v,elm) {
- var endposition;
- if (elm.id.match(/(.)+_cc_issue$/)) {
- endposition = elm.id.indexOf('_cc_issue');
- } else if (elm.id.match(/(.)+_start_month$/)) {
- endposition = elm.id.indexOf('_start_month');
- } else {
- endposition = elm.id.indexOf('_start_year');
- }
- var prefix = elm.id.substr(0,endposition);
- var ccTypeContainer = $(prefix + '_cc_type');
- if (!ccTypeContainer) {
- return true;
- }
- var ccType = ccTypeContainer.value;
- if(['SS','SM','SO'].indexOf(ccType) == -1){
- return true;
- }
- $(prefix + '_cc_issue').advaiceContainer
- = $(prefix + '_start_month').advaiceContainer
- = $(prefix + '_start_year').advaiceContainer
- = $(prefix + '_cc_type_ss_div').down('.adv-container');
- var ccIssue = $(prefix + '_cc_issue').value;
- var ccSMonth = $(prefix + '_start_month').value;
- var ccSYear = $(prefix + '_start_year').value;
- var ccStartDatePresent = (ccSMonth && ccSYear) ? true : false;
- if (!ccStartDatePresent && !ccIssue){
- return false;
- }
- return true;
- }]
- ]);
- function removeDelimiters (v) {
- v = v.replace(/\s/g, '');
- v = v.replace(/\-/g, '');
- return v;
- }
- function parseNumber(v)
- {
- if (typeof v != 'string') {
- return parseFloat(v);
- }
- var isDot = v.indexOf('.');
- var isComa = v.indexOf(',');
- if (isDot != -1 && isComa != -1) {
- if (isComa > isDot) {
- v = v.replace('.', '').replace(',', '.');
- }
- else {
- v = v.replace(',', '');
- }
- }
- else if (isComa != -1) {
- v = v.replace(',', '.');
- }
- return parseFloat(v);
- }
- /**
- * Hash with credit card types which can be simply extended in payment modules
- * 0 - regexp for card number
- * 1 - regexp for cvn
- * 2 - check or not credit card number trough Luhn algorithm by
- * function validateCreditCard which you can find above in this file
- */
- Validation.creditCartTypes = $H({
- // 'SS': [new RegExp('^((6759[0-9]{12})|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})|(6333[0-9]{12})|(6334[0-4]\d{11})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
- 'SO': [new RegExp('^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
- 'SM': [new RegExp('(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
- 'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],
- 'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true],
- 'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true],
- 'DI': [new RegExp('^6(011|4[4-9][0-9]|5[0-9]{2})[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true],
- 'JCB': [new RegExp('^(3[0-9]{15}|(2131|1800)[0-9]{11})$'), new RegExp('^[0-9]{3,4}$'), true],
- 'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false]
- });
|