/**
 * @author felip
 */
 
 

function echeck(str) {

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){
		   //alert("Invalid E-mail ID")
		   return false
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   //alert("Invalid E-mail ID")
		   return false
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    //alert("Invalid E-mail ID")
		    return false
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    //alert("Invalid E-mail ID")
		    return false
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		    //alert("Invalid E-mail ID")
		    return false
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    //alert("Invalid E-mail ID")
		    return false
		 }
		
		 if (str.indexOf(" ")!=-1){
		    //alert("Invalid E-mail ID")
		    return false
		 }

 		 return true					
	}
 
 

 if(!VAL){
         var VAL = {
		 	validations: []
		 }
 }
 
 
 if(typeof Array.prototype.push != "function"){
    Array.prototype.push = ArrayPush;
    function ArrayPush(value){
        this[this.length] = value;
    }
}


 // ---
/*
        ELO - Encapsulated Load Object, by Robert Nyman, http://www.robertnyman.com
        Inspired and influenced by Dean Edwards, Matthias Miller, and John Resig: http://dean.edwards.name/weblog/2006/06/again/
*/
var ELO = {
        loaded : false,
        timer : null,
        functionsToCallOnload : [], // Type in functions as strings here. e.g. "myFunction()"
        init : function (){
                if(ELO.loaded) return;
                ELO.loaded = true;
                ELO.load();
        },
       
        load : function (){
                if(this.timer){
                        clearInterval(this.timer);
                }
                for(var i=0; i<this.functionsToCallOnload.length; i++){
                        try{
                                eval(this.functionsToCallOnload[i]);
                        }
                        catch(e){
                                // Handle error here
                        }
                }
        }
};
// ---
/* Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
        if(document.getElementById){
                document.write("<script id=\"ieScriptLoad\" defer src=\"javascript:void(0)\"><\/script>");
            document.getElementById("ieScriptLoad").onreadystatechange = function() {
                if (this.readyState == "complete") {
                    ELO.init();
                }
            };
        }
/*@end @*/
// ---
/* Mozilla/Opera 9 */
if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", ELO.init, false);
}
// ---
/* Safari */
if(navigator.userAgent.search(/WebKit/i) != -1){
    ELO.timer = setInterval(function (){
                if(document.readyState.search(/loaded|complete/i) != -1) {
                        ELO.init();
                }
        }, 10);
}
// ---
/* Other web browsers */
window.onload = ELO.init;

/*
        Copyright Robert Nyman, http://www.robertnyman.com
        Free to use if this text is included
*/
function getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue){
        var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
        var oCurrent;
        var oAttribute;
        for(var i=0; i<arrElements.length; i++){
                oCurrent = arrElements[i];
                oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
                if(typeof oAttribute == "string" && oAttribute.length > 0){
                        if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
                                arrReturnElements.push(oCurrent);
                        }
                }
        }
        return arrReturnElements;
}


function insertAfter(newElement,targetElement) {
  var parent = targetElement.parentNode;
  if (parent.lastChild == targetElement){
    parent.appendChild(newElement);
  }
  else{
    parent.insertBefore(newElement,targetElement.nextSibling);
  }
}

function getElementsByClass(searchClass,node,tag) {
        var classElements = new Array();
        if ( node == null )
                node = document;
        if ( tag == null )
                tag = '*';
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
                if ( pattern.test(els[i].className) ) {
                        classElements[j] = els[i];
                        j++;
                }
        }
        return classElements;
}
 
function addClassName(oElm, strClassName){
        var strCurrentClass = oElm.className;
        if(!new RegExp(strClassName, "i").test(strCurrentClass)){
                oElm.className = strCurrentClass + ((strCurrentClass.length > 0)? " " : "") + strClassName;
        }
}

function removeClassName(oElm, strClassName){
        var oClassToRemove = new RegExp((strClassName + "\s?"), "i");
        oElm.className = oElm.className.replace(oClassToRemove, "").replace(/^\s?|\s?$/g, "");
}


VAL.getForms = function(){
   var frms = [];
   var k = 0;   

   for(var i=0; i<document.forms.length; i++){
       var elems = getElementsByAttribute(document.forms[i], 'INPUT', 'validacion');
       
       // si algun element te validacio, recupero el nom del form
       if(elems.length > 0){                
           frms[k] = VAL.getParentForm(elems[0])
           k++;
       }
          
		for(var j=0;j<elems.length;j++){
                          
			elems[j].onkeyup = function(e){
			        // detecto la tecla polsada
			        if (!e) var e = window.event;
			        if (e.keyCode) code = e.keyCode;
			        else if (e.which) code = e.which;
			   
			        // si la tecla no es el tabulador, faig la validacio
			        if(code != 9){
						if(code != 8){
			             // alert("1");
						  VAL.doValidation(this)
						}
			        }  
			}
			
			// afegeixo l'asterisc de "requerit"
			if(elems[j].getAttribute('validacion').indexOf('requerido') != -1){
				var sp = document.createElement('SPAN')
				sp.style.color = 'red'
				sp.style.font = '10px arial'
				
				var asterisc = document.createTextNode('(*)')
				sp.appendChild(asterisc)
				insertAfter(sp, elems[j])
				
			}
      	}
				   
   }
      
   // afegeixo l'event onsubmit als formularis
   for(var i=0;i<frms.length;i++){
       
       frms[i].onsubmit = function(){
           return VAL.validateForm(this)           
       }
          
   }
   
   // comprovem si estan definits els estils
   // si no ho estan, els creo dinamicament
   var alert_css = null
   var form_alert_css = null
   
   // Moz
	if(document.styleSheets[0].cssRules) { 	  
		for(var i=0;i<document.styleSheets.length;i++){
			for(var j=0;j<document.styleSheets[i].cssRules.length;j++){
				if(document.styleSheets[i].cssRules[j].selectorText == '.alert') alert_css = true
				if(document.styleSheets[i].cssRules[j].selectorText == '.form_alert') form_alert_css = true
			}
		}
	  
		if(!alert_css){ 
			document.styleSheets[0].insertRule('.alert { color: red;font: 10px arial }',0);		  	
		}
		if(!form_alert_css){ 
			document.styleSheets[0].insertRule('.form_alert { background-color: red }',0);		  	
		}
	}
	
	// IE
	if(document.styleSheets[0].rules){ 
		for(var i=0;i<document.styleSheets.length;i++){
			for(var j=0;j<document.styleSheets[i].rules.length;j++){
				if(document.styleSheets[i].rules[j].selectorText == '.alert') alert_css = true
				if(document.styleSheets[i].rules[j].selectorText == '.form_alert') form_alert_css = true				
			}
		}
		
		if(!alert_css){ 
			document.styleSheets[0].addRule('.alert', 'color: red;font: 10px arial');		  	
		}
		if(!form_alert_css){ 
			document.styleSheets[0].addRule('.form_alert', 'background-color: red');		  	
		}
	}
	
}
 
 // retorna una referencia al formulari que
 // conte el element
 VAL.getParentForm = function(elem){

        while(elem.nodeName != 'FORM'){
                elem = elem.parentNode       
        }
       
        if(elem.nodeName == 'FORM') return elem
        else return false
 }
 
 // valida el formulari al fer submit
 VAL.validateForm = function(frm){ 
 		
         // elimino totes les alertes d'errors si en tinc
        var errors = getElementsByClass('alert', frm, 'div')
       
        for(var i=0; i<errors.length;i++){        
       
                var el = errors[i].getAttribute('relatedElementName')               
                removeClassName(frm[el], 'form_alert')
                var eliminat = errors[i].parentNode.removeChild(errors[i])
                eliminat = null               
               
        }
       
       
        var ok = true;
		var valido = true;
        var elems = getElementsByAttribute(frm, '*', 'validacion')
       
        for(var i=0;i<elems.length;i++){
                valido = this.doValidation(elems[i])       
				if(!valido) ok = false;
        }
		
		// comprovo si hi ha validacions addicionals
		if(VAL.validations){
			for(var i=0;i<VAL.validations.length;i++){
				// crido la funcio per la validacio addicional	
				var ret = eval(VAL.validations[i])
				if(!ret) ok = false
			}			
		}
       
        return ok
 }
 
 
 
 // rep un camp i el valida
 VAL.doValidation = function(elem){
         var ok = true
       
        // elimino els missatges d'error del camp si en te
        var msg = document.getElementById('sp' + elem.name)
		
		/*
		 * TODO: AQUI HAURIA DE COMPROVAR QUE EL ELEMENT ESTA EN EL FORM QUE ESTIC VALIDANT
		 */
		
        if(msg){
                var eliminat = msg.parentNode.removeChild(msg)
                eliminat = null                
                removeClassName(elem, 'form_alert')
        }
       
       
         // recupero les validacions del camp
         var validaciones = elem.getAttribute('validacion').split('|');
       
               
        for(var j=0;j<validaciones.length;j++){
                switch(validaciones[j]){
			
			case 'email':
				if ( echeck(elem.value) == false ){
					ok=false;
					VAL.setError(elem, 'No es un email valido')
				}
			
			
                        case 'no_vacio':
								if(elem.value == ''){
                                        ok = false;
                                        VAL.setError(elem, 'no puede estar vacio')
                                }
                                break;
                        case 'numerico':
                                if(isNaN(elem.value)){
                                        ok = false;
                                        VAL.setError(elem, 'ha de ser un numero')
                                }
                                break;  
						case 'email':
								if(!(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(elem.value))){
									ok = false;
                                    VAL.setError(elem, 'no es un e-mail válido')
								}
								break;                     
                }
        }
               
        return ok
 }
 
 VAL.setError = function(elem, msg){
         // aqui afegeixo un msg al element i li canvio el color de fons
        var sp = document.createElement('DIV')
        sp.className = 'alert'
        sp.setAttribute('relatedElementName', elem.name);
        sp.setAttribute('id', 'sp' + elem.name);
       
        var txt = document.createTextNode(msg)
        sp.appendChild(txt)
       
        insertAfter(sp, elem)
       
        // millor afegir un estil addicional i aixi despres el puc eliminar i deixar el que hi havia
        //addClassName(oElm, strClassName)
        addClassName(elem, 'form_alert')        
 }
 
 // afegeix una validacio "manual"
 // param: funcio de validacio
 VAL.addValidation = function(fn){
 	VAL.validations.push(fn)
 }
 
 ELO.functionsToCallOnload.push("VAL.getForms()")