/******************************************************************************
 page.js: Script común para todas  las páginas
 ------------------------------------------------------------------------------
 Copyright (c) enVision.
 ******************************************************************************/


/// -----------------------------------------------------------------------------
/// <summary>
/// Cerrar y volver a la web de AIE (http://www.aie.es/home.asp)
/// HACK: De momento, sólo se cierra la ventana ...
/// </summary>
function returnAIE() {
	/*window.opener.location = "http://www.aie.es/home.asp"; */
	/*closeWindowOpener(); -> no porque cierra también 'www.aie.es' */
	closeTopWindow();
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Abrir el fichero de ayuda del AIE (pdf/Ayuda.pdf) en una ventana
/// </summary>
function openAyudaAIE() {
	window.open('pdf/Ayuda.pdf',openWindowTarget,'width=681,height=410,status=no,toolbar=no,menubar=no,location=no,directories=no,resizable=yes,tittlebar=no,scrollbars=no,top=50,left=50');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Abrir la página de Atención al socio AIE (inquiero)
/// </summary>
function openAtSocioAIE() {
    //window.open('aie_goto_atsocio.aspx','_blank','width=800,height=600,status=no,toolbar=no,menubar=no,location=no,directories=no,resizable=yes,tittlebar=no,scrollbars=yes,top=0,left=0');
    window.open('aie_goto_atsocio.aspx','_blank','width=800,height=600,status=no,toolbar=no,menubar=no,location=no,directories=no,resizable=yes,tittlebar=no,scrollbars=yes,top=0,left=0');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Mensaje (alt) para la página de Atención al socio AIE (inquiero)
/// </summary>
var msgAtSocioAIE = "Ayuda on-line por internet. Su PC será tomado por control remoto para realizar el soporte. Contacte primeramente con atención al socio de AIE al teléfono 917819850";

/// -----------------------------------------------------------------------------
/// <summary>
/// Destino de window.open(..., sName, ...) para abrir un 'popup'
/// HACK: En Mac, _blank abre una ventana 'dummy'.
/// </summary>
var openWindowTarget = isMacPlatform() ? "_self" : "_blank";
var openTargetPDF    = isMacPlatform() ? "_self" : "_blank";

/// -----------------------------------------------------------------------------
/// <summary>
/// Redirigir la página a los Servicios Premium, con argumentos
/// </summary>
/// <param name="cdpagina"></param>
/// <param name="searchterm"></param>
function gotoPremium(cdpagina, searchterm) {
    if(!searchterm) searchterm = "";
    // Redirigir:
	window.location = 
		"aie_goto_premium.aspx" + 
		"?cdpagina=" + cdpagina +
		"&searchterm=" + searchterm +
		"&searchinit=1" +
		"&entrada=PREMIUM" + 
		"&repertorioid=" + 
		"&tipo=1" + 
		"&pag=1"
		;
	//window.status = "Los Servicios Premium están actualmente en construcción. Disculpe las molestias.";
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Redirigir la página a los Servicios Premium, con argumentos
/// </summary>
/// <param name="cdpagina"></param>
/// <param name="ctrl"></param>
function gotoPremiumBuscar(cdpagina, ctrl) {
	if (ctrl.value != null && ctrl.value != "") {
		if (ctrl.value.length < 2) {
			alert("Introduzca al menos dos caracteres para buscar contenidos. Gracias.");
		} 
		else {
			gotoPremium(cdpagina/*='BUSCADORRESULT'*/, ctrl.value);
		}
	} else {
		alert("Introduzca un término de búsqueda.");
	}
}


/// -----------------------------------------------------------------------------
/// <summary>
/// Abrir una ventana con la la página de Correo (https://webmail.socios.aie.es/")
/// </summary>
function abrirCorreo() { 
  //window.open("https://webmail.socios.aie.es/",openWindowTarget,"toolbar=yes,status=no,scrollbars=yes,location=no,menubar=no,directories=no,width=800,height=500");
  window.open("aie_webmail_socios.htm",openWindowTarget,"toolbar=yes,status=no,scrollbars=yes,location=no,menubar=no,directories=no,width=800,height=500");
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Establecer foco en un control por su nombre
/// </summary>
/// <param name="ctrlName"></param>
function setFocus(ctrlName) {
	var ctrl = document.getElementById(ctrlName);
	if (!ctrl.disabled) ctrl.focus();
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Reabrir la ventana en curso con una nueva URL
/// </summary>
/// <param name="newURL"></param>
function reopenWindow(newURL) {
	window.opener=null;
	window.close();
	window.open(newURL);
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Cerrar la ventana en curso
/// </summary>
function closeWindow() {
	window.opener=null; 
	window.close();
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Cerrar la ventana raíz
/// </summary>
function closeTopWindow() {
	window.top.opener=null;
	window.top.close();
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Cerrar la ventana padre (si hay) de la ventana en curso
/// </summary>
function closeWindowOpener() {
	if(window.opener != null && window.opener != 'undefined')  window.opener.close();
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener 'estilo de display visible' ("block" ó "table")
/// </summary>
function getStyleDisplayBlock() {
	//TODO: Implementar 'table' para Safari !!!
	return 'block';
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener 'estilo de display no visible' ("none")
/// </summary>
function getStyleDisplayNone() {
	return 'none';
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener 'ancho de ventana principal'
/// </summary>
function getViewportWidth() {
	if (window.innerWidth!=window.undefined) return window.innerWidth; 
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth; 
	if (document.body) return document.body.clientWidth; 
	return window.undefined; 
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener 'alto de ventana principal'
/// </summary>
function getViewportHeight() {
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight; 
	return window.undefined; 
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Devuelve true si la plataforma es 'Mac'
/// </summary>
function isMacPlatform() {
	return (window.navigator.platform.substr(0,3)=='Mac');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Devuelve true si la plataforma es 'Win'
/// </summary>
function isWinPlatform() {
	return (window.navigator.platform.substr(0,3)=='Win');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Validar entrada de datos en un INPUT, desde 'onkeypress'
/// </summary>
/// <param name="inputCtrl"></param>
/// <param name="valDataType"></param>
/// <param name="stringFilter"></param>
/// <remarks>
/// PARÁMETROS:
/// inputCtrl: Control a validar
/// valDataType: Tipo de datos a restringir (similar a ValidationDataType, de CompareValidator):
///		'':			Sin validación.
///		'String':	Tipo de datos de cadena. 
/// 	'Integer':	Tipo de datos entero de 32 bits con signo. 
/// 	'Double':	Tipo de datos número de punto flotante de precisión doble. 
/// 	'Date':		Tipo de datos de fecha. 
/// 	'Currency':	Tipo de datos decimal que puede contener símbolos de moneda (£, €, $). 
/// stringFilter : Filtro indicado si valDataType es 'String'
/// </remarks>
function validateKey(inputCtrl, valDataType, stringFilter) {
	//(TODO: completar con: http://aspalliance.com/timmusschoot/clientscripting/inputvalidation.aspx)
	//(TODO: Nuevos parámetros para indicar cuál es el caracter decimal, separador de millares, símbolo de moneda en curso ... en función del 'locale')
	
	// Guardar tecla:
	var key = window.event.keyCode; 
	var chr = String.fromCharCode(key); 
	var allowed = '';
	var allowedOnce = '';
	var allowedTwice = '';

	// Definir conjunto de caracteres válidos en función de valDataType (similar a ValidationDataType):
	switch(valDataType) {
		case '': // Todos los caracteres:
			allowed = ''; //'abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ :;,.?!£€$%^&*()_+-*{}@~<>&"\''; 
			break;
		case 'String': // Tipo de datos de cadena:
			allowed = stringFilter; // (puede ser '')
			break;
		case 'Integer': // Tipo de datos entero de 32 bits con signo:
			allowed = '0123456789-';
			allowedOnce = '-';
			break;
		case 'Double':	// Tipo de datos número de punto flotante de precisión doble:
			allowed = '0123456789.-';
			allowedOnce = '.-';
			break;
		case 'Date': // Tipo de datos de fecha:
			allowed = '0123456789/-';
			allowedTwice = '/-';
			break;
		case 'Currency': // Tipo de datos decimal con símbolos de moneda y separadores de millar:
			allowed = '0123456789,.-$€';
			allowedOnce = '.-$€';
			break;
		default: // Error:
			alert('validateKey(): valDataType inválido !!!'); 
			return;
	}
	
	// Comprobar caracteres unicos:
	if(allowedOnce != '') {
		for(var i = 0; i < allowedOnce.length; i++) {
			if(chr != allowedOnce.charAt(i)) continue;
			if(inputCtrl.value.indexOf(allowedOnce.charAt(i)) > -1) {
				window.event.keyCode = 0; return; // caracter inválido; salir.
			}
		}
	}

	// Comprobar caracteres duplicados:
	if(allowedTwice != '') {
		for(var i = 0; i < allowedTwice.length; i++) {
			if(chr != allowedTwice.charAt(i)) continue;
			if(inputCtrl.value.indexOf(allowedTwice.charAt(i)) != 
				inputCtrl.value.lastIndexOf(allowedTwice.charAt(i))) {
				window.event.keyCode = 0; return; // caracter inválido; salir.
			}
		}
	}
	
	// Comprobar caracteres válidos (y no es ENTER):
	if(allowed != '' && key != 13) { 
		if(allowed.indexOf(chr) == -1) {
			window.event.keyCode = 0; return; // caracter inválido; salir.
		}
	}
	
	return;
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Devolver una cadena sin espacios por la izquierda
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
function lTrim(str) {
	var i = 0;
	var j = str.length - 1;

	if(str == null) return(false);

	for(i = 0; i < str.length; i++) {
		if(str.substr(i, 1) != ' ' && str.substr(i, 1) != '\t') break;
	}
	if(i <= j) return(str.substr(i, (j+1)-i));
	else 	   return('');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Devolver una cadena sin espacios por la derecha
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
function rTrim(str) {
	var i = 0;
	var j = str.length - 1;

	if(str == null) return(false);

	for(j = str.length - 1; j >= 0; j--) {
		if(str.substr(j, 1) != ' ' && str.substr(j, 1) != '\t') break;
	}
	if(i <= j) return(str.substr(i, (j+1)-i));
	else 	   return('');
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Devolver una cadena sin espacios por la derecha / izquierda
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
function trim(str) {
	return rTrim(lTrim(str));
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Reemplazar una cadena por otra en una cadena
/// </summary>
/// <param name="str"></param>
/// <param name="oldValue"></param>
/// <param name="newValue"></param>
/// <returns></returns>
function replace(str, oldValue, newValue) {
	var temp = str;
	for(var i = 0; i < str.length; i++) {
		var a = temp.indexOf(oldValue);
		if (a == -1) break;
		temp = temp.substring(0, a) + newValue + temp.substring((a + oldValue.length));
	}
	return temp;
}
 
/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión concuerda con una máscara
/// </summary>
/// <param name="expr"></param>
/// <param name="mask"></param>
/// <remarks>
/// PARAMETROS:
/// expr: expresión a validar
/// mask: máscara, con los siguientes caracteres:
///			9 = sólo números (0..9)
///			X = sólo letras (a..Z ó A..Z)
///			* = cualquiera ...
/// EJEMPLOS:
///		alert(validateMask("(954) 572-4419", "(999) 999-9999")); => true
///		alert(validateMask("33351-820", "99999-9999"));          => false
///		alert(validateMask("This is a test", "XXXXXX"));         => false
///		alert(validateMask("This 34 a test", "**************")); => true
/// </remarks>
/// <returns></returns>
function validateMask(expr, mask) {
	mask = mask.toUpperCase();
	
	var lenExpr = expr.length;
	var lenMask = mask.length;
	var tmpStr = '';
	
	if(lenExpr == 0 || lenMask == 0) return(false);
	if(lenExpr != lenMask) return(false);
	
	for(i = 0; i <= expr.length; i++) {
		var chrExpr = expr.substring(i, i + 1);
		var chrMask = mask.substring(i, i + 1);
		if(chrMask == '9') {
			if(!isNumber(chrExpr)) return(false);
		}
		else if(chrMask == 'X') {
			if(!isChar(chrExpr)) return(false);
		}
		else if(chrMask == '*') {
			if(!isAlphanumeric(chrExpr)) return(false);
		}
		else {
			if(chrMask != chrExpr) return(false);
		}
	}
	return(true);
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión está compuesta por los caracteres indicados
/// </summary>
/// <param name="expr"></param>
/// <param name="chars"></param>
/// <returns></returns>
function validateChars(expr, chars) {
	expr = expr.toLowerCase();
	if (expr.length < 1) return (false);
	if (chars.length < 1) return (false);

	for (var i = 0; i < expr.length; i++) {
		var ch = expr.substr(i, 1)
		if (chars.indexOf(ch, 0) != -1) return(false);
	}
	return(true);
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión está compuesta por caracteres
/// </summary>
/// <param name="expr"></param>
/// <returns></returns>
function isChar(expr) {
	//return !validateChars(expr, "0123456789");
	return validateChars(expr, "abcdefghijklmnopqrstuvwxyz@#$%^&|\\_+-/*=\"!?,.:;'(){}<>[] ");
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión está compuesta por números
/// </summary>
/// <param name="expr"></param>
/// <returns></returns>
function isNumber(expr) {
	return validateChars(expr, "0123456789,.-");
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión está compuesta por caracteres y números
/// </summary>
/// <param name="expr"></param>
/// <returns></returns>
function isAlphanumeric(expr) {
	return validateChars(expr, "abcdefghijklmnopqrstuvwxyz0123456789 ");
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión es un e-mail válido
/// </summary>
/// <param name="expr"></param>
/// <returns></returns>
function isEmail(expr) {
	if (expr == null) return (false);

	var supported = 0;
	if(window.RegExp) {
		var tmpStr = "a";
		var tmpReg = new RegExp(tmpStr);
		if (tmpReg.test(tmpStr)) supported = 1;
	}
	if(!supported) return (expr.indexOf(".") > 2) && (expr.indexOf("@") > 0);
	
	var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
	var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
	
	return (!r1.test(expr) && r2.test(expr));
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Determinar si una expresión es una fecha válida (DD/MM/YYYY ó DD-MM-YYYY)
/// </summary>
/// <param name="dateStr"></param>
/// <returns></returns>
function isDate(dateStr) {
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

	var matchArray = dateStr.match(datePat)
	if (matchArray == null) return false

	day = matchArray[1]
	month = matchArray[3]
	year = matchArray[4]
	
	if (month < 1 || month > 12) return false;
	if (day < 1 || day > 31) return false;
	if ((month==4 || month==6 || month==9 || month==11) && day==31) return false;

	if (month == 2) {
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
		if (day>29 || (day==29 && !isleap)) return false;
	}
	return true;
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener agente de explorador ("MSIE", etc.)
/// </summary>
function getUserAgent() {
	return window.navigator.userAgent; 
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Ver si el agente de explorador es Microsoft Explorer ("MSIE")
/// </summary>
function isUserAgentIE() {
	return getUserAgent().indexOf("MSIE") != -1;
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Obtener versión del explorador
/// </summary>
function getAppVersion() {
	return parseInt(window.navigator.appVersion.charAt(0), 10); 
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Preparar reemplazo de window.alert() por un 'alert HTML' (variables y llamada)
/// </summary>

// Variables:
var useCustomAlert = true;
var urlCustomAlert = "/aie.declaracion.web/aie_alert.htm";
var returnFuncAlert = null;
var nativeAlert = window.alert;

// Tags susceptibles de recibir el foco via TAB (control del foco del fondo):
var gTabbableTags = new Array("A", "BUTTON", "TEXTAREA", "INPUT", "IFRAME");
var gTabIndexes = null;

// Llamada:
var isCustomAlert = false;
if(document.getElementById) {
	isCustomAlert = useCustomAlert;
	window.alert = function(msg) { // -------------------------------------------
		if(useCustomAlert) createCustomAlert(msg); else nativeAlert(msg); 
	}
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Crear reemplazo de window.alert() por un 'alert HTML'
/// </summary>
/// <param name="txt"></param>
function createCustomAlert(msg) {
	// Comprobar si ya existe 'el contenedor':
	if(document.getElementById("popupMask")) return;

	// Desactivar edición de fondo:
	disableTabControls();

	// Crear máscara DIV (transparente):
	var mPopupMask = document.getElementsByTagName("body")[0].appendChild(document.createElement("DIV"));
	mPopupMask.id = "popupMask";

	// Crear contenedor DIV:
	var mPopupContainer = document.getElementsByTagName("body")[0].appendChild(document.createElement("DIV"));
	mPopupContainer.id = "popupContainer";
	mPopupContainer.innerHTML="<div id='popupFrame'><div style='BACKGROUND-COLOR: transparent; text-align: center; width:100%'> <table id='tblAlert' cellSpacing='0' cellPadding='0' width='400' border='0'> <tr><td vAlign='top' width='5'><IMG height='20' src='images/pest_registro_izqdaup.png' width='5' style='filter: chroma(color=#FFFFFF); background-color: transparent;'></td><td class='cabtabla' bgColor='#214163' height='17'>&nbsp;AVISO !</td><td vAlign='top' width='1'><IMG height='20' src='images/pest_registro_dchaup.png' width='9' style='filter: chroma(color=#FFFFFF); background-color: transparent;'></td></tr> <tr> <td width='5' background='images/pest_registro_izqdalado.png'><IMG height='10' src='images/dot_no.gif' width='5' style='filter: chroma(color=#FFFFFF); background-color: transparent;'></td><td vAlign='top' bgColor='#eef2f6'> <table id='Table5' cellSpacing='0' cellPadding='5' width='100%' border='0'><tr class='texto'><td class='texto1azul' id='popupText' vAlign='middle' align='left'>" + replace(msg, "\\n", "\n") + "</td> </tr> </table> <A onmouseover=\"MM_swapImage('Image21','','images/bot_cerrar_on.png',1)\" onmouseout=\"MM_swapImgRestore()\" href='#' id='href1'><IMG id='popupClose' height='19' alt='Cerrar' src='images/bot_cerrar_off.png' onclick=\"restoreTabControls();if(returnFuncAlert != null) returnFuncAlert(this, null);document.body.removeChild(document.getElementById('popupMask'));document.body.removeChild(document.getElementById('popupContainer'));/*document.body.setActive();*/\" width='52' align='right' border='0' name='Image21'></A> </td> <td style='WIDTH: 1px' width='1' background='images/pest_registro_dchalado.png'><IMG height='10' src='images/dot_no.gif' width='9'></td> </tr> <tr> <td width='5'><IMG height='11' src='images/pest_registro_izqdadown.png' width='5'></td> <td background='images/pest_registro_down.png'><IMG height='11' src='images/dot_no.gif' width='100'></td> <td style='WIDTH: 1px' width='1'><IMG height='11' src='images/pest_registro_dchadown.png' width='9'></td> </tr> </table> </div></div>";
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Capturar ENTER desde 'form.onkeydown' para provocar el click en un botón dado
/// </summary>
/// <param name="btn"></param>
/// <param name="event"></param>
/// <returns></returns>
function clickByEnter(btn, event) { // (fnTrapKD)
	if (event.which == 13) 
	{
		event.returnValue = false;
		event.cancel = true;
		btn.focus();
		try
		{
			btn.click();
		}
		catch(e1)
		{
			try
			{
				var evt = document.createEvent("MouseEvents");
				evt.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
				btn.dispatchEvent(evt);
			}
			catch(e2)
			{
			}
		}
		return true;
	}
	return false;
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Desctivar los controles de fondo cuando se lanza una 'ventana HTML' (DIV flotante, IFRAME, ...)
/// </summary>
function disableTabControls() {
	// Desactivar tags susceptibles de recibir el foco via TAB:
	gTabIndexes = disableTabIndexes(gTabbableTags);

	// Si es IE, esconder los SELECT (son 'top most')
	if(isUserAgentIE()) setSelectVisible(false);
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Restaurar los controles de fondo cuando se lanza una 'ventana HTML' (DIV flotante, IFRAME, ...)
/// </summary>
function restoreTabControls() {
	// Activar tags susceptibles de recibir el foco via TAB:
	restoreTabIndexes(gTabbableTags, gTabIndexes);

	// Si es IE, mostrar los SELECT (son 'top most')
	if(isUserAgentIE()) setSelectVisible(true);
}


/// -----------------------------------------------------------------------------
/// <summary>
/// Recorrer los tags predefinidos y desactivar 'recorrido con tab' (para IE)
/// </summary>
/// <param name="tabbableTags"></param>
/// <returns>Lista de 'tabIndex' desactivados, para restaurar luego</returns>
function disableTabIndexes(tabbableTags) {
	var tabIndexes = new Array();
	var i = 0;
	for(var j = 0; j < tabbableTags.length; j++) {
		var tagElements = document.getElementsByTagName(tabbableTags[j]);
		for(var k = 0 ; k < tagElements.length; k++) {
			tabIndexes[i] = tagElements[k].tabIndex; // (guardar para restaurar)
			tagElements[k].tabIndex = "-1"; tagElements[k].tabEnabled = false;
			i++;
		}
	}
	return tabIndexes;
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Recorrer los tags predefinidos y restaurar 'recorrido con tab' (para IE)
/// </summary>
/// <param name="tabbableTags"></param>
/// <param name="tabIndexes"></param>
function restoreTabIndexes(tabbableTags, tabIndexes) {
	var i = 0;
	for (var j = 0; j < tabbableTags.length; j++) {
		var tagElements = document.getElementsByTagName(tabbableTags[j]);
		for (var k = 0 ; k < tagElements.length; k++) {
			tagElements[k].tabIndex = tabIndexes[i]; tagElements[k].tabEnabled = true;
			i++;
		}
	}
}

/// -----------------------------------------------------------------------------
/// <summary>
/// Establecer 'visibilidad' de los SELECT, por problemas 'top most' en IE
/// </summary>
/// <param name="isVisible"></param>
function setSelectVisible(isVisible) {
	var tagElements = document.getElementsByTagName("SELECT");
	for (var i = 0 ; i < tagElements.length; i++) {
		tagElements[i].style.visibility = isVisible ? "" : "hidden";
	}
}


/// -----------------------------------------------------------------------------
/// <summary>
/// Establecer manejador de errores Javascript para onerror
/// </summary>
//%%%%window.onerror = errorHandler;

/// -----------------------------------------------------------------------------
/// <summary>
/// Manejador de errores Javascript
/// </summary>
/// <param name="msg"></param>
/// <param name="url"></param>
/// <param name="lno"></param>
function errorHandler(msg, url, lno) {
  window.status = "ERROR [" + msg + "] en #" + lno + " (" + url + ")" ;
  return true;
}

/* TIPS:
 - Want to keep a window in top of other? 
   use: <body onblur="self.focus()"> on the window you want to keep in top

 - Want to make a textbox read only?
   use: <INPUT TYPE="text" NAME="output" SIZE="30" onFocus="this.blur()">

 - Want to highlight the whole textbox or textarea box?
   use: <INPUT TYPE="text" NAME="output" SIZE="30" onFocus="this.select();">
*/
