var TagsHide=""; //tags de objetos html que pueden contener los objetos a validar y puede ser que estén ocultos, por lo que estos
//objetos no deberían validarse. Por ejemplo, para los usuarios hay varios tipos de datos en los customs fields
//y es posible que algún grupo de objetos esté oculto al momento de hacer el submit... esos objetos NO deberían validarse!
//por lo tanto, agrupo esos objetos en un span y guardo en TagsHide el valor "span". 

	function createValidationObject(){
		objValidate = new validation(datasource);
	}

	function validateForm(vForm){
		var auxRetValue = false;
		if (validateTagName(vForm,"input")){
			if (validateTagName(vForm,"select")){
				if (validateTagName(vForm,"textarea")){
					auxRetValue = true;
				}
			}
		}
			
		return auxRetValue;
	}
	
	function validateTagName(p_Form,p_tagType){
		objValidate = new validation();
		var i;
		var str;
		var elements = document.getElementsByTagName(p_tagType);
		
		with(elements){
		    var continuar;
			for (i=0;i<elements.length;i++){
			     continuar=true;
			     if(TagsHide!="") {
                    var objPadre=findParent(elements[i],TagsHide);
                    if(objPadre) {
                        if (objPadre.style.display=="none") {
                           continuar=false;                    
                        }
                    }
                 }
                 if(continuar) { //verifico si valido o no el elemento
                     //str+="element=" +elements[i].id + ". Padre=" + objPadre.id + " El Display=" + elements[i].style.display + ". El ReadOnly=" + elements[i].getAttribute("readOnly") + ". El Class=" + elements[i].className + ". Padre Display=" + objPadre.style.display + ". Res=" +  ValidateElement(p_Form, elements[i]) + "\n";
    			     if(!ValidateElement(p_Form, elements[i])) {
                        return false;
                     }
                }
			}
		}
		//alert(str);
		return true;
	}
	
	function ValidateElement(p_Form, element) {
		if((element.className == "required") && (element.style.display != "none") && (!element.getAttribute("readOnly"))){
			if(objValidate.validateIsEmpty(element)){
            	return false;
			}
		}
		if ((element.style.display != "none")&&(!element.getAttribute("readOnly"))){ //if input's style is 'block'... it doesn't validate
//		  alert(element.getAttribute('validationType'));
			switch (element.getAttribute('validationType')){
                case "phone":
    				if(objValidate.validateIsNotPhone(element)) return false;
   					break;
    			case "email": 
					if(objValidate.validateIsNotEmail(element)) return false;
					break;
    			case "alphanumeric": 
					if(objValidate.validateIsNotAlphaNumeric(element)) return false;
					break;
				case "alphanumericNumeral": 
					if(objValidate.validateIsNotAlphaNumericNumeral(element)) return false;
					break;
    			case "alphanumeric_extended": // User's Name and Surname
					if(objValidate.validateIsNotAlphaNumericExtended(element)) return false;
					break;								
    			case "alphanumeric_course": // Names of Courses, Categories, and SubCategories
					if(objValidate.validateIsNotAlphaNumeric_Course(element)) return false;
					break;								
    			case "alphanumericvalname": // only A-Z0-9 w/o ´ and ¨
					if(objValidate.validateIsNotAlphaNumericValName(element)) return false;
					break;
    			case "alphanumericnotnumeric":
					if(objValidate.validateIsNotAlphaNumericOnlyNumeric(element)) return false;
					break;
    			case "alphanumeric_glossary":								
					if(objValidate.validateIsNotGlossaryTerm(element)) return false;
					break;
    			case "alphabetic": 
					if(objValidate.validateIsNotAlphabetic(element)) return false;
					break;
    			case "positiveInteger": 
					if(objValidate.validateIsNotPositiveIntegerNotCero(element)) return false;
					break;
    			case "image": 
					if(objValidate.validateIsNotImageFile(element)) return false;
					break;
    			case "checkbox":
					objValidate.resetCheckeds();
					if(objValidate.validateNotOneChecked(p_Form.name + "." + element.name)) return false;
					break;
    			case "password":
					if(objValidate.validateNotConfirmed(element)) return false;
					break;
    			case "username":
					if(objValidate.validateIsNotUsername(element)) return false;
    				break;								
    		}
		}
		return true;
    }

    function findParent(obj,Tag) {
    //busca, de acuerdo al objeto pasado por parámetro el objeto contenedor de obj que sea del tipo Tag,
    //Tag pueden ser varios tipos de objetos separados por comas como span,form,body,div, etc. para indicar que puede parar el proceso por cualquiera de esos tipos
    	if(obj!=null) {
    		if(obj.parentNode!=null) {
    			var TagObj = obj.parentNode.tagName;
    			if(TagObj) {
    				var Tag = Tag.toUpperCase();
    				if(("," + Tag + ",").indexOf("," + TagObj.toUpperCase() + ",",0)>=0) {
    					return obj.parentNode;
    				} else {
    					return findParent(obj.parentNode, Tag);
    				}
    			}
    		}
    	} 	
    	return null;
    }

