// JavaScript Document

var formato;

function validaForma(forma)
{
	if (!forma)	return false;

	var returnValue = true;
	var msgAlert='';
	var focusOn = -1;
	formato = '';
	//regresar los input a sus colores originales
	for(var i=0; i<forma.length; i++)
	{
		if(forma[i].className == 'RequeridoVacio')	forma[i].className = 'Requerido'
		else if(forma[i].className == 'Fail')		forma[i].className = ''
	}

	for(var i=0; i<forma.length; i++)
	{
		var customMsg ='';//= fixCustomMsg(forma[i].getAttribute('msgerror'))
		var nombre = forma[i].name;
		focusOn = i;

		if(forma[i].getAttribute('alt')!=null)
			nombre=String(forma[i].getAttribute('alt')).replace("\'","\"")
			
		else if(forma[i].getAttribute('title')!=null)
			nombre=String(forma[i].getAttribute('title')).replace("\'","\"")
			
		if (forma[i].className == 'Requerido' && !forma[i].disabled)
		{
			if (forma[i].value==''){
				msgAlert = customMsg!=''&&customMsg!=null?customMsg:'El campo "'+nombre+'" no puede estar vacío.    ';
			}
			else if(forma[i].type=='checkbox' && !forma[i].checked)
				msgAlert = customMsg!=''&&customMsg!=null?customMsg:'El campo "'+nombre+'" debe estar seleccionado';
			//cuando el campo es obligatorio y tiene datos, se forza a verificar el formato del dato
			else if(!verificaTipoDato(forma[i])){
				msgAlert =customMsg!=''&&customMsg!=null?customMsg:'El dato introducido en "'+nombre+'" no es valido.\n'+formato;
			}
		}
		else
		{
			//Se intenta verificar el formato del datos solamente si tiene algun dato
			if (forma[i].value!='' && !verificaTipoDato(forma[i]))
				msgAlert = customMsg!=''&&customMsg!=null?customMsg:'El dato introducido en "'+nombre+'" no es valido.\n'+formato;
		}
		if(msgAlert!='')
		{
			returnValue = false
			break;
		}
	}
	if(msgAlert!='')
	{
		forma[focusOn].className=forma[focusOn].className=='Requerido'?'RequeridoVacio':'Fail';
		alert(msgAlert)
		if(focusOn>=0)
		{
			if(forma[focusOn].select)	forma[focusOn].select();
			if(forma[focusOn].focus && forma[focusOn].canfocus)	forma[focusOn].focus();
		}
	}
	return returnValue;
}



function verificaTipoDato(obj)
{
	if(obj && obj.value && obj.getAttribute('formato') && obj.getAttribute('formato')!=null && obj.getAttribute('formato')!='undefined')
		return verificaFormato(obj.value,obj.getAttribute('formato'),(obj.getAttribute('formaterror')==null||obj.getAttribute('formaterror')=='undefined')?null:obj.getAttribute('formaterror'));
	else
		return true;
}

function verificaFormato(value,format,formaterror){
	var validType = true
	var Separator="(";
	formato=''
	var Value = value
	var Format = null;
	var Accept = String(format).toUpperCase()
	var AcceptNormal = String(format)
	if(Accept.indexOf(Separator)>=0)
	{
		var index = Accept.indexOf(Separator)
		var length = Accept.length
		Format = AcceptNormal.substr(index+1,length-index-2)
		Accept = Accept.substr(0,index)
	}
	validType = false;
	/**
	 *	En base al tipo de formato, se realizan las validaciones pertinentes
	 */
	switch(String(Accept).toUpperCase())
	{
		case "NUMERIC_RANGE":
			var from,to,From,To;
			validType=false
			if(Format.indexOf(",")>=0)
			{
				to = Format.substr(Format.indexOf(",")+1)
				from = Format.substr(0,Format.indexOf(","))
				formato = 'El valor debe estar entre '+from+' y '+to
				if(!isNaN(parseFloat(from)) && !isNaN(parseFloat(to)) && !isNaN(Value))
					validType=(parseFloat(Value)>=parseFloat(from) && parseFloat(Value)<=parseFloat(to))
			}
			if(validType==true)formato = ''
		break;
		case "EXP_REG":
			try{validType= eval("Value.match(/^"+Format+"$/)")}catch(e){validType=false;formato="Error al Evaluar la Expresion Regular:\n"+Format}
		break;
		case "I.P.":
		case "IP"://0-223.0-254.0-254.0-254
			validType=Value.match(/^([0-9]{1,2}|[1][0-9]{2}|[2][0-2]{2}|[2][2][3])[\.]([0-9]{1,2}|[1][0-9]{2}|[2][0-4]{2}|[2][4][5-9]|[2][5][0-4])[\.]([0-9]{1,2}|[1][0-9]{2}|[2][0-4]{2}|[2][4][5-9]|[2][5][0-4])[\.]([0-9]{1,2}|[1][0-9]{2}|[2][0-4]{2}|[2][4][5-9]|[2][5][0-4])$/)!=null
		break;
		case "CORREO":
		case "E-MAIL":
		case "EMAIL":
			validType=Value.match(/^[a-zA-Z0-9]{1}[a-zA-Z0-9._-]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]{1}[a-zA-Z0-9_-]{1,3})+$/);
		break;
		case "R.F.C.":
		case "RFC":
			if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[0-9]{2}([0][1-9]|[1][012])([0][1-9]|[12][0-9])[A-Z0-9]{3}\b/)))
			{
				var first = 3
				for(var i=0;i<Value.length;i++)
					for(var j=0;j<10;j++)
						if(Value.substr(i,1)==j)
						{
							first = i;
							i = Value.length+1
							break;
						}
				var y = 1900+parseInt(Value.substr(first,2));
				if(parseInt(Value.substr(first+2,2))==2)	validType = !(parseInt(Value.substr(first+4,2))>(((y%4==0)&&((!(y%100==0))||(y%400==0)))?29:28))
				else		validType = true
			}
			else if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[0-9]{2}(([0][469])|([1][1]))[3][0][A-Z0-9]{3}\b/)))
				validType = true
			else if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[0-9]{2}(([0][13578])|([1][02]))[3][01][A-Z0-9]{3}\b/)))
				validType = true
			if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[\-][0-9]{2}([0][1-9]|[1][012])([0][1-9]|[12][0-9])[\-][A-Z0-9]{3}\b/)))
			{
				var first = first = Value.indexOf("-")+1
				var y = parseInt(1900+parseInt(Value.substr(first,2)),10);
				if(parseInt(Value.substr(first+2,2))==2)	validType = !(parseInt(Value.substr(first+4,2))>(((y%4==0)&&((!(y%100==0))||(y%400==0)))?29:28))
				else		validType = true;
			}
			else if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[\-][0-9]{2}(([0][469])|([1][1]))[3][0][\-][A-Z0-9]{3}\b/)))
				validType = true
			else if(Value.match(new RegExp(/\b[A-Z|\&]{3,4}[\-][0-9]{2}(([0][13578])|([1][02]))[3][01][\-][A-Z0-9]{3}\b/)))
				validType = true
		break;
		case "TELEFONO":	case "PHONE":
			//8717106152
			validType=Value.match(/^[1-9][0-9]{9}$/)!=null;
		break
		case "CELULAR":	case "CELPHONE":
			//8711061524
			validType=Value.match(/^[0-9]{12}$/)!=null;
		break
		case "BYTE"://-128 - 127
		case "-BYTE"://-128 - 0
		case "+BYTE"://0 - 127
			validType=(Value.match(/^[\+\-]?[0-9]+$/)!=null && parseInt(Value)>=-128 && parseInt(Value)<=127)
			if(validType && String(Accept).toUpperCase().indexOf("+")>=0 && parseFloat(Value)<0)
				validType = false;
			else if(validType && String(Accept).toUpperCase().indexOf("-")>=0 && parseFloat(Value)>0)
				validType = false;
		break
		case "TINYINT"://0-255 sin signo
			validType=(Value.match(/^[0-9]+$/)!=null && parseInt(Value)>=0 && parseInt(Value)<=255)
		break
		case "SHORT":
		case "SMALLINT"://-32768 -> 32767
			validType=(Value.match(/^[\-\+]?[0-9]+$/)!=null && parseInt(Value)>=-32768 && parseInt(Value)<=32767)
		break
		case "+INT":		case "+INTEGER":
		case "-INT":		case "-INTEGER":
		case "INT":			case "INTEGER"://-2147483648 -> 2147483647
			validType=(Value.match(/^[\-\+]?[0-9]+$/)!=null && (parseInt(Value)>=-2147483648 && parseInt(Value)<=2147483647))
			if(validType && String(Accept).toUpperCase().indexOf("+")>=0 && parseFloat(Value)<0)
				validType = false;
			else if(validType && String(Accept).toUpperCase().indexOf("-")>=0 && parseFloat(Value)>0)
				validType = false;
		break
		case "LONG"://-9223372036854775808 -> 9223372036854775807
		case "-LONG"://-9223372036854775808 -> 0
		case "+LONG"://0 -> 9223372036854775807
			validType=(Value.match(/^[\-\+]?[0-9]+$/)!=null && parseInt(Value)>=-9223372036854775808 && parseInt(Value)<=9223372036854775807)
			if(validType && String(Accept).toUpperCase().indexOf("+")>=0 && parseFloat(Value)<0)
				validType = false;
			else if(validType && String(Accept).toUpperCase().indexOf("-")>=0 && parseFloat(Value)>0)
				validType = false;
		break;
		case "FLOAT":		case "DOUBLE":		case "BIGDECIMAL":
		case "+FLOAT":		case "+DOUBLE":		case "+BIGDECIMAL":
		case "-FLOAT":		case "-DOUBLE":		case "-BIGDECIMAL":
			if(Value.match(/^[\-\+]?[0-9]+([\.][0-9]+)?$/))
			{
				validType=true
				if(Format && Format!=null)
				{
					var n=parseInt(Format),d=0;
					if(Format.match(/^[0-9]+([\,][0-9]+)?$/))
					{
						n = parseInt(Format.substr(0,Format.indexOf(",")))
						d = parseInt(Format.substr(Format.indexOf(",")+1))
					}
					var fl = "0";
					var nu = "0";
					if(Value.indexOf(".")>0)
					{
						nu = Value.substr(0,Value.indexOf("."));
						fl = Value.substr(Value.indexOf(".")+1,Value.length)
					}
					else
						nu = Value;
					validType=!(nu.length>(n-d) || fl.length>d)
					if(!validType)
						formato = 'El valor no es valido para esta precisión\n'+'Ingrese '+(n-d)+' enteros, y '+d+' decimales' 
					else
					{
						if(String(Accept).toUpperCase().indexOf("+")>=0 && parseFloat(Value)<0)
						{
							formato = 'Solo se permiten Numeros Reales positivos' 
							validType=false;
						}
						else if(String(Accept).toUpperCase().indexOf("-")>=0 && parseFloat(Value)>0)
						{
							formato = 'Solo se permiten Numeros Reales negativos' 
							validType=false;
						}
					}
				}
			}
		break
		case "DDMM":
			validType = false
			if(Value.match(/^([0][1-9]|[12][0-9])([0][1-9]|[1][012])$/))
				validType = true
			else if(Value.match(/^[3][0](([0][469])|([1][1]))$/))
				validType = true
			else if(Value.match(/^[3][01](([0][13578])|([1][02]))$/))
				validType = true
		break;
		case "MMDD":
			validType = false
			if(Value.match(/^([0][1-9]|[1][012])([0][1-9]|[12][0-9])$/))
				validType = true
			else if(Value.match(/^(([0][469])|([1][1]))[3][0]$/))
				validType = true
			else if(Value.match(/^(([0][13578])|([1][02]))[3][01]$/))
				validType = true
		break;
		case "DD/MM/AAAA":	case "DATE":case "FECHA":
			validType = false
			if(Value.match(/^([1-9]|[0][1-9]|[12][0-9])[\/]([1-9]|[0][1-9]|[1][012])[\/][1-2][0-9]{3}$/))
			{
				if(parseInt(Value.substr(3,2))==2)
					validType = !(parseInt(Value.substr(0,2))>(((parseInt(Value.substr(6))%4==0)&&((!(parseInt(Value.substr(6))%100==0))||(parseInt(Value.substr(6))%400==0)))?29:28))
				else
					validType = true
			}
			else if(Value.match(/^[3][0][\/](([0][469])|([1][1]))[\/][1-2][0-9]{3}$/))
				validType = true
			else if(Value.match(/^[3][01][\/](([0][13578])|([1][02]))[\/][1-2][0-9]{3}$/))
				validType = true
		break;
		case "TIME": case "HORA":
			validType=Value.match(/^(([0][1-9])|([1][0-9])|([2][0-4]))[\:][0-5][0-9][\:][0-5][0-9]([\.][0-9]{1,3})?$/)
		break;
		case "AMPM":
			validType=Value.match(/^(([0][1-9])|([1][0-9])|([2][0-4]))[\:][0-5][0-9][\:][0-5][0-9]([\.][0-9]{1,3})?[\ ]([ap][m]|[AP][M])$/)
		break;
		case "TIMESTAMP":
			validType = false
			if(Value.match(/^([0][1-9]|[12][0-9])[\/]([0][1-9]|[1][012])[\/][12][0-9]{3}[\ ](([0][1-9])|([1][0-9])|([2][0-4]))[\:][0-5][0-9][\:][0-5][0-9]([\.][0-9]{1,3})?$/))
			{
				if(parseInt(Value.substr(3,2))==2)
					validType = !(parseInt(Value.substr(0,2))>(((parseInt(Value.substr(6,4))%4==0)&&((!(parseInt(Value.substr(6,4))%100==0))||(parseInt(Value.substr(6,4))%400==0)))?29:28))
				else
					validType = true
			}
			else if(Value.match(/^[3][0][\/](([0][469])|([1][1]))[\/][1-2][0-9]{3}[\ ](([0][1-9])|([1][0-9])|([2][0-4]))[\:][0-5][0-9][\:][0-5][0-9]([\.][0-9]{1,3})?$/))
				validType = true
			else if(Value.match(/^[3][01][\/](([0][13578])|([1][02]))[\/][1-2][0-9]{3}[\ ](([0][1-9])|([1][0-9])|([2][0-4]))[\:][0-5][0-9][\:][0-5][0-9]([\.][0-9]{1,3})?$/))
				validType = true
		break
		default:
			validType = true
		break;
	}
	/*Devuelve el tipo correspondiente*/
	switch(String(Accept).toUpperCase())
	{
		case "NUMERIC_RANGE":
			if(formato=='')
				formato='Formato no valido'
		break;
		case "I.P.":case "IP":
			formato='El formato de la IP es incorrecto\nLos rangos validos son: 0-223.0-254.0-254.0-254'
		break;
		case "EXP_REG":
			if(formato=='')
				formato='No cumple la condicion:\n'+Format
		break;
		case "CORREO":case "E-MAIL":case "EMAIL":
			formato='El formato del correo electronico no es valido'
		break;
		case "TELEFONO":
			formato='El formato válido es: 99[9]-99-99'
		break
		case "PHONE":
			formato='El formato válido es: 999-99-99'
		break
		case "CELPHONE":
			formato='El formato válido es: 999-999-999-99-99'
		break
		case "R.F.C.":case "RFC":
			formato='Los formatos válido para el RFC es:\nZZZ[Z]999999ZZZ\nZZZ[Z]-999999-ZZZ'
		break;
		case "TINYINT"://0-255 sin signo
			formato='Solamente se permiten números Enteros entre: 0 y 255'
		break
		case "BYTE"://-128 - 127
		case "-BYTE"://-128 - 0
		case "+BYTE"://0 - 127
			formato='Solamente se permiten números Enteros entre: -128 y 127'
			if(String(Accept).toUpperCase().indexOf("+")>=0)
				formato = 'Solo se permiten numeros Enteros entre 0 y 127' 
			else if(String(Accept).toUpperCase().indexOf("-")>=0)
				formato = 'Solo se permiten numeros Enteros entre -128 y 0'
		break
		case "SHORT":case "SMALLINT"://-32768 -> 32767
			formato='Solamente se permiten números Enteros entre: -32768 y 32767'
		break
		case "-INT":case "-INTEGER"://-2147483648 -> 0
		case "+INT":case "+INTEGER"://0 -> 2147483647
		case "INT":case "INTEGER"://-2147483648 -> 2147483647
			formato='Solamente se permiten números Enteros entre: -2147483648 y 2147483647'
			if(String(Accept).toUpperCase().indexOf("+")>=0)
				formato = 'Solo se permiten numeros Enteros entre 0 y 2147483647' 
			else if(String(Accept).toUpperCase().indexOf("-")>=0)
				formato = 'Solo se permiten numeros Enteros entre -2147483648 y 0'
		break
		case "+LONG":	case "-LONG":	case "LONG":
			formato='Solamente se permiten números Enteros entre: -9223372036854775808 y 9223372036854775807'
			if(String(Accept).toUpperCase().indexOf("+")>=0)
				formato = 'Solo se permiten numeros entre 0 y 9223372036854775807' 
			else if(String(Accept).toUpperCase().indexOf("-")>=0)
				formato = 'Solo se permiten numeros entre -9223372036854775808 y 0'
		break
		case "FLOAT":		case "DOUBLE":		case "BIGDECIMAL":
		case "+FLOAT":		case "+DOUBLE":		case "+BIGDECIMAL":
		case "-FLOAT":		case "-DOUBLE":		case "-BIGDECIMAL":
			if(formato=='')
				formato='Solamente se permiten números Reales con o sin punto decimal'
		break
		case "DDMM":
			formato='El formato permitido para la fecha es:\nddmm'
		break;
		case "MMDD":
			formato='El formato permitido para la fecha es:\nmmdd'
		break;
		case "DD/MM/AAAA":	case "DATE": case "FECHA":
			formato='El formato permitido para la fecha es:\ndd/mm/aaaa'
		break;
		case "HORA":
		case "TIME":
			formato='El formato permitido para la hora es:\nhh:mm:ss[.nnn]'
		break;
		case "AMPM":
			formato='El formato permitido para la hora es:\nhh:mm:ss[.nnn] am|pm'
		break;
		case "TIMESTAMP":
			formato='El formato permitido para la fecha y hora es:\ndd/mm/aaaa hh:mm:ss[.nnn]'
		break;
	}
	if(formato!='')
		formato=(formaterror!=null)?formaterror:('\n'+formato)
	return validType
}


function addEvent(obj, evType, fn){
	
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	} else { 
		return false; 
	} 
}

function CapturaCaracter(e){
	
	var caracter;
	var format;
	if (e==null) e = window.event;
	if (e==null) return;
	
	if (window.event)
		caracter=String.fromCharCode(e.keyCode);
	else if (e)
    	caracter=String.fromCharCode(e.which);
	else
   		return;
		
	var campo = ( e.srcElement ? e.srcElement : e.target );
	if ( campo == null ) return;
	format = campo.getAttribute("formato");
	if (format == null ) return;
	return validaCaracter(caracter,format);
}

function validaCaracter(caracter,format){
	var separador="(";
	var esValido = true;
	format = String(format).toUpperCase();
	if(format.indexOf(separador)>=0)
	{
		var index = format.indexOf(separador)
		var length = format.length
		format = format.substr(0,index)
	}
	
	switch(format){
		case "NUMERIC_RANGE":
			if(isNaN(parseFloat(caracter))) 
				esValido = false;
		break;
		default:
			esValido = true;
	}
	return esValido;
}
