//hlx.forms: provee la funcionalidad de validacion de diversos formularios
hlx.forms = {
	addValidations: function(param){
		if(!this.validations) this.validations = new Array();
		this.validations.push(eval(param));
	},
    validate: function(form, id) {
        var hasErrors = false;
		var v = this._getValidationObject(id);
		for(i=0;i<v.length;i++){	
            var element = $(v[i].id);
			var type = v[i].type;
			var nombre = v[i].nombre;
			if(!element) continue;
            var name = element.id;
			if(name.indexOf(id)==-1) continue;
            var tipo = type.split('-');
			this.summary.hide(element);
            for(x=0;x<tipo.length;x++){
                var partial = tipo[x];
                switch(partial)
                {
                    case 'O':
						if(!this.required.is_valid(element)){
							this.summary.add(element, this._getMessage('error.Obligatorio', nombre));
							hasErrors = true;
						}
						else this.summary.hide(element);
                        break;
                    case 'E':
                        if(!this.email.is_valid(element)){
							this.summary.add(element, this._getMessage('error.Email', nombre));
							hasErrors = true;
						}
						else this.summary.hide(element);
                        break;
                   case 'N':
						if(!this.numerico.is_valid(element)){
							this.summary.add(element, this._getMessage('error.Numerico', nombre));
							hasErrors = true;
						}
						else this.summary.hide(element);
                        break;
                }
            }
			this.summary.show(element);
        }
		return !hasErrors;
    },
    prepareForms: function(){
        //Tots dos events son necessaris. 
        //bug: en safari no funciona correctament per la tecla INTRO (num keyboard)
        Event.observe(document, 'keypress', function(e){if(e && e.keyCode && e.keyCode==Event.KEY_RETURN) Event.stop(e);}, false);
        document.onkeypress = function(e){if(e && e.keyCode && e.keyCode==Event.KEY_RETURN){return false; }};
    },
    setMsg: function(param){
        var hash = eval(param);
        if(!this.msg) this.msg = hash;
        else{
            for(var i=0;hash && i<hash.length;i++){
                if(this.msg[hash[i].name]==null) this.msg[hash[i].name] = hash[i];
            }
        }
    },
	_getValidationObject: function(id){
	    if(this.validations && this.validations.length>0){
		    for(i=0;i<this.validations.length;i++){	
			    if(this.validations[i][id]!=null) return this.validations[i][id];
		    }
        }
	},
	_getMessage:function(name, replace){
	    var m = '';
	    if(this.msg && this.msg[name]){
	        if(typeof(replace)=='string') return this.msg[name].replace('{0}', replace);
	        if(typeof(replace)=='object' && replace.length){
	            var tmp = this.msg[name];
	            for(var i=0;i<replace.length;i++){
	                tmp = tmp.replace('{' + i + '}', replace[i]);
	            }
	            return tmp;
	        }
	    }
	    return '<!--hlx.forms.message.js: ' + name + ' undefined-->';
	}
}

//hlx.forms.required: valida campos obligatorios
hlx.forms.required = {
	is_valid: function(field){
		if(!field.type)	return true;
		switch(field.type){
			case 'textarea':
			case 'password':
			case 'text':
				return (field.value.length>0);
				break;
			case 'checkbox':
				return field.checked;
			break;
			case 'select-one':
				return field.value.substring(0,1)!="@";
				break;
			case 'select-multiple':
				var selected = false;
				for(var i=0;i<field.options.length && !selected;i++){
					selected = field.options[i].selected;
				}
				return selected
				break;
			case 'radio':
			    //hack: field.form per recuperar tots els radiobuttons amb el mateix id
				var group = field.form.elements[field.id];
				var selected = false;
				for(var i=0;i<group.length && !selected;i++){
					selected = group[i].checked;
				}
				return selected;
				break;
		}
		return true;
	}
}

//hlx.forms.email: valida campos de correo electronico, solo aplica a campos tipo text
hlx.forms.email = {
	is_valid: function(field){
		var email_expression=/^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$/;
		if(!field.type)	return true;
		switch(field.type){
		    case 'textarea':
			case 'text':
				return email_expression.test(field.value);
				break;
		}
		return true;
	}
}

//hlx.forms.numerico: valida campos numericos solo aplica a campos text, textarea i password.
hlx.forms.numerico = {
   is_valid: function(field){
		if(!field.type)	return true;
		switch(field.type){
			case 'textarea':
			case 'password':
			case 'text':
				return (field.value!='' && field.value!=null && !isNaN(field.value));
				break;
		}
		return true;
	}
}

//hlx.forms.summary: provee la funcionalidad de mostrar, ocultar el mensaje de validacion
hlx.forms.summary = {
    PREFIX_ERROR : 'e_',
    PREFIX_CONTAINER : 'c_',
    CSS_ERROR : 'hlx_forms_error',
    
	add: function(field, message){
	    if(!field || !field.id) return;
		var error_div = $(this.PREFIX_ERROR + field.id);
		message += '<br/>';
		if(error_div) { new Insertion.Bottom(error_div, message); }
		else{
			var container = $(this.PREFIX_CONTAINER + field.id);
			var	element = document.createElement('div');
			element.id = this.PREFIX_ERROR + field.id;
			element.className = this.CSS_ERROR;
			element.style.display = 'none';
			new Insertion.Bottom(element, message);
    		container.appendChild(element);
		}
	},
	show: function(field){
	    if(!field || !field.id) return;
		var error_div = $(this.PREFIX_ERROR + field.id);
		if(error_div) error_div.style.display='block';
	},
	hide: function(field){
	    if(!field || !field.id) return;
		var summary = $(this.PREFIX_ERROR + field.id);
		if(summary)	Element.remove(summary);
	}
}
