var fValidator = new Class({options: {msgContainerTag: "div",msgClass: "fValidator-msg",styleNeutral: {"background-color": "#ffc", "border-color": "#cc0"},		styleInvalid: {"background-color": "#fcc", "border-color": "#c00"},	styleValid: {"background-color": "#cfc", "border-color": "#0c0"},
required: {type: "required", re: /[^.*]/, msg: "Campo requerido."},
alpha: {type: "alpha", re: /^[a-z ._-]+$/i, msg: "Ingrese Letras solamente."},
alphanum: {type: "alphanum", re: /^[a-z0-9 ._-]+$/i, msg: "Ingrese Numeros Solamente."},
integer: {type: "integer", re: /^[-+]?\d+$/, msg: "Ingrese un Numero Entero Valido."},
real: {type: "real", re: /^[-+]?\d*\.?\d+$/, msg: "Ingrese un Numero Valido."},
date: {type: "date", re: /^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$/, msg: "Ingrese una Fecha Valida (mm/dd/aaaa)."},
email: {type: "email", re: /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i, msg: "Ingrese un Email Valido."},
phone: {type: "phone", re: /^[\d\s ().-]+$/, msg: "Ingrese un Numero de Telefono Valido."},
url: {type: "url", re: /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i, msg: "Ingrese una URL Valida."},confirm: {type: "confirm", msg: "Los Contraseñas ingresadas no coinciden."},
onValid: Class.empty,onInvalid: Class.empty},initialize: function(form, options) {this.form = $(form);this.setOptions(options);this.fields = this.form.getElements("*[class^=fValidate]");this.validations = [];this.fields.each(function(element) {if(!this._isChildType(element)) element.setStyles(this.options.styleNeutral);element.cbErr = 0;var classes = element.getProperty("class").split(' ');classes.each(function(klass) {if(klass.match(/^fValidate(\[.+\])$/)) {var aFilters = eval(klass.match(/^fValidate(\[.+\])$/)[1]);for(var i = 0; i < aFilters.length; i++) {if(this.options[aFilters[i]]) this.register(element, this.options[aFilters[i]]);if(aFilters[i].charAt(0) == '=') this.register(element, $extend(this.options.confirm, {idField: aFilters[i].substr(1)}));}}}.bind(this));}.bind(this));this.form.addEvents({"submit": this._onSubmit.bind(this),"reset": this._onReset.bind(this)});},register: function(field, options) {field = $(field);this.validations.push([field, options]);field.addEvent("blur", function() {this._validate(field, options);}.bind(this));},_isChildType: function(el) {var elType = el.type.toLowerCase();if((elType == "radio") || (elType == "checkbox")) return true;return false;},_validate: function(field, options) {switch(options.type) {case "confirm":if($(options.idField).getValue() == field.getValue()) this._msgRemove(field, options);else this._msgInject(field, options);break;default:if(options.re.test(field.getValue())) this._msgRemove(field, options);else this._msgInject(field, options);}},_validateChild: function(child, options) {var nlButtonGroup = this.form[child.getProperty("name")];var cbCheckeds = 0;var isValid = true;for(var i = 0; i < nlButtonGroup.length; i++) {if(nlButtonGroup[i].checked) {cbCheckeds++;if(!options.re.test(nlButtonGroup[i].getValue())) {isValid = false;break;}}}if(cbCheckeds == 0 && options.type == "required") isValid = false;if(isValid) this._msgRemove(child, options);else this._msgInject(child, options);},_msgInject: function(owner, options) {if(!$(owner.getProperty("id") + options.type +"_msg")) {var msgContainer = new Element(this.options.msgContainerTag, {"id": owner.getProperty("id") + options.type +"_msg", "class": this.options.msgClass}).setHTML(options.msg).setStyle("opacity", 0).injectAfter(owner).effect("opacity", {duration: 500,transition: Fx.Transitions.linear}).start(0, 1); owner.cbErr++; this._chkStatus(owner, options);}},_msgRemove: function(owner, options, isReset) {isReset = isReset || false;if($(owner.getProperty("id") + options.type +"_msg")) {var el = $(owner.getProperty("id") + options.type +"_msg");el.effect("opacity", {duration: 500,transition: Fx.Transitions.linear,onComplete: function() {el.remove()}}).start(1, 0);if(!isReset) {owner.cbErr--;this._chkStatus(owner, options);}}},_chkStatus: function(field, options) {if(field.cbErr == 0) {field.effects({duration: 500, transition: Fx.Transitions.linear}).start(this.options.styleValid);
this.fireEvent("onValid", [field, options], 50);} else {field.effects({duration: 500, transition: Fx.Transitions.linear}).start(this.options.styleInvalid);this.fireEvent("onInvalid", [field, options], 50);}},_onSubmit: function(event) {event = new Event(event);var isValid = true;this.validations.each(function(array) {if(this._isChildType(array[0])) this._validateChild(array[0], array[1]);else this._validate(array[0], array[1]);if(array[0].cbErr > 0) isValid = false;}.bind(this));if(!isValid) event.stop();return isValid;},_onReset: function() {this.validations.each(function(array) {if(!this._isChildType(array[0])) array[0].setStyles(this.options.styleNeutral);array[0].cbErr = 0;this._msgRemove(array[0], array[1], true);}.bind(this));}});fValidator.implement(new Events);fValidator.implement(new Options);

