/**
* Remplace les classe des inputs pour s'accorder avec les masks et la 
* validation du formulaire
* @author nbaccelli
*/
Element.extend({
  renameClass: function (oldClass, newClass) {
	this.removeClass(oldClass);
	this.addClass(newClass);
	return true;
  }
});

var ValidForm2 = new Class({

	options : {
		errorColor : '#FF9393',
		defaultColor: '',
		fadingTime : '1000',
		regexp : {
			required : /[^ .*]/,
			alpha : /^[a-z ._-]+$/i,
			alphanum : /^[a-z0-9 ._-]+$/i,
			digit : /^[-+]?[0-9]+$/,
			nodigit : /^[^0-9]+$/,
			number : /^[-+]?\d*\.?\d+$/,
			email : /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i,
			phone : /^[\d\s ().-]+$/,
			url : /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i
		}
	},
	
	initialize: function(form, options)
	{
	    this.form = $(form);
		this.setOptions(options);
		this.regex = ['length'];
		this._register();
	},
	
	_register: function()
	{
		var regex = new Hash(this.options.regexp);

		regex.each(function(el, key) {
			this.regex.push(key);
		}, this);
		
		this.form.getElements("*[class*=validate]").each(function(el) {
			
		    if(el.type=='checkbox')
		    {
		        var monId = el.getProperty('id');
		        
		        var elems = $$("label[for*="+monId+"]");
		    
		        el.defaultColor = elems[0].getStyle('color');
		    }
		    else
		    {
		        el.defaultColor = el.getStyle('background-color');
		    }
		    
		    var classes = el.getProperty("class").split(' ');
			el.validation = [];
			
			classes.each(function(classX) {
				if(classX.match(/^validate(\[.+\])$/))
				{
					var validators = eval(classX.match(/^validate(\[.+\])$/)[1]);
					for(var i = 0; i < validators.length; i++)
					{
						el.validation.push(validators[i]);
					}
					
					el.addEvent('keyup',function()
					{
						this._manageError(el);
					}.bind(this));
					
					el.addEvent('blur',function()
					{
						this._manageError(el);
					}.bind(this));
					
					el.addEvent('change',function()
					{
						this._manageError(el);
					}.bind(this));
				}
			}, this);
		}, this);
	},
	
	_manageError: function(el)
	{		
	    var isValid = this._validate(el);
	    
		if ((
				(!isValid && el.validation.contains('required') && el.getProperty('disabled') == false) || 
				(!el.validation.contains('required') && el.value && !isValid)
			))
		{ 
		    this._showError(el);
			return false;
		}
		else if ((isValid || (!el.validation.contains('required') && !el.value) || el.getProperty('disabled') == true)) 
		{
		    this._removeError(el);
			return true;
		}
	},
	
	
	
	_onSubmit: function()
	{
	    
	    var valide = true;
	    
	    this.form.getElements("*[class*=validate]").each(function(el) {
	       if(!this._manageError(el))
	       {
	           valide = false;
	       }
	    }, this);

	    return valide;
	},
	
	
	
	
	_showError: function(el)
	{
		if(el.type == "checkbox")
		{
		    var monId = el.getProperty('id');
		    $$("label[for*="+monId+"]").setStyle('color',this.options.errorColor);
		}
		else
		{
		    el.setStyle('background-color',this.options.errorColor);
		}

	},
	
	_removeError: function(el)
	{
		if(el.type == "checkbox")
		{
		    var monId = el.getProperty('id');
		    $$("label[for*="+monId+"]").setStyle('color',el.defaultColor);
		}
		else
		{
		    el.setStyle('background-color',el.defaultColor);
		}
	},
	
	
	_validate: function(el) {
		el.errors = [];
		el.isOk = true;
		//On valide l'element qui n'est pas un radio ni checkbox
		el.validation.each(function(rule) {
			if(this._isChildType(el)) {
				if (this._validateGroup(el) == false) {
					el.isOk = false;
				}
			} else {
				var ruleArgs = [];
				if(rule.match(/^.+\[/)) {
					var ruleMethod = rule.split('[')[0];
					var ruleArgs = eval(rule.match(/^.+(\[.+\])$/)[1].replace(/([A-Z]+)/i, "'$1'"));
				} else var ruleMethod = rule;

				if (this.regex.contains(ruleMethod)) {
					if (this._validateRegex(el, ruleMethod, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'confirm') {
					if (this._validateConfirm(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'differs') {
					if (this._validateDiffers(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (el.get('tag') == "select" || el.type == "checkbox") {
					if (this._simpleValidate(el) == false) {
						el.isOk = false;
					}
				}
			}				
		}, this);

		if (el.isOk) return true;
		else return false;
	},
	
	_isChildType: function(el) {
		var elType = el.type.toLowerCase();
		if((elType == "radio")) return true;
		return false;
	},
	
	_validateDiffers: function(el,ruleArgs) {
		var confirm = ruleArgs[0];
		if(el.value == this.form[confirm].value){
			return false;
		}
		return true;
	},
	
	_validateConfirm: function(el,ruleArgs) {
		if (el.validation.contains('required') == false) {
			 //el.validation.push('required');
		}
		var confirm = ruleArgs[0];
		if(el.value != this.form[confirm].value){
			return false;
		}
		return true;
	},
	
	_validateRegex: function(el, ruleMethod, ruleArgs) {
		var msg = "";
		if (ruleArgs[1] && ruleMethod == 'length') {
			if (ruleArgs[1] == -1) {
				this.options.regexp.length = new RegExp("^.{"+ ruleArgs[0] +",}$");
			} else {
				this.options.regexp.length = new RegExp("^.{"+ ruleArgs[0] +","+ ruleArgs[1] +"}$");
			}
		} else if (ruleArgs[0]) {
			this.options.regexp.length = new RegExp("^.{0,"+ ruleArgs[0] +"}$");
		} else {
		}
		if (ruleArgs[1] && ruleMethod == 'digit') {
			var regres = true;
			if (!this.options.regexp.digit.test(el.value)) {
				regres = false;
			}
			if (ruleArgs[1] == -1) {
				if (el.value >= ruleArgs[0]) var valueres = true; else var valueres = false;
			} else {
				if (el.value >= ruleArgs[0] && el.value <= ruleArgs[1]) var valueres = true; else var valueres = false;
			}
			if (regres == false || valueres == false) {
				el.errors.push(msg);
				return false;
			}
		} else if (this.options.regexp[ruleMethod].test(el.value) == false)  { 
			el.errors.push(msg);
			return false;
		}
		return true;
	},
	
	_simpleValidate: function(el) {
		if (el.getTag() == 'select' && (el.value == el.options[0].value)) {
			return false;
		} else if (el.type == "checkbox" && el.checked == false) {
			return false;
		}
		return true;
	},
	
    _validateGroup: function(el) {
        el.errors = [];
        var nlButtonGroup = this.form[el.getProperty("name")];
        el.group = nlButtonGroup;
        var cbCheckeds = false;
        
        for(var i = 0; i < nlButtonGroup.length; i++) {
            if(nlButtonGroup[i].checked) {
                cbCheckeds = true;
            }
         }
         if(cbCheckeds == false) {
            return false;
         } 
         else {
            return true;
         }
     }
     
    });

ValidForm2.implement(new Options());