/* * 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 = ' schalter (Ulme.Art.toLowerCase ()) {Fall 'Kontrollkästchen': Fall 'Radio': var p = Ulme.parentNode; if(p) { neue Einfügung.Bottom(p, advice); } else { neue Einfügung.Nach (Ulme, Rat); } Pause; Standard: neue Einfügung.Nach (Ulme, Rat); } Rat = Validierung.getAdvice (Name, Ulme); } if(Typ der Wirkung == 'undefiniert') { Beratung.Stil.display = 'block'; } else { neuer Effekt.Erscheinen (Hinweis, {Dauer: 1 }); } } Ulme [Stütze] = wahr; Ulme.removeClassName ('Validierung bestanden'); Ulme.addClassName ('Validierung fehlgeschlagen'); falsch zurückgeben; } else { var advice = Validierung.getAdvice(Name, Ulme); wenn(Rat != null) Beratung.verstecken(); Ulme [Stütze] = "; Ulme.removeClassName ('Validierung fehlgeschlagen'); Ulme.addClassName('Validierung bestanden'); true zurückgeben; } } catch(e) { throw(e) } }, IsVisible : Funktion(Ulme) { while(Ulme.tagName != 'KÖRPER') { wenn(!$(Ulme).visible ()) gibt false zurück; Ulme = Ulme.Elternknoten; } true zurückgeben; }, getAdvice: Funktion (Name, Ulme) { Rückgabe $ ('advice-' + Name + '-' + Validierung.getElmID(elm)) || $('Beratung-' + Validierung.getElmID(elm)); }, getElmID : Funktion(elm) { Rückgabe elm.id ? elm.id : elm.name ; }, Zurücksetzen: Funktion (Ulme) { Ulme = $ (Ulme); var cn = Ulme.Klassennamen(); cn.jeder (Funktion (Wert) { var prop = '__advice'+ Wert.camelize (); if (Ulme [Stütze]) { var Hinweis = Validierung.getAdvice(Wert, Ulme); Rat.hide(); Ulme[prop] = "; } Ulme.removeClassName ('Validierung fehlgeschlagen'); Ulme.removeClassName ('Validierung bestanden'); }); }, hinzufügen: Funktion (Klassenname, Fehler, Test, Optionen) { var nv = {}; nv[Klassenname] = neuer Validator (Klassenname, Fehler, Test, Optionen); Objekt.erweitern(Validierung.methoden, nv); }, addAllThese : Funktion (Validatoren) { var nv = {}; $A (Validatoren).jede (Funktion (Wert) { nv [Wert [0]] = neuer Validator (Wert [0], Wert [1], Wert [2], (Wert.länge> 3 ? wert[3] : {})); }); Objekt.erweitern(Validierung.methoden, nv); }, get : function(name) { Validierung zurückgeben.methoden [Name] ? Validierung.methoden [Name] : Validierung.methoden ['_LikeNoIDIEverSaw_']; }, Methoden: { '_LikeNoIDIEverSaw_' : neuer Validator ('_LikeNoIDIEverSaw_',",{}) } }); Validierung.add ('Leer', ", Funktion (v) { Rückgabe ((v == null) |/ (v.Länge == 0)); // || /^\ s+$/.test(v)); }); Validierung.addAllThese([ ['erforderlich', 'Das ist ein Pflichtfeld', function(v) { return !Validierung.holen Sie sich('isEmpty').test(v); }], ['validate-number', 'Bitte tragen Sie eine Nummer ein', function(v) { Validierung zurückgeben.holen Sie sich('isEmpty').prüfung (v) || (!isNaN(v) && !/^\r+$/.test(v)); }], ['validate-digits', 'Bitte tragen Sie eine Nummer ohne Komma oder Punkt ein', function(v) { Validierung zurückgeben.holen Sie sich('isEmpty').prüfung (v) || !/[^\d]/.test(v); }], ['validate-alpha', 'Bitte nutzen Sie nur Buchstaben (a-z)', Funktion (v) { Validierung zurückgeben.holen Sie sich('isEmpty').testen Sie(v) || / ^[a-zA-Z]+$/.test(v) }], ['validate-alphanum', 'Bitte nutzen Sie hier nur Buchstaben (a-z) oder Zahlen (0-9) nur in diesem Feld. Leer- oder andere Zeichen sind nicht erlaubt', function(v) { Validierung zurückgeben.holen Sie sich('isEmpty').prüfung (v) || !/\ Mit /.test(v) }], ['Validierungsdatum', 'Bitte tragen Sie ein korrektes Datum ein', Funktion (v) { var test = neues Datum (v); Validierung zurückgeben.holen Sie sich('isEmpty').prüfung (v) || !isNaN(test); }], ['validate-email', 'Bitte tragen Sie eine gültige E-Mail-Adresse ein ()', function (v) { Validierung zurückgeben.holen Sie sich('isEmpty').testen Sie (v) || / \w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v) }], ['validate-url', 'Bitte tragen Sie eine gültige URL ein (http://www.test.de )', Funktion (v) { Validierung zurückgeben.holen Sie sich('isEmpty').testen Sie (v| // / ^(http / https | ftp): \/\/(([AZ0-9] [Az0-9_-]*)(\.[AZ0-9][AZ0-9_-]*)+)(:(\ d+))?\/?/i.test(v) }], ['validate-date-au', 'Bitte tragen Sie das Datum so ein: TT/MM/jjjj.(Beispiel 17.03.2006)', Funktion(v) { if(Validierung.holen Sie sich('isEmpty').test (v)) gibt wahr zurück; var regex = / ^(\d{2})\/(\d{2})\/(\d{4})$/; wenn(!regulärer Ausdruck.test (v)) gibt false zurück; var d = neues Datum (v.ersetzen (regulärer Ausdruck, '$2/$1/$3')); return ( parseInt(Regulärer Ausdruck.$2, 10) == (1+ d.getMonth()) ) && (parseInt(Regulärer Ausdruck.$1, 10) == d.getDate()) && (parseInt(Regulärer Ausdruck.$3, 10) == d.getFullYear() ); }], ['validate-currency-dollar', 'Bitte tragen Sie einen gültigen Betrag ein ($100.00)', Funktion(v) { // [$]1[##][,###]+[.##] // [$]1###+[.##] // [$]0.## // [$].## Validierung zurückgeben.holen Sie sich('isEmpty').testen Sie (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', 'Bitte treffen Sie eine Auswahl', function(v,elm){ return elm.optionen ? ulme.Ausgewählter Index > 0 : !Validierung.holen Sie sich('isEmpty').test(v); }], ['validate-one-required', 'Bitte füllen Sie min. 1 Feld aus', Funktion (v,Ulme) { var p = Ulme.Elternknoten; var Optionen = p.getElementsByTagName ('EINGABE'); Rückgabe $ A (Optionen).beliebig (Funktion (Ulme) {Rückgabe $ F (Ulme); }); }] ]);