function InicializaTablasyBotones(){
    ///////////////////////////////////
	///Función: Aplica los efectos onmouseover y onmouseout a tablas y botones
	///que tengan los estilos TablaDatos y Boton respectivamente.
	///Obs.: Función modificada para el funcionamiento multinavegador
	///Autor: Nicolás Graglia
	///Fecha: 2008-04-15
	///////////////////////////////////
    elemen = new Array();
    elemen =  document.getElementsByTagName("body")[0].getElementsByTagName("*");
    for(var i=0; i < elemen.length; i++){
        if(elemen[i].className == "TablaDatos"){
             var tabla = document.getElementById(elemen[i].id)
             var k = tabla.getElementsByTagName("tr");
             for(var h = 1; h < k.length; h++){
                k[h].className = 'FilaTabla';
                if(navigator.appName == "Microsoft Internet Explorer"){
                    k[h].onmouseover = rowOver;
                    k[h].onmouseout = rowOut;
                }else{
                    k[h].setAttribute("onmouseover", "this.className='FilaTablaHover';");
                    k[h].setAttribute("onmouseout", "this.className='FilaTabla';");
                }
                
             }
         }
         if(elemen[i].className == "Boton"){
             if(navigator.appName == "Microsoft Internet Explorer"){
                elemen[i].onmouseover = botonOver;
                elemen[i].onmouseout = botonOut;
            }else{
                elemen[i].setAttribute("onmouseover", "this.className='BotonOver';");
                elemen[i].setAttribute("onmouseout", "this.className='Boton';");
            }
         }
    }
}

function botonOver(){
    var boton = event.srcElement;
    boton.className='BotonOver';
}

function botonOut(){
    var boton = event.srcElement;
    boton.className='Boton';
}

function rowOver(){
    var row = event.srcElement;
    row.parentNode.className='FilaTablaHover';
}

function rowOut(){
    var row = event.srcElement;
    row.parentNode.className='FilaTabla';
    
}

function AcomodarMascara(valor, mascara){
    var i = 0;
    var j = 0;
    var strMask = mascara;            
    var strTextoResultante = "";
    var strItemMascara = "";
    var strItem = "";
    
    strMask = Replace(strMask, "#", "|");
    strMask = Replace(strMask, "L", "|");
    strMask = Replace(strMask, "$", "|");
    strMask = Replace(strMask, "C", "|");
    strMask = Replace(strMask, "A", "|");
    strMask = Replace(strMask, "N", "|");
    strMask = Replace(strMask, "?", "|");           
    
    for (i = 0; i < strMask.length; i++)
    {  
        strItem = "";             
        strItemMascara = "";
             
        strItemMascara = strMask.substring(i, i+1); 
        
        if (valor.length > j){
            strItem = valor.substring(j, j+1);                    
        }
        else{
            strItem = "";
        }                
          
        if (strItemMascara == "|"){
            strTextoResultante = strTextoResultante + strItem;
            j = j + 1;
        }
        else{                    
            strTextoResultante = strTextoResultante + strItemMascara;
        }
    }
    
    return strTextoResultante
}

function ValidarNumerico($char, $mozChar) {
    ///////////////////////////////////
	///Función: Valida que la tecla ingresada sea numérica
	///Autor: Martin Yasse
	///Fecha: 2007-12-17
	///////////////////////////////////
	
    if($mozChar != null) { //Navegador Mozilla o compatible
        if(($mozChar >= 48 && $mozChar <= 57) || ($char >= 96 && $char <= 105) || $mozChar == 0 || $char == 8 || $mozChar == 13 || $mozChar == 44 || $mozChar == 46) 
            $RetVal = true;
        else {
            $RetVal = false;
            //alert('Ingrese un valor numerico.');
        }
    }
    else { // Navegador IE o compatible
        //alert($char);
        if(($char >= 48 && $char <= 57) || ($char >= 96 && $char <= 105) || $char == 13 || $char == 44 || $char == 46 || $char == 8 )
            $RetVal = true;
        else {
            $RetVal = false;
            //alert('Ingrese un valor numerico.');
        }
    }
    return $RetVal;
}

function ValidarNumerico2(event)
{
	///////////////////////////////////
	///Función: Valida que la tecla ingresada sea numérica
	///Autor: Martin Yasse
	///////////////////////////////////
	try{
		
		if (((event.keyCode<48) || (event.keyCode>57))&&(event.keyCode!=46)&&(event.keyCode!=13)){
			event.keyCode=0;
		}
	}
	catch(e){}
}

function SelTextFocus(event){
	///////////////////////////////////
	///Función: Selecciona el texto actual en el objeto cuando toma el foco
	///Autor: Martin Yasse
	///////////////////////////////////
	var oText;
	try{
		if (document.all)
			oText = event.srcElement;
		else
			oText = event.target;
		oText.select();
	}
	catch(e){}
}


function PasoConEnter (field, event) {
    ///////////////////////////////////
	///Función: Pasa al siguiente control cuando se ingresa un enter
	///Obs.: Función modificada para el funcionamiento multinavegador
	///Autor: Martin Yasse
	///Fecha: 2007-12-18
	///////////////////////////////////
	try{
        var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
        if (keyCode == 13) {
            var i;
            for (i = 0; i < field.form.elements.length; i++){
	            if (field == field.form.elements[i])
		            break;
		    }
            i = (i + 1) % field.form.elements.length;
            
            //Validación especial para controles del tipo MyCalendar2
            var intloc = field.form.elements[i].name.indexOf("$MEE_ClientState");
            
            if (intloc > -1){ 
	            var strControl = field.form.elements[i].name;
	            strControl = Replace(strControl, "$MEE_ClientState", "_txtCalendario")
	            
	            document.getElementById(strControl).focus();
            }
            else{
                
                intloc = field.form.elements[i].name.indexOf("$mee_ClientState");
                if (intloc > -1){ 
	                var strControl = field.form.elements[i].name;
	                strControl = Replace(strControl, "$mee_ClientState", "_txtMascara");
    	            
	                document.getElementById(strControl).focus();
                }
                else
                    field.form.elements[i].focus();
            }
            //Solo si se trata de un input y este se encuentra habilitado se selecciona el texto
            if (field.form.elements[i].tagName.toLowerCase() == "input"){ 
                if (field.form.elements[i].disabled == false)
                    field.form.elements[i].select();
            }
            return false;
        } 
        else
            return true;
    }
    catch(e){
        return false;
    }
}

/*
function PasoConEnter(event){
	///////////////////////////////////
	///Función: Pasa al siguiente control cuando se ingresa un enter
	///Autor: Martin Yasse
	///////////////////////////////////
	try{
		var ctrl;
		if (document.all) 
			ctrl = event.srcElement;
		else
			ctrl = event.target;

		if (ctrl.tagName.toLowerCase() == "input"){ 
			//Solo estudiamos el tipo de control si es un input
			if (ctrl.type.toLowerCase() != "hidden" && ctrl.type.toLowerCase() != "submit" && ctrl.type.toLowerCase() != "button")
			{
				// actúa solo para controles que no sean botones
				if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13))
				{   
				    if (event.keyCode && event.keyCode != 9)
						event.keyCode=9;
				}
			}
		}
		else{
			// si no son inputs también aplica
			if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13))
			{
				if (event.keyCode && event.keyCode != 9)
					event.keyCode=9;
			}
		}
			
	}
	catch(e){}
}
*/
function ManejoTabs (strTab){
	///////////////////////////////////
	///Función: Función general para el manejo de "tabs", cambiando la tabla visible y el estilo de los botones
	///Autor: Martin Yasse
	///////////////////////////////////
	var oTabs = document.getElementsByName("btnTab");
	var strNombreTab="tab" + strTab;
	
	//try{
		
		for(i=0;i<oTabs.length;i++){
			var strNombreTabla ="tbl" + Right(oTabs[i].id, Len(oTabs[i].id)-3);
			var oTabla = document.getElementById(strNombreTabla);
			if (strNombreTab == oTabs[i].id){
				//Cambio de clase a seleccionado
				oTabs[i].className = "BotonTabSeleccionado";
				
				//Ponemos visible la tabla
				oTabla.style.display='';
				}
			else{
				oTabs[i].className = "BotonTab";
				//ocultamos la tabla
				oTabla.style.display='none';
			}
		}
		
		if (document.getElementById("txtTab"))
			document.getElementById("txtTab").value = strTab;
	/*
	}
	catch(e){
		alert("Error en el manejo de tabs, verifique nombres de tablas y botones");
	}
	*/
}

function Enfocar (strControl)
{
///////////////////////////////////
	///Función:		Coloca el cursor sobre un control.
	///Parámetros:	strControl [String] Control que se necesita enfocar
	///Obs:			Si el control está oculto o inhabilitado no dará error.
	///Autor:		Martin Yasse
	///Fecha:		2006-05-31
	///////////////////////////////////
	try{
		if (strControl != "")
		{//El parámetro está indicado
			if (document.getElementById(strControl))
			{//El control existe
				if (document.getElementById(strControl).disabled == false) //No se encuentra deshabilitado
					document.getElementById(strControl).focus();
			}
		}
	}
	catch(e)
	{
		//alert("No se puede enfocar el control " + strControl);
	}
}

function ReplicarValor(event){
	///////////////////////////////////
	///Función: Función para colocar en los onchange de los objetos que replica el valor en un 
	///			control que se llame "svr" + el nombre del original
	///Autor: Martin Yasse
	///////////////////////////////////
	var strNombreControl;
	
	if (document.all)
		strNombreControl = event.srcElement.id;
	else
		strNombreControl = event.target.id;
	
	document.getElementById("svr" + strNombreControl).value = document.getElementById(strNombreControl).value;
}


function fncAyuda(strNombre, strPagina,strFiltro){
	///////////////////////////////////
	///Función: Función para el disparo de las ayudas 
	///Autor: Martin Yasse
	///////////////////////////////////
	var intAlto = 260;
	var intAncho = 500;
	//var strFiltro= ""; //La variable queda lista para agregar filtros 
	
	if ((strNombre=="Actas")&&(strPagina=="Actas")){ //Filtro de actas llamado desde actas
		intAlto = 300;
		intAncho = 750;
	}
	if ((strNombre=="Multas")&&(strPagina=="Actas")){ //Filtro de multas desde actas
		intAlto = 300;
		intAncho = 750;
		strFiltro = document.getElementById("svrTipo").value; //Para filtrar a través del tipo de acta (TR/CN)
	}
	if ((strNombre=="Actas")&&(strPagina=="Sentencia")){ //Filtro de actas llamado desde actas
		intAlto = 300;
		intAncho = 750;
		strFiltro = " AND ESTADO IN ('ER','SP', 'SD') "; //Busca solo actas en rebeldía
	}
	
	var intY = CenterWindowH(intAlto); 
	var intX = CenterWindowW(intAncho);
	
	
	window.open('../Ayudas/Ayuda' + strNombre + '.aspx?Pagina=' + strPagina + "&Filtro=" + strFiltro,'mod' + strNombre, 'left=' + intX + ', top=' + intY + ',height=' + intAlto + ',width=' + intAncho + ',status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes',true);	
}

function CreateCDataNode(NodeName,NodeValue)
{
var oDom;  
var oNodoAux;
var oCData;    
oDom = new ActiveXObject("MSXML2.DOMDocument");
try
{	oCData = oDom.createCDATASection(NodeValue);
	oNodoAux = oDom.createElement(NodeName);

	oNodoAux.appendChild (oCData);

	return oNodoAux;
}
catch(e)
	{oNodoAux = oDom.createNode(1, NodeName, "");
	 oNodoAux.text = NodeValue;
	 return oNodoAux;
	}
}
/**************************************************************
 DetectBrowser: Return a string that contains the current 
                browser name and version used.

 Parameters:

 Returns: String
***************************************************************/
function DetectBrowser()
{
	var temp = navigator.appName;
	temp = temp.toLowerCase();

	if (temp == 'microsoft internet explorer')
		return 'IE' + navigator.appVersion;
	else
		return 'NS' + navigator.appVersion;
}

function Len(string)
{
	if (string == null)
		return (false);

	return String(string).length;
}

function Chr(CharCode)
{
	return String.fromCharCode(CharCode);
}

function Asc(string)
{
	var symbols = " !\"#$%&'()*+'-./0123456789:;<=>?@";
	var loAZ = "abcdefghijklmnopqrstuvwxyz";
	symbols += loAZ.toUpperCase();
	symbols += "[\\]^_`";
	symbols += loAZ;
	symbols += "{|}~";
	var loc;
	loc = symbols.indexOf(string);
	if (loc > -1)
	{ 
		Ascii_Decimal = 32 + loc;
		return (32 + loc);
	}
	return (0);
}

function LTrim(String)
{
	var i = 0;
	var j = String.length - 1;

	if (String == null)
		return (false);

	for (i = 0; i < String.length; i++)
	{
		if (String.substr(i, 1) != ' ' && String.substr(i, 1) != '\t')
			break;
	}

	if (i <= j)
		return (String.substr(i, (j+1)-i));
	else
		return ('');
}

function RTrim(String)
{
	var i = 0;
	var j = String.length - 1;

	if (String == null)
		return (false);

	for(j = String.length - 1; j >= 0; j--)
	{
		if (String.substr(j, 1) != ' ' && String.substr(j, 1) != '\t')
		break;
	}

	if (i <= j)
		return (String.substr(i, (j+1)-i));
	else
		return ('');
}

function Trim(String)
{
	if (String == null)
		return (false);

	return RTrim(LTrim(String));
}

function Left(String, Length)
{
	if (String == null)
		return (false);

	return String.substr(0, Length);
}

function Right(String, Length)
{
	if (String == null)
		return (false);

    var dest = '';
    for (var i = (String.length - 1); i >= 0; i--)
		dest = dest + String.charAt(i);

	String = dest;
	String = String.substr(0, Length);
	dest = '';

    for (var i = (String.length - 1); i >= 0; i--)
		dest = dest + String.charAt(i);

	return dest;
}

function Mid(String, Start, Length)
{
	if (String == null)
		return (false);

	if (Start > String.length)
		return '';

	if (Length == null || Length.length == 0)
		return (false);

	return String.substr((Start - 1), Length);
}

function Replace(Expression, Find, Replace)
{
	var temp = Expression;
	var a = 0;

	for (var i = 0; i < Expression.length; i++) 
	{
		a = temp.indexOf(Find);
		if (a == -1)
			break;
		else
			temp = temp.substring(0, a) + Replace + temp.substring((a + Find.length));
	}

	return temp;
}

function IsNumber(Expression)
{
	Expression = Expression.toLowerCase();
	RefString = "0123456789.,-";
	
	if (Expression.length < 1) 
		return (false);

	for (var i = 0; i < Expression.length; i++) 
	{
		var ch = Expression.substr(i, 1);
		var a = RefString.indexOf(ch, 0);
		if (a == -1)
			return (false);
	}
	return(true);
}

/************************************************************************************************************************************************
'Page:	ShowPromptPage
'------------------------------------------------------------------------------------------------------------------------------------------------
'Parameters:Message,Buttons,Title,DefaultButton
' Message: Mensaje que se muestra
' Buttons: Botones que se muestran "Yes|No|Retry" Se muestran en ese orden
' Title:   Titulo de la ventana
' DefaultButton: Boton por defecto 
'------------------------------------------------------------------------------------------------------------------------------------------------
'Description: Pagina para Mostrar Mensajes modales
'------------------------------------------------------------------------------------------------------------------------------------------------
'Author:M D
'Date: 04/04/2002
'Valor de Retorno: 
'	0 - No o Cierra la Pagina sin hacer Click
'	1 - Yes
'	2 - Cancel
'	3 - Retry
'	4 - Abort
'------------------------------------------------------------------------------------------------------------------------------------------------
'Image: Nro de imagen
'************************************************************************************************************************************************/
function ShowPromptPage(Message,Buttons,Title,DefaultButton,Image)
{
	var a=window.showModalDialog ("../Includes/PromptPage.asp?Message=" + Message + "&Buttons=" + Buttons + "&Title=" + Title + "&DefaultButton=" + DefaultButton ,"ModalDialog", "dialogWidth:19; dialogHeight:8; status=no" );
	//, top=100, height=500, width=720, status=no,scrollbars=yes, toolbar=no, menubar=no, location=no
	return (a);
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function CenterWindowH(screenheight)
{
	var intTop = window.screen.height - screenheight; 
	
	if (intTop<1)
		intTop = 0;
	else
	 intTop = intTop/2;
	
	return (intTop);
}

function CenterWindowW(screenwidth)
{
	var intLeft = window.screen.width - screenwidth;
	
	if (intLeft<1)
	 intLeft = 0;
	else
	 intLeft = intLeft/2;

	return (intLeft);
}

function LimpiarControlesDeTabla(strTabla){
	///////////////////////////////////
	///Función: Limpia todos los controles existentes en una tabla
	///Autor: Martin Yasse
	///////////////////////////////////
	try{
	//Limpieza de los controles tipo Input (text, hidden, button)
		var intCount = document.getElementById(strTabla).getElementsByTagName("INPUT").length;
		
		var i;
		for (i=0;i<intCount;i++){
			if (document.getElementById(strTabla).getElementsByTagName("INPUT").item(i).type!="button")
				document.getElementById(strTabla).getElementsByTagName("INPUT").item(i).value = "";
		}
	
	//Limpieza de los controles tipo Select (combos)
		intCount = document.getElementById(strTabla).getElementsByTagName("SELECT").length;
		for (i=0;i<intCount;i++){
			document.getElementById(strTabla).getElementsByTagName("SELECT").item(i).value = "0";
		}
	}
	catch(e){
		alert("Error en función de limpieza de controles de tabla. Descripción: " + e.description);
	}
}

function HabDesControlesDeTabla(strTabla, strAccion){
	///////////////////////////////////
	///Función: Deshabilita o habilita todos los controles existentes en una tabla
	///Autor: Martin Yasse
	///Parámetros:	strTabla [String]: Nombre de la tabla que contiene los controles
	///				strAccion [String H/D]: Indicador para (H)abilitar y (D)eshabilitar
	///////////////////////////////////
	try{
		var bDisabled;
		strAccion = strAccion.toUpperCase();
		if (strAccion=="D")
			bDisabled = true;
		else
			bDisabled = false;
			
	//Des/habilitación de los controles tipo Input (text, hidden, button)
		var intCount = document.getElementById(strTabla).getElementsByTagName("INPUT").length;
		var i;
		for (i=0;i<intCount;i++){
			document.getElementById(strTabla).getElementsByTagName("INPUT").item(i).disabled = bDisabled;
		}
	
	//Des/habilitación de los controles tipo Select (Combos)
		intCount = document.getElementById(strTabla).getElementsByTagName("SELECT").length;
		for (i=0;i<intCount;i++){
			document.getElementById(strTabla).getElementsByTagName("SELECT").item(i).disabled = bDisabled;
		}
	
	//Des/habilitación de los controles tipo imágenes
		intCount = document.getElementById(strTabla).getElementsByTagName("IMG").length;
		for (i=0;i<intCount;i++){
			document.getElementById(strTabla).getElementsByTagName("IMG").item(i).disabled = bDisabled;
		}
		document.getElementById(strTabla).disabled = bDisabled;
	}
	catch(e){
		alert("Error en función de Des/habilitación de controles de tabla. Descripción: " + e.description);
	}
}

function InStr(String1, String2)
{
	var a = 0;

	if (String1 == null || String2 == null)
		return (false);

	String1 = String1.toLowerCase();
	String2 = String2.toLowerCase();

	a = String1.indexOf(String2);
	if (a == -1)
		return 0;
	else
		return a + 1;
}


function fncCompletarCadena(strCadena, intCantidad, strCaracter, strDireccion){

	////////////////////////////////////////////////
	///Función: Completa una cadena de caracteres hasta el nº indicado con el caracter indicado
	///Parámetros:	strCadena[String]: Cadena a completar
	///				intCantidad [Integer]:	Largo de la cadena final
	///				strCaracter [String]:	Caracter con la que se rellena
	///				strDireccion [String L|R]:	Dirección si se completa hacia la izquierda o derecha
	///Ejemplo:	strValor1 = fncCompletarCadena(strValor1, 5, "0", "L");
	///Autor:	Martín Yasse
	///Fecha:	2005-09-29
	////////////////////////////////////////////////
	var i =0;
	var strReturn;
	strReturn = strCadena;
	
	if (strCadena.length < intCantidad){
		strDireccion = strDireccion.toUpperCase();
	
		for (i=strCadena.length; i < intCantidad; i++){
			if (strDireccion == "L")
				strReturn = strCaracter + strReturn;
			if (strDireccion == "R")
				strReturn = strReturn + strCaracter;
		}
	}
		
	return strReturn;
}


function FocoPrimerControl()
{
	///////////////////////////////////////
	// lleva el foco al primer control
	// que se encuentre activo y visible
	///////////////////////////////////////
	if ((document.forms.length > 0) && (document.forms[0].elements.length > 0)) {
		var i,e;
		for (i=0; i<document.forms[0].elements.length; i++) {
			e = document.forms[0].elements[i];
			if ((e.disabled == false) && (e.style.visibility.toLowerCase() != "hidden") && (e.type.toLowerCase() != "hidden")){
				e.focus();
				break;
			}
		}
	}
}

function fncMsgbox(strTexto, strClase, strMilisegundos){
	///////////////////////////////////
	///Función:			Función para mostrar un mensaje por un tiempo determinado
	///Parámetros:		strTexto[String]:	Texto a mostrar en el mensaje
	///					strClase [String]:	Clase del mensaje. Ej: MensajeError|MensajeGuardado
	///					strMilisegundos [String]: Cantidad de milisegundos para mostrar el mensaje (default=2500)
	///												0 - La pantalla no se cierra.
	///Observaciones:	Utiliza la página MsgForm.aspx
	///Autor:			Martin Yasse
	///Fecha:			2005-10-05
	///////////////////////////////////
	var intAlto = 150;
	var intAncho = 300;

	var intY = CenterWindowH(intAlto); 
	var intX = CenterWindowW(intAncho);
	if (strMilisegundos == undefined)
		strMilisegundos = "2000"; //2 segundos
	
	window.open('../Inc/MsgForm.aspx?Texto=' + strTexto + "&Clase=" + strClase + '&CerrarEn=' + strMilisegundos, 'Mensaje', 'left=' + intX + ', top=' + intY + ',height=' + intAlto + ',width=' + intAncho + ',status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=no',true);
}

function EscapeCierra(event){
	///////////////////////////////////
	///Función:			Para cerra una pantalla cuando se presiona la tecla escape
	///Observaciones:	Se creó para poder cerrar las ventanas de ayuda
	///Autor:			Martin Yasse
	///Fecha:			2005-10-06
	///////////////////////////////////
	try{
		if ((event.which && event.which == 27) || (event.keyCode && event.keyCode == 27)){
			window.close();
		}
	}
	catch(e){}
}

function ManejoMensajes()
{
	///////////////////////////////////
	///Función:			Oculta el mensaje luego de mostrarlo un tiempo
	///Parámetros:		
	///Observaciones:	Quita los valores, luego de un tiempo, de un TD con id "TDMensaje"
	///Autor:			Martin Yasse
	///Fecha:			2006-07-07
	///////////////////////////////////
	try{
		oTDMensaje = document.getElementById("TDMensaje");
		var iTime = 1000;
		if (oTDMensaje){
			if (oTDMensaje.innerText != ""){
				window.setTimeout("oTDMensaje.innerText = '';",iTime);
			}
		}
	
	}
	catch(e){}
}

function OnTimeOutWS(arg) {
    ///////////////////////////////////
	///Función:			Función genérica para ser utilizada como time out de los servicios web
	///Parámetros:		arg [String]: Argumento del servicio web
	///Observaciones:	
	///Autor:			Martin Yasse
	///Fecha:			2007/08/02
	///////////////////////////////////
    alert("Tiempo de espera agotado del servicio web: " + arg);
}

function OnErrorWS(arg) {
    ///Función:			Función genérica para ser utilizada como control de errores de servicios web
	///Parámetros:		arg [String]: Argumento del servicio web
	///Observaciones:	
	///Autor:			Martin Yasse
	///Fecha:			2007/08/02
	///////////////////////////////////
    alert("Error en el servicio web:" + arg);
}


var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function MyEncodeJS(input) {
    ///////////////////////////////////
	///Función: Encriptación js
	///Autor: Martin Yasse
	///Fecha: 2007-08-03
	///////////////////////////////////

   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function MyDecode64(input) {
    ///////////////////////////////////
	///Función: Encriptación js
	///Autor: Martin Yasse
	///Fecha: 2007-08-03
	///////////////////////////////////
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}

//////////////////////////////////////////////////////////
//Función: Obtiene una fecha de un control tipo calendario
//Obs.: - No realiza validación de fecha válida.
//      - Incluye hora y minuto si es que el control los contiene
//Autor: Martín Yasse
//Fecha: 2007-12-06
//////////////////////////////////////////////////////////
function fncObtenerFecha(strControlFecha){
    
	var strReturn = document.getElementById(strControlFecha + "$txtCalendario").value;
	
	return (strReturn);
}

//////////////////////////////////////////////////////////
//Función: Permite la utilización del "." una vez por control
//Obs.: - Utilizada cuando el tipo de mascara es numérico con los controles MyMascara
//      - Incluye la funcionalidad PasoConEnter
//Autor: Martín Yasse
//Fecha: 2008-05-27
//////////////////////////////////////////////////////////
function fncManejoMascaraNumerica(field, event){
    var bReturn = true;
    alert(field.value);
    try{
        var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
        if (keyCode == 110){
            if (InStr(field.value, ".") > 0){
                var intPosicionCursor = ObtenerPosicion(field);
                //Si el caracter que se está reemplazando es justamente el punto se permite la escritura
                if (Mid(field.value,intPosicionCursor+1, 1) == ".")
                    bReturn = true;
                else
                    bReturn = false;
            }
            else
                bReturn = true;
        } 
        if (keyCode == 13) {
            var i;
            for (i = 0; i < field.form.elements.length; i++){
                if (field == field.form.elements[i])
                    break;
            }
            i = (i + 1) % field.form.elements.length;
            
            //Validación especial para controles del tipo MyCalendar2
            var intloc = field.form.elements[i].name.indexOf("$MEE_ClientState");
            
            if (intloc > -1){ 
                var strControl = field.form.elements[i].name;
                strControl = Replace(strControl, "$MEE_ClientState", "$txtCalendario")
                document.getElementById(strControl).focus();
            }
            else
                field.form.elements[i].focus();
            
            //Solo si se trata de un input y este se encuentra habilitado se selecciona el texto
            if (field.form.elements[i].tagName.toLowerCase() == "input"){ 
                if (field.form.elements[i].disabled == false)
                    field.form.elements[i].select();
            }
            bReturn = false;
        } 
            
        return bReturn;
    }
    catch(e){
        return false;
    }
}


//////////////////////////////////////////////////////////
//Función: Obtiene la posición del cursor en un control textbox (aspx o html)
//Obs.: 
//Autor: Martín Yasse
//Fecha: 2008-03-13
//////////////////////////////////////////////////////////
function ObtenerPosicion(Control) {

	if (Control.createTextRange) {
		var r = document.selection.createRange().duplicate();
		r.moveEnd('character', Control.value.length);
		if (r.text == '') 
		    return Control.value.length;
		return Control.value.lastIndexOf(r.text)
	}
	else 
	    return Control.selectionStart;
}

//////////////////////////////////////////////////////////
//Función: Función para aplicar filtro de caracteres permitidos en los controles tipo moneda
//Obs.: Incluye funcionalidad del paso con enter
//Autor: Martín Yasse
//Fecha: 2008-04-28
//////////////////////////////////////////////////////////
function fncManejoControlMoneda(field, event, bAceptaNegativos, bAceptaDecimales, cSeparadorDecimales, iMaximoDecimales){
    var bReturn = true;
    
    try{
        var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
        
        //Validación de caracteres numéricos
        var strKeyCodeSeparador1 = '0';
        var strKeyCodeSeparador2 = '0';
        if (cSeparadorDecimales == '.'){
            strKeyCodeSeparador1 = 110;
            strKeyCodeSeparador2 = 190;
        }
        if (cSeparadorDecimales == ',')
            strKeyCodeSeparador1 = 188;
        //Se permiten: Los rangos numéricos (48-57 y 96-105), Delete (8), Tab(9), Cursores izq y derecha (37 y 39), suprimir(46), Inicio(36), Fin(35), Insert(45)
        if ((keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105) || (keyCode == 8)  || (keyCode == 9) || (keyCode == 37) || (keyCode == 39) || (keyCode == 46) || (keyCode == 35) || (keyCode == 36) || (keyCode == 45)){
            bReturn = true;
            
            //Si se trata del separador de decimales y no se permiten decimales, no se permite el mismo.
            if ((keyCode == strKeyCodeSeparador1 || keyCode == strKeyCodeSeparador2) && bAceptaDecimales == false)
                bReturn = false;
            
            //Si se trata de una "," y el separador de decimales es "." no se permite
            if (cSeparadorDecimales == '.' && keyCode == 188)
                bReturn = false;
                
            //Si se trata de un "." y el separador de decimales es "," no se permite
            if (cSeparadorDecimales == ',' && keyCode == 110)
                bReturn = false;
        }
        else
            bReturn = false;
        
        //Análisis de si acepta negativos
        if (keyCode == 109){
            if (bAceptaNegativos == false)
                bReturn = false;
            else{
                if (InStr(field.value, "-") > 0)//Si ya tiene ya indicado el negativo se lo quita
                    field.value = Replace(field.value, "-", "");
                else
                    field.value = "-" + field.value;
                bReturn = false;
            }
        }
        
        //Análisis del separador de decimales
        if (keyCode == strKeyCodeSeparador1 || keyCode == strKeyCodeSeparador2){
            if (bAceptaDecimales == false)
                bReturn = false;
            else{
                if (InStr(field.value, cSeparadorDecimales) > 0){
                    var intPosicionCursor = ObtenerPosicion(field);
                    //Si el caracter que se está reemplazando es justamente el separador de decimales se corre el cursor
                    if (Mid(field.value,intPosicionCursor+1, 1) == cSeparadorDecimales && document.all){
                        event.keyCode=39;//Si bien solo en IE corre el cursor, en los demás no permite mas de un separador de decimales
                        bReturn = true;
                    }
                    else
                        bReturn = false;
                }
                else
                    bReturn = true;
            }
        }
        
        //Control de máximo de decimales
        var strMaxDecimales = iMaximoDecimales;
        //alert(iMaximoDecimales);
        var strDecimalesActuales;
        if (field.value.indexOf(cSeparadorDecimales) >= 0){
            //Tiene separador de decimales agregado
            strDecimalesActuales = field.value.length - field.value.indexOf(cSeparadorDecimales) - 1;
            if (strDecimalesActuales >= strMaxDecimales){
               //La cantidad de decimales excede el máximo 
                if ((keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105)){
                    //Está intentando agregar un número
                    if (ObtenerPosicion(field) > field.value.indexOf(cSeparadorDecimales)){
                        //Lo está agregando luego del separador de decimales
                        bReturn = false;
                    }
                }
            }
        }
        
        //Análisis del paso con enter
        if (keyCode == 13) {
            var i;
            for (i = 0; i < field.form.elements.length; i++){
                if (field == field.form.elements[i])
                    break;
            }
            i = (i + 1) % field.form.elements.length;
            
            //Validación especial para pasar al foco a controles del tipo MyCalendar2
            var intloc = field.form.elements[i].name.indexOf("$MEE_ClientState");
            if (intloc > -1){ 
                var strControl = field.form.elements[i].name;
                strControl = Replace(strControl, "$MEE_ClientState", "$txtCalendario")
                document.getElementById(strControl).focus();
            }
            else
                field.form.elements[i].focus();
            
            //Solo si se trata de un input y este se encuentra habilitado se selecciona el texto
            if (field.form.elements[i].tagName.toLowerCase() == "input"){ 
                if (field.form.elements[i].disabled == false)
                    field.form.elements[i].select();
            }
            bReturn = false;
        } 
            
        return bReturn;
    }
    catch(e){
        return false;
    }
}

//////////////////////////////////////////////////////////
//Función: Función adicional al control de moneda para completar con "0" los decimales
//Obs.: 
//Autor: Martín Yasse
//Fecha: 2008-04-28
//////////////////////////////////////////////////////////
function fncCompletarDecimales(field, iCantidadDecimales, cSeparadorDecimales){
    try{
        var iCantidadDecimalesFaltantes = 0;
        var iPosicionSeparador;
        if (Len(field.value) > 0 && iCantidadDecimales != 0){//Se ha indicado una cantidad de decimales a completar
            iPosicionSeparador = field.value.indexOf(cSeparadorDecimales);
            if (iPosicionSeparador == -1){//No tiene decimales actualmente
                iCantidadDecimalesFaltantes = iCantidadDecimales;
                field.value += cSeparadorDecimales;
            }
            else{//Tiene el separador de decimales
                var iDecimalesActuales = Len(field.value) - (iPosicionSeparador+1);
                iCantidadDecimalesFaltantes = iCantidadDecimales - iDecimalesActuales;
                if (iCantidadDecimalesFaltantes < 0)
                    iCantidadDecimalesFaltantes = 0;
            }
            
            for (var i= 0 ; i < iCantidadDecimalesFaltantes ; i++){
                field.value += "0";
            }
        }
        
        if (field.value.indexOf(cSeparadorDecimales) == 0){
            field.value = "0" + field.value;
        }
        
    }
    catch(e){
        return false;
    }
}

//////////////////////////////////////////////////////////
//Función: Función para ocultar inputs en una determinada cantidad de milisegundos
//Obs.: Creada para ocultar mensajes de "Datos guardados"
//Autor: Martín Yasse
//Fecha: 2008-06-13
//////////////////////////////////////////////////////////
function fncOcultarInput(strInputId, intMiliSegundos){
    
    window.setTimeout("document.getElementById('" + strInputId + "').style.display='none';",intMiliSegundos);
}

function fncKeyPress(e) {
    if (window.event) // IE 
    {
        if (e.keyCode != 8 && e.keyCode != 0 && (e.keyCode < 48 || e.keyCode > 57)) {
            return false;
        }
    }
    else {
        if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
            return false;
        }
    }
}

//Funcion para que solo permita el ingreso de numeros y el punto en una caja de texto.
function fncKeyPressDecimales(e) {
    if (window.event) // IE 
    {
        if (e.keyCode != 8 && e.keyCode != 0 && e.keyCode != 46 && (e.keyCode < 48 || e.keyCode > 57)) {
            return false;
        }
    }
    else {
        if (e.which != 8 && e.which != 0 && e.which != 46 && (e.which < 48 || e.which > 57)) {
            return false;
        }
    }
}

