/* * 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.prototype = { initialize : function(form, options){ this.options = Object.extend({ onSubmit : true, stopOnFirst : false, immediate : false, focusOnError : true, useTitles : false, onFormValidate : function(result, form) {}, onElementValidate : function(result, elm) {} }, options || {}); this.form = $(form); if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false); if(this.options.immediate) { var useTitles = this.options.useTitles; var callback = this.options.onElementValidate; Form.getElements(this.form).each(function(input) { // Thanks Mike! Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback}); }); }); } }, onSubmit : function(ev){ if(!this.validate()) Event.stop(ev); }, validate : function() { var result = false; var useTitles = this.options.useTitles; var callback = this.options.onElementValidate; if(this.options.stopOnFirst) { result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }); } else { result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all(); } if(!result && this.options.focusOnError) { Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus() } this.options.onFormValidate(result, this.form); return result; }, reset : function() { Form.getElements(this.form).each(Validation.reset); } } Object.extend(Validation, { validate : function(elm, options){ options = Object.extend({ useTitle : false, onElementValidate : function(result, elm) {} }, options || {}); elm = $(elm); var cn = elm.classNames(); return result = cn.all(function(value) { var test = Validation.test(value,elm,options.useTitle); options.onElementValidate(test, elm); return test; }); }, 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) { var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error; advice = '
' switch (elm.type.toLowerCase()) { case 'checkbox': case 'radio': var p = elm.parentNode; if(p) { new Insertion.Bottom(p, advice); } else { new Insertion.After(elm, advice); } break; default: new Insertion.After(elm, advice); } advice = Validation.getAdvice(name, elm); } if(typeof Effect == 'undefined') { advice.style.display = 'block'; } else { new Effect.Appear(advice, {duration : 1 }); } } elm[prop] = true; elm.removeClassName('validation-passed'); elm.addClassName('validation-failed'); return false; } else { var advice = Validation.getAdvice(name, elm); if(advice != null) advice.hide(); elm[prop] = ''; elm.removeClassName('validation-failed'); elm.addClassName('validation-passed'); 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)); }, getElmID : function(elm) { return elm.id ? elm.id : elm.name; }, reset : function(elm) { elm = $(elm); var cn = elm.classNames(); cn.each(function(value) { var prop = '__advice'+value.camelize(); if(elm[prop]) { var advice = Validation.getAdvice(value, elm); advice.hide(); elm[prop] = ''; } elm.removeClassName('validation-failed'); elm.removeClassName('validation-passed'); }); }, 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 == null) || (v.length == 0)); // || /^\s+$/.test(v)); }); Validation.addAllThese([ ['required', 'Dit is een verplicht veld', function(v) { return !Validation.get('IsEmpty').test(v); }], ['validate-number', 'Vul een correct cijfer in dit veld in', function(v) { return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v)); }], ['validate-digits', 'Gebruik alleen cijfers in dit veld. Vermijd spaties en andere karakter zoals punten en komma's.', function(v) { return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v); }], ['validate-alpha', 'Gebruik alleen letters (a-z) in dit veld', function (v) { return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v) }], ['validate-alphanum', 'Gebruik alleen letters (a-z) of cijfers (0-9) in dit veld. Geen spatied of andere karakters toegestaan.', function(v) { return Validation.get('IsEmpty').test(v) || !/\W/.test(v) }], ['validate-date', 'Vul een correcte datum in.', function(v) { var test = new Date(v); return Validation.get('IsEmpty').test(v) || !isNaN(test); }], ['validate-email', 'Vul een correct email adres in (test@test.nl)', function (v) { return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v) }], ['validate-url', 'Vul een correcte URL in (http://www.test.nl)', function (v) { return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v) }], ['validate-date-au', 'Gebruik dit format voor de datum: dd/mm/jjjj. Bijvoorbeeld 17/03/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', 'Vul een correct bedrag in.', 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-selection', 'Maak een keuze.', function(v,elm){ return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v); }], ['validate-one-required', 'Kieze een van de bovenstaande opties', function (v,elm) { var p = elm.parentNode; var options = p.getElementsByTagName('INPUT'); return $A(options).any(function(elm) { return $F(elm); }); }] ]);children's printable of footprints in the sand
printable thank you card for brownies
printable colorado state tax forms 2008
printable positive behavior chart
wild west word flash card printables
hipster address book template printable
printable cvs photo coupons cvs store
printable graduation ceremony program samples
printable jungle book character masks
round yellow crane printable invitations
printable templete gingerbread house flap book
printable disney bookmarks holidays
printable free power of atorney forms
printable pictures of arthropods
printable attribute block activities
printable shampoo and conditioner coupons
nys ela test 7th grade 2009 printable
$20 target pharmacy gift card coupon printable
free printable grocery shopping
deck of playing cards pdf printable
printable simpsons colouring pages
free printable your special cards
celtic fc cross stich printable pattern
printable morning routine flashcards
reading response journals printables
wicked witch of the west printable pictures
printable worksheets for counting money
free onine printable birthday cards
free printable chinese auction tickets
printable discount tickets for internationa spy museum
resume outline templates printable
5.5 x 8.5 printable tab dividers
washington state legal printable agreement forms
easy printable 3.5 dnd character sheet
printable softbball score sheets
clothes theme printables for kindergarten
printable elementary density worksheet
birthday countdown calendar printable
printable healthy choice soup coupons
free printable mother's day coupons
printable greeting cards far side
valentine printable activities
fruit coloring pages printable
"chain reaction" +printable +word +games +book
famous footweat in-store printable coupon
free printable teen invitations
printable thematic snowman coloring pages
printable wake up lyrics by hilary duff
baby congratulations printable cards
free printable irish birthday cards
printable coupons for groceries and household items
printable drawing books for kids
jeff gordon eagle scout letter
printable padi recreational dive planner
printable body central coupons
printable chevrolet birthday wrapping paper
printable nfl schedule pdf 2010
printable riddles about trains
printable door signs kids bathroom
printable july 4th printable quiz
free printable coordinate grid
1 2006 2007 calendar free page printable
printable invitations download
recycle games for kids printable
free 8th grade printable worksheets
free printable christmas recitations
ice cream acrostic template printables
printable multiplication facts test
printable sheet music for beginner keyboarders
printable tv guide listings for 2010-2011
free printable pics of beaches
free printable party invitations with pictures
euro 2008 match schedule printable version
free printable income tax form
ballet folklorico printable pictures
learning style inventory freshman printable
free printable graduation envelopes
printable address book computer
printable rug doctor shampoo coupons
letter to purchase real estate
printable cincinnati bengal stencils
cvs new prescription coupon june 2010 printable
printable comprehension stories with questions grade 7
jungle or safari animal printables
basketball scoe sheets printable
printable spanish number games
find free online printables party favors
printable target job application
angel prayers printable download bookmarkers