function valObject(){

	this.validChar ='0123456789ABCDEF';
	
	this.RegExpr = new Array();
	this.RegExpr['float'] = new Array("Decimales, sin comas ni espacios en blanco","[^0-9\.]");
	this.RegExpr['integer'] = new Array("Enteros","[^0-9]");

	this.errores = new Array();
	this.divErrors = false;
	this.divErrObj = null;
	
	this.showDivErrors = function(objId){
		this.divErrObj = this.e(objId);
		if(this.divErrObj) 
			this.divErrors = true;
	}
	
	this.validar = function(objForm, action){
			var xString = "";
			var submitDisabledElements = false;
			if (arguments.length > 1 && arguments[1] == true)
				submitDisabledElements = true;
			if(arguments.length > 2)
				prefix = arguments[2];
			var z=0;

			var first = true;
			
			if (objForm)
			{
				var formElements = objForm.elements;
				for( var i=0; i < formElements.length; i++)
				{
					var name = formElements[i].name;
					if (name)
					{
						if ( formElements[i].title && !formElements[i].disabled )
							this.validarCampo(formElements[i]); // Validar Formulario
						
					} 
				}
			}
				
		if (this.errores.length>0){
			this.stopRequest(); return false;
		} else {
			objForm.action = action; objForm.submit();
		}
	}

	this.validarCampo = function(myObj){
		
		/* 
			typeVal Values
			
			0: default
			integer	: chequear Entero
			float	: chequear Float
			mail	: chequear Email Valido
			date	: chequear Fecha
			equal	: compara con otro campo (para Contraseñas)
			greater	: el valor del campo sea mayor al del campo de referencia
			less	: el valor del campo sea meno al del campo de referencia
		*/

		var req; var type; var objLen; var typeVal; var myVal;
		
		var args = myObj.title.split(',');
				
		if (args[1] == "req") req = true; else req = false;
		
		myVal 	= myObj.value;		
		type 	= myObj.type;
		typeVal = args[0];
		myTitle = args[2];
		
		
		switch(type){
			
			case 'text':
			case 'password':
			case 'hidden': 
			
				if (req&&myObj.value.length==0){this.addError(myTitle);}

					if (myObj.value.length>0){
					switch(typeVal){
						case 'integer':
							if( !(parseInt(myVal).toString() == myVal) || myVal<1)this.addError(myTitle)
						break;
						case 'float':
							if( !(parseFloat(myVal).toString() == myVal))this.addError(myTitle)
						break;
						case 'mail':
							var rx=new RegExp("^[\\w\.=-]+@[\\w\\.-]+\\.[a-z]{2,4}$");if(!rx.test(myVal))this.addError(myTitle)
						break;
						case 'date':
							 var dd = this.isDate(myVal, myTitle); 
						break;
						case 'equal':
							var myObjCompare = this.e(args[3]);
							if(myVal!=myObjCompare.value)this.addError(myTitle)					
						break;
						case 'greater':
							var myObjCompare = this.e(args[3]);
							
							myObj.value = myObj.value.trim().trim_inner_spc();
							myObjCompare.value = myObjCompare.value.trim().trim_inner_spc();
							
							var v1 = myVal;
							var v2 = myObjCompare.value;
							/*
							var strlen = v1.length;
							
							alert(parseFloat(v1)+'<'+parseFloat(v2))
							if(parseFloat(v1)<parseFloat(v2))this.addError(myTitle)
							
							//v1 = v1.replace(/^\s*|\s*$/g,"");
							//v2 = v2.replace(/^\s*|\s*$/g,"");
							//v1 = v1.trim();
							
							*/
							
							var charpos = v1.search(this.RegExpr[args[4]][1]); 
							if(v1.length > 0 && charpos >= 0)this.addError(myTitle+": "+v1+" (Ingresar Números "+this.RegExpr[args[4]][0]+")")
							
							var charpos = v2.search(this.RegExpr[args[4]][1]); 
							if(v2.length > 0 && charpos >= 0)this.addError(myTitle+": "+v2+" (Ingresar Números "+this.RegExpr[args[4]][0]+")")
								
							if(myObjCompare.value.length && charpos < 0){
								if(eval(myObjCompare.value)<eval(myVal))this.addError(myTitle+": "+myVal+" y "+myObjCompare.value)
							}
						break;
						case 'less':
							var myObjCompare = this.e(args[3]);
							var v1 = parseFloat(+myVal);
							var v2 = parseFloat(+myObjCompare.value);

							alert(parseFloat(v1)+'>'+parseFloat(v2))
							if(parseFloat(v1)>parseFloat(v2))this.addError(myTitle)
						break;					
					}
				}
			break;
			
			case 'textarea': if (req&&myObj.value.length==0){this.addError(myTitle);}
			break;
			
			case 'select-one': if (req&&myObj.value==0){this.addError(myTitle);}
			break;
			
		}
		
	}

    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g,' ');
    }
	
	String.prototype.trim_inner_spc = function() {
		return this.replace(/\s+/g,' ');
	}
	
	/**
	 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
	 */
	// Declaring valid date character, minimum year and maximum year
	this.dtCh= "/";
	this.minYear=1900;
	this.maxYear=2100;

	this.isInteger = function(s){
		var i;
		for (i = 0; i < s.length; i++){   
			// Check that current character is number.
			var c = s.charAt(i);
			if (((c < "0") || (c > "9"))) return false;
		}
		// All characters are numbers.
		return true;
	}

	this.stripCharsInBag = function(s, bag){
		var i;
		var returnString = "";
		// Search through string's characters one by one.
		// If character is not in bag, append to returnString.
		for (i = 0; i < s.length; i++){   
			var c = s.charAt(i);
			if (bag.indexOf(c) == -1) returnString += c;
		}
		return returnString;
	}

	this.daysInFebruary = function(year){
		// February has 29 days in any year evenly divisible by four,
		// EXCEPT for centurial years which are not also divisible by 400.
		return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
	}

	this.DaysArray = function(n) {
		var arrTemp = new Array();
		for (var i = 1; i <= n; i++) {
			arrTemp[i] = 31
			if (i==4 || i==6 || i==9 || i==11) {arrTemp[i] = 30}
			if (i==2) {arrTemp[i] = 29}
	   } 
	   return arrTemp;
	}

	this.isDate = function(dtStr, myTitle){
		var daysInMonth = this.DaysArray(12)
		var pos1=dtStr.indexOf(this.dtCh)
		var pos2=dtStr.indexOf(this.dtCh,pos1+1)
		/*
		var strMonth=dtStr.substring(0,pos1)
		var strDay=dtStr.substring(pos1+1,pos2)
		*/
		var strDay=dtStr.substring(0,pos1)
		var strMonth=dtStr.substring(pos1+1,pos2)
		var strYear=dtStr.substring(pos2+1)
		strYr=strYear
		if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
		if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
		for (var i = 1; i <= 3; i++) {
			if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
		}
		month=parseInt(strMonth)
		day=parseInt(strDay)
		year=parseInt(strYr)
		
		
		
		if (pos1==-1 || pos2==-1){
			this.addError(myTitle + ": El formato de la fecha debe ser : dd/mm/aaaa")
			return false
		}
		if (strMonth.length<1 || month<1 || month>12){
			this.addError(myTitle + ": Ingresar un mes válido")
			return false
		}
		if (strDay.length<1 || day<1 || day>31 || (month==2 && day>this.daysInFebruary(year)) || day > daysInMonth[month]){
			this.addError(myTitle + ": Ingresar un día válido")
			return false
		}
		if (strYear.length != 4 || year==0 || year<this.minYear || year>this.maxYear){
			this.addError(myTitle + ": Ingresar un año de 4 dígitos válido entre "+this.minYear+" y "+this.maxYear)
			return false
		}
		if (dtStr.indexOf(this.dtCh,pos2+1)!=-1 || this.isInteger(this.stripCharsInBag(dtStr, this.dtCh))==false){
			this.addError(myTitle + ": Ingresar una fecha válida")
			return false
		}
	
	//return;
	}
	
	this.addError = function(title){
		
		var l = this.errores.length;
		this.errores[l] = title;
		
	}

	this.stopRequest = function(){
		
		var l = this.errores.length;
		var z = 0;
		
		if(this.divErrors){
			var bkl = '<br />';
			var xStringErrores = "<p>Error: <span class='negro'>Favor revisar el formulario y corregir los siguientes errores:</span></p><br />";
		} else { 
			var bkl = '\n';
			var xStringErrores = "Error: Favor revisar el formulario y corregir los siguientes errores: \n\n";
		}
			
		if (l>0){
			for(z=0;z<l;z++){
				xStringErrores += "* "+this.errores[z]+bkl;
			}
		}
		
		if(this.divErrors){
			this.divErrObj.innerHTML = xStringErrores;
			this.divErrObj.style.display = 'block';
			document.location.hash = this.divErrObj.id;
		} else
			alert(xStringErrores);
			
		this.errores = new Array();
	}

	this.e = function(_divId){
		if (!_divId)
			return null;
			
		var returnObj = document.getElementById(_divId);
		if (!returnObj && document.all) {
			returnObj = document.all[_divId];
		}
		
		return returnObj;
	}		
	
	this.habilitarCampos = function(arguments){
		var elementos = arguments.split(',');
		var x = elementos.length;
		
		for(i=0;i<x;i++){
			var objId = this.e(elementos[i]);	
			if(!objId.disabled) objId.disabled = 'disabled'; else objId.disabled = '';
		}
		
	}

}
var validacion = new valObject();
