var validationMap;
var validationMaskMap; 
var identificationMap;
var identificationMaskMap;
var identificationTypeMap;
var idenTypeNumberArray;
var strUserAgent = navigator.userAgent.toLowerCase(); 
var isIE = strUserAgent.indexOf("msie") > -1; 
var today;
var _navegador = navigator.userAgent;
var ie = /msi/i.test(_navegador);
var op = /opera/i.test(_navegador);
var mo = /gecko/i.test(_navegador);
var otro = !(ie || mo);
var validationOnTracking = false;
/** Funcion que permite crear un objeto de tipo HashMap
  * @return HashMap
*/
function HashMap() {
    var obj = [];
    obj.size = function () {
        return this.length;
    };
    obj.isEmpty = function () {
        return this.length === 0;
    };
    obj.containsKey = function (key) {
        for (var i = 0; i < this.length; i++) {
            if (this[i].key === key) {
                return i;
            }
        }
        return -1;
    };
    obj.get = function (key) {
        var index = this.containsKey(key);
        if (index > -1) {
            return this[index].value;
        }
    };
    obj.put = function (key, value) {
        if (this.containsKey(key) !== -1) {
            return this.get(key);
        }
        this.push({'key': key, 'value': value});
    };
    obj.clear = function () {
        this.obj = null; 
    };
    return obj;
}

/** Funcion que permite validar un caracter ingresado desde el teclado en base
  * a una expresion regular asignada
  * @param objEvent evento ocurrido
  * @param obj  Objeto donde ocurrio el evento
  * @return booleano
  * NOTA: Se agregó la validación del número de carateres (maxlength) Junio 09, 2009
*/
function checkCaracter(objEvent,obj,expression) {	
	var key = window.event ? objEvent.keyCode : objEvent.which;
	var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
	var theValue = obj.value;	
	if((obj.getAttribute && theValue.length>=mlength) == false){	
		if((key > 0) && (key != 8)  && (key != 37) 
	  	&& (key != 38) && (key != 39) ){
			if(key == 190){key = 46;}
			var keychar = theValue + String.fromCharCode(key);
			return isValid(keychar,expression);
		}else{
			if((String.fromCharCode(key)=='%') || (String.fromCharCode(key)=='&') || 
				(String.fromCharCode(key)=="'") || (String.fromCharCode(key)=='.')){
				var keychar = theValue + String.fromCharCode(key);
				return isValid(keychar,expression);
			}
			return true;
		}
	}else{
		if(((key > 0) && (key != 8)  && (key != 37) 
	  	&& (key != 38) && (key != 39))== false){
			return true;
		}
	}
	return false;
}
	
/** Funcion que valida en base a  la mascara del campo
  * Solo permite ingresar una cadena que cumpla con la mascara asociada al campo
  * @param strValue cadena a evaluar
  * @param name nombre de objeto que validara, de donde se sacara la configuracion de la mascara
  * NOTA: Se agregó la validación del número de carateres (maxlength) Junio 09, 2009
*/ 
function checkMask(objEvent, obj, name, labelField) {	    
	var expresionValid;
	var theValue = obj.value;
	var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
	if(obj.getAttribute && theValue.length>=mlength){
		obj.value=obj.value.substring(0,mlength);
	}
	var value = obj.value;
	if (trim(value) != ""){	
	    expresionValid = validationMaskMap.get(name);
	    expresionValid = expresionValid.replace("&amp;", "&");
		expresionValid = expresionValid.replace("&#039;", "\'");	    		
		var validExpresion = RegExp (expresionValid);	
		
		if (!validExpresion.test(obj.value)){
		    alert('El campo ' + labelField + ' no es válido.');		    
   	    	setTimeout(function(){obj.focus()}, 10);
		}
	}
}

/** Funcion que valida en base a la mascara asociada al tipo de identificacion del campo */  
function checkIdentMask(objEvent,obj){  
    var value = obj.value;
    var selected = false;
	if (trim(value) != ""){
		var typeIdentiId = identificationTypeMap.get(obj.id);
		var elementListSelected = document.getElementById(typeIdentiId);
		
		//Verifica que control tiene el tipo de identificacion y si este tiene seleccionada una opción		
		if(elementListSelected.name.indexOf("radiobutton") != -1){
		var radios = document.getElementsByName("radiobutton"+typeIdentiId);
			for(j=0; j<radios.length; j++){
				if(radios[j].checked){
					selected = true;
				}
			}
		}
		if((elementListSelected.name.indexOf("combobox") != -1) || (elementListSelected.name.indexOf("listbox") != -1)){
			if (elementListSelected.selectedIndex != -1){
				selected = true;
			}
		}
		if (selected == false){	
		  alert('Debe seleccionar un tipo de Identificación.')
		  return false;
		}else{
			if(elementListSelected.name.indexOf("radiobutton") != -1){
				var radios = document.getElementsByName("radiobutton"+typeIdentiId);
				for(j=0; j<radios.length; j++){
					if(radios[j].checked){
							name = radios[j].value;
					}
				}
			}else {
				name = elementListSelected.options[elementListSelected.selectedIndex].value;
			}   
			var mascara = identificationMaskMap.get(name);			
			if (mascara != null){
			    obj.value = applyMask(value, mascara);
			}
		}
	}
	return false;
}
function applyMask(value, mask){
var antText = '', desText='';
	if(value != '' && mask !=''){
		if (value.length < mask.length){			       
	       value = replaceSpaces(value);			     
	       for (var lgVal = 0; lgVal < value.length; lgVal++){
	       		var digito = value.substring(lgVal,lgVal + 1);
	    		var maskDigit = mask.substring(lgVal,lgVal + 1);			    		
	    		if (maskDigit == " "){
	    		   //agregar espacio			    		   
	    		   antText = value.substring(0,(lgVal));			    		   
				   desText = value.substring(lgVal);						  
				   value = antText + " " + desText;						   
	    		}
	       }
		}
	}
	return value;
}
function replaceSpaces(strValue) {
   while(strValue.indexOf(" ") >= 0) {	
      temp = strValue;
      strValue = temp.replace(" ", "");	
   }
   return strValue;
}

/** Funcion que valida en base a la mascara asociada al tipo de identificacion del campo */  
function checkIdentValidation(objEvent,obj){	
	var name;
	var objInput;
	var selected = false;
    var theValue = obj.value;	
    if (trim(theValue) != ""){
		var typeIdentiId = identificationTypeMap.get(obj.id);
		var elementListSelected = document.getElementById(typeIdentiId);		
		//Verifica que control tiene el tipo de identificacion y si este tiene seleccionada una opción		
		if(elementListSelected.name.indexOf("radiobutton") != -1){
			var radios = document.getElementsByName("radiobutton"+typeIdentiId);
			for(j=0; j<radios.length; j++){
				if(radios[j].checked){
					selected = true;
				}
			}
		}
		if((elementListSelected.name.indexOf("combobox") != -1) || (elementListSelected.name.indexOf("listbox") != -1)){
			if (elementListSelected.selectedIndex != -1){
				selected = true;
			}
		}
	    if (selected == false){	
		  alert('Debe seleccionar un tipo de Identificación.')
		  return false;
		}else{
			if(elementListSelected.name.indexOf("radiobutton") != -1){
				var radios = document.getElementsByName("radiobutton"+typeIdentiId);
				for(j=0; j<radios.length; j++){
					if(radios[j].checked){
							name = radios[j].value;
					}
				}
			}else {
				name = elementListSelected.options[elementListSelected.selectedIndex].value;
			}
			//Aplicar máscara antes de validar el campo de Número de Identificación
			var mascara = identificationMaskMap.get(name); 
			if (mascara != null){
			    obj.value = applyMask(theValue, mascara);
			    theValue = obj.value;
			}
			//
			var validExpresion = RegExp (identificationMap.get(name));
			if (!validExpresion.test(theValue)){
				//Limpia el valor del campo
		    	obj.value = "";
		    	alert('El campo no es válido.');
		    	setTimeout(function(){obj.focus()}, 10);							    
			}
		}
	}
}
		
/** Funcion que valida en base a  la validacion del campo
  * Solo permite ingresar caracteres validos para su expresion regular
  * @param strValue expresion a evaluar
  * @param name nombre de objeto que validara, de donde se sacara la configuracion de la expresion regular
*/                     
function isValid(strValue,name) {
    var expresionValid = validationMap.get(name);		
	expresionValid = expresionValid.replace("&amp;", "&");
	expresionValid = expresionValid.replace("&#039;", "\'");
	var validExpresion = RegExp (expresionValid);
	return validExpresion.test(strValue);
}

/** Funcion que valida en base a  tipo de identificacion del campo
  * Solo permite ingresar caracteres validos para su expresion regular
  * @param strValue expresion a evaluar
  * @param name nombre de objeto que validara, de donde se sacara la configuracion de la expresion regular
*/  
function isTypeValid(strValue,name){	
	var validExpresion = RegExp (identificationMap.get(name));	
	return validExpresion.test(strValue);
}

/** Funcion que valida en base a la mascara asociada al tipo de identificacion del campo
  * @param strValue mascara a evaluar
  * @param name nombre de objeto que validara, de donde se sacara la configuracion de la mascara
*/  
function isTypeValidMask(strValue,name){	
	var validExpresion = RegExp (identificationMaskMap.get(name));	
	return validExpresion.test(strValue);
}

/** Variable auxiliar para validacion de tipos de identificacion*/
var longitudAnt;
/** Variables auxiliares para la validacion de tipos de identificacion */
var alfanumerico = '^[a-zA-Z0-9\\s]+$';
var numerico = '^[\\d]+$';

/** Funcion para obtener la posicion del cursor*/
function getIdentPosition(obj){
var range;
var distancia;
	if (op || mo){
		var _ini = obj.selectionStart;
		var _fin = obj.selectionEnd;
		var inicio = obj.value.substr(0, _ini);
		var fin = obj.value.substr(_fin, obj.value.length);
		distancia = inicio.length;
	}else if (ie){
		range= document.selection.createRange();
		var range2 = obj.createTextRange();
		range2.collapse(true);
		range2.moveEnd('character', 0);
		range2.setEndPoint('EndToStart', range);
		distancia=range2.text.length;
	}
	return distancia;
}

/** Funcion que valida la entrada de caracteres en base a una mascara asignada
  * @param objEvent evento sucedido en el control
  * @param obj control donde se ejecuto el evento
  * @return booleano
*/
function checkIdentCaracter(objEvent,obj) { 
	var antText;
	var desText; 
	var range; 
	var range2;
	var specialCaracter;
 	var validExp;
    var cursorText = getIdentPosition(obj)
	var theValue = obj.value;	
	var typeIdentiId = identificationTypeMap.get(obj.id);	
	var elementListSelected = document.getElementById(typeIdentiId);
	var auxiliar, auxiliar2;
	var key = window.event ? objEvent.keyCode : objEvent.which;
	var name;
	var selected = false;
	//Verifica si es una tecla de control
	if(objEvent.ctrlKey == false){		
		//Verifica que control tiene el tipo de identificacion y si este tiene seleccionada una opción	
		if(elementListSelected.name.indexOf("radiobutton") != -1){
		var radios = document.getElementsByName("radiobutton"+typeIdentiId);
			for(j=0; j<radios.length; j++){
				if(radios[j].checked){
					selected = true;
				}
			}
		}
		if((elementListSelected.name.indexOf("combobox") != -1) || (elementListSelected.name.indexOf("listbox") != -1)){
			if (elementListSelected.selectedIndex != -1){
				selected = true;
			}
		}
	if (selected == false){	
	  alert('Debe seleccionar un tipo de Identificación.')
	  return false;
	}else{
		if(elementListSelected.name.indexOf("radiobutton") != -1){
			var radios = document.getElementsByName("radiobutton"+typeIdentiId);
			for(j=0; j<radios.length; j++){
				if(radios[j].checked){
				name = radios[j].value;
				}
			}
		}else {
			name = elementListSelected.options[elementListSelected.selectedIndex].value;
		}
		
	   	var mascara = identificationMaskMap.get(name);
		if(key!=8 && key!=0) {
			if (mascara != null){
				if(obj.value.length < mascara.length){	
						if(key == 190){key = 46;}
						//Obtiene el caracter que ingreso el usuario
						var keychar = String.fromCharCode(key);
						//Obtiene que tipo de caracter valido para esa máscara en la posición actual	
						auxiliar = mascara.substring(cursorText,(cursorText+1));
						//Si no es un espacio
						if(auxiliar == "#" || auxiliar == "@"){
							//Asigna la validación requeridad e acuerdo al caracter que corresponde en la máscara
							if(auxiliar == "#"){
							    validExp = RegExp (numerico);
							}else if (auxiliar == "@") {
								var validExp = RegExp (alfanumerico);
							}
							//Verificar si cumple con la mascara
							if (validExp.test(String.fromCharCode(key))){
								//Inserta el caracter en la posición actual
								insertCharacter(obj,keychar);
							}
							return false;
						}else{
							var spaces ='';							
							var i = cursorText;										

							//Si el auxiliar es diferente de #,@ y ' ', entonces sigue un caracter fijo
							while(auxiliar.toUpperCase()==' ' || (auxiliar != "#" && auxiliar != "@")){
								//spaces = spaces + " ";
								if (keychar.toUpperCase() == auxiliar.toUpperCase()){
									//Concatena al caracter 
									spaces = spaces+ keychar;
								}else{
									//Concatena el mismo caracter de la mascara
									spaces = spaces + auxiliar;
								}
								i = i + 1;
								auxiliar = mascara.substring(i,(i+1));
								
							}
							auxiliar2 = auxiliar;
							if(auxiliar2 == "#" || auxiliar2 == "@"){					
								if(auxiliar2 == "#"){
								    validExp = RegExp (numerico);
								}else if (auxiliar2 == "@") {
									validExp = RegExp (alfanumerico);
								}
								//Verificar si cumple con la máscara
								if (validExp.test(String.fromCharCode(key))){
									//Inserta el caracter en la posición actual
									spaces = spaces+ keychar;
								}
							}							
							if(spaces!=''){
								//Inserta el espacio en la posición actual
								insertCharacter(obj,spaces);
								return false;
							}		
							return false;	
						}	
				}else{
					
					return false;
				}
			}
			else //Tipo de ID tiene máscara genérica
			{
			var name = 'OTHER'
			var mascara = identificationMaskMap.get(name);
			var validExp = RegExp (mascara);
			if (validExp.test(String.fromCharCode(key))){
				//Inserta el caracter en la posición actual
				insertCharacter(obj,String.fromCharCode(key));
				}
			return false;
			
			}
		}//char 8 y 0
		else{
			var actualCursor = cursorText;
			//Si el usuario teclea supr, fecha derecha, flecha izq,
			if(key == 0){
				var actualValue = obj.value; 
				obj.value = applyMask(actualValue, mascara);
				obj.selectionStart=actualCursor;
				obj.selectionEnd=actualCursor;
				return true;
			}
			//Si el usuario teclea backspace
			if (key==8){			
				var value1 = obj.value.substring(0,cursorText-1);
				var value2 = obj.value.substring(cursorText,obj.value.length);
				obj.value = applyMask(value1+value2, mascara);				
				obj.selectionStart=actualCursor-1;
				obj.selectionEnd=actualCursor-1;		
			}
			return false;
		}		
		return false;
	}	
	return false;
	}//if not control key
}

function  insertCharacter(obj,character){
	if (op || mo){
		insertCharacter_Mozilla(obj,character);
	}else if (ie){
		insertCharacter_IExplorer(obj,character);
	}else if (otro){
		insertCharacter_Other(obj, character);
	}
}

function insertCharacter_Mozilla(f, x)	{
	var _ini = f.selectionStart;
	var _fin = f.selectionEnd;
	var inicio = f.value.substr(0, _ini);
	var fin = f.value.substr(_fin, f.value.length);

	f.value = inicio + x + fin;
	if (_ini == _fin)	{
		f.selectionStart = inicio.length + x.length;
		f.selectionEnd = f.selectionStart;
	}
	else	{
		f.selectionStart = inicio.length;
		f.selectionEnd = inicio.length + x.length;
	}
	f.focus();
}

function insertCharacter_Other(f, x)	{// opera u otros navegadores desconocidos
	f.value += x;
	f.focus();
}

function insertCharacter_IExplorer(f, x)	{
	var texto = document.selection.createRange().text;
	if (f.createTextRange){
		f.posi = document.selection.createRange().duplicate();	
		f.focus();
		if (f.createTextRange)	{
			with(f)	{
				var actuar = (posi.text == "");
				posi.text = x;
				if (!actuar)
					posi.moveStart("character", -x.length);
				posi.select();
			}
		}	
	}
}

function checkIdentificationType(obj, position){   	
     var i;    
     var identificationType;
     var numIdentification;
     var idObj = "Tipo Identificación" + position;   
     if (obj.id == idObj){          
	     for (i = 1; i< idenTypeNumberArray.length; i++){           
	     	identificationType = idenTypeNumberArray[i];
	     	if (identificationType.indexOf(obj.id) != -1){
	     	 	numIdentification = identificationType.substring(identificationType.indexOf("|") + 1,identificationType.length);      	 	  
	     		document.getElementById(numIdentification).value = "";
	     	}
	     }
     }
}

function getCurrentDate(){
   today = getActualDate();
}

function displayDateWebForm(dateFieldName,validation, dtSep){
    var dtFormat = validationMaskMap.get(validation);
	displayDatePicker(dateFieldName, false, dtFormat, dtSep);
}

function ltrim(str) { 
	for(var k = 0; k < str.length && isWhitespace(str.charAt(k)); k++);
	return str.substring(k, str.length);
}
function rtrim(str) {
	for(var j=str.length-1; j>=0 && isWhitespace(str.charAt(j)) ; j--) ;
	return str.substring(0,j+1);
}
function trim(str) {
	return ltrim(rtrim(str));
}
function isWhitespace(charToCheck) {
	var whitespaceChars = " \t\n\r\f";
	return (whitespaceChars.indexOf(charToCheck) != -1);
}
function tipListBox(elementSelected) {	
	if( elementSelected.selectedIndex>-1 ){		  	    
		if (elementSelected.options[elementSelected.selectedIndex].text.length > 25){
		    Tip(elementSelected.options[elementSelected.selectedIndex].value);
  		}else{
  			UnTip();
  		}
	}		  			
}
function tipComboBox(elementListSelected) {
	if( elementListSelected.selectedIndex>-1 ){
		if (elementListSelected.options[elementListSelected.selectedIndex].text.length > 25){
	    	Tip(elementListSelected.options[elementListSelected.selectedIndex].value);	
  		}
	}		  			
}		

function checkNumberIdentificationTypeOnLoad(position){ 
	 var positionId = parseInt(position - 1);
	 var idObj = "Tipo Identificación" + positionId;
     var elementListSelected = document.getElementById(idObj);
     
     if(elementListSelected != null){
     	if(elementListSelected.selectedIndex > -1){
		     name = elementListSelected.options[elementListSelected.selectedIndex].value;
		     var mascara = identificationMaskMap.get(name);
		    
		     if(mascara != null){
				Tip(idExample + " " + mascara + "<br>" + idMask);
		     }
	     }
	}
}
