
/// <summary>
/// Direccion del buscador (se actualiza desdel servidor)
/// </summary>
//var _APPLICATION_PATH = "/";
/// <summary>
/// Tipo de retorno al cencelar el dialogo
/// </summary>
//var _DLG_CANCEL = "undefined";
/// <summary>
/// Tipo de retorno al cencelar el dialogo
/// </summary>
//var _DLG_NOTHING = "nothing";

/// <summary>
/// Funcion que invoca el buscador y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="evento">Evento que dispara la función</param>
/// <param name="tipoBuscador">Tipo de buscador que se muestra</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
/// <param name="idControlOpcional">Identificador del control opcional</param>
/// <param name="idCompanyia">Identificador de la compañía del diccionario</param>
function InvocarBuscador(evento, tipoBuscador, controlRetorno, idControlOpcional, idCompanyia)
{
    // Obtenemos el control opcional por si es necesario
    var controlOpcional = document.getElementById(idControlOpcional);

    // URL del buscador	
    var url = _APPLICATION_PATH + '/Dialogos/Buscador/Buscador.aspx?tipoBuscador=' + tipoBuscador;

    // Si tenemos control opcional pasamos el parámetro
    if (controlOpcional != null) {
        url += '&valorOpcional=' + controlOpcional.value;
    }

    // Añadimos los parameros de filtro de poblaciones
    if (idCompanyia != null) {
        url += "&idCompanyia=" + idCompanyia;
    }

    if (_DLG_JQUERY) {
        InvocarDialogoJQuery(evento, url, controlRetorno, 700, 350, CerrarAsignarResultado)
        return false;
    }
    else {
        InvocarDialogo(url, controlRetorno, 650, 350)
    }
}

/// <summary>
/// Funcion que invoca el buscador y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="evento">Evento que dispara la función</param>
/// <param name="tipoBuscador">Tipo de buscador que se muestra</param>
/// <param name="controlCP">Control donde se pasa el CP a filtrar</param>
/// <param name="controlCP2">Control donde se pasa el CP2 a filtrar</param>
/// <param name="idCompanyia">Id de la companyia con la que se esta trabajando</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
function InvocarBuscadorPoblaciones(evento, tipoBuscador, controlCP, controlCP2, idCompanyia, controlRetorno)
{        
	// URL del buscador
	var url = _APPLICATION_PATH + '/Dialogos/Buscador/Buscador.aspx?tipoBuscador=' + tipoBuscador;

	// Añadimos los parameros de filtro de poblaciones
	var control;
	var control2;
	control = document.getElementById(controlCP);
	control2 = document.getElementById(controlCP2);
	if (control != null && control.value != "") url += "&cp=" + control.value;
	if (control2 != null && control2.value != "") url += "&cp2=" + control2.value;
	url += "&idCompanyia=" + idCompanyia;

	if (_DLG_JQUERY) {
	    InvocarDialogoJQuery(evento, url, controlRetorno, 700, 350, CerrarAsignarResultado)
	    return false;
	}
	else {
	    InvocarDialogo(url, controlRetorno, 650, 350)
	}
}

/// <summary>
/// Funcion que invoca el buscador y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="evento">Evento que dispara la función</param>
/// <param name="tipoBuscador">Tipo de buscador que se muestra</param>
/// <param name="controlCP">Control donde se pasa el CP a filtrar</param>
/// <param name="controlCP2">Control donde se pasa el CP2 a filtrar</param>
/// <param name="idCompanyia">Id de la companyia con la que se esta trabajando</param>
/// <param name="idContrato">Id del contrato la que se esta trabajando</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
function InvocarBuscadorPoblacionesTraza(evento, tipoBuscador, controlCP, controlCP2, idCompanyia, idContrato, controlRetorno) {
    // URL del buscador
    var url = _APPLICATION_PATH + '/Dialogos/Buscador/Buscador.aspx?tipoBuscador=' + tipoBuscador;
    
    // Añadimos los parameros de filtro de poblaciones
    var control;
    var control2;
    control = document.getElementById(controlCP);
    control2 = document.getElementById(controlCP2);
    if (control != null && control.value != "") url += "&cp=" + control.value;
    if (control2 != null && control2.value != "") url += "&cp2=" + control2.value;
    if (idContrato != null && idContrato.value != "") url += "&idContrato=" + idContrato;
    url += "&idCompanyia=" + idCompanyia;
    
    if (_DLG_JQUERY) {
        InvocarDialogoJQuery(evento, url, controlRetorno, 700, 500, CerrarAsignarResultado);
        return false;
    }
    else {        
        InvocarDialogo(url, controlRetorno, 700, 350);
    }
}

/// <summary>
/// Funcion que invoca el buscador y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="evento">Evento que dispara la función</param>
/// <param name="tipoBuscador">Tipo de buscador que se muestra</param>
/// <param name="controlNIF">Control donde se pasa el NIF a filtrar</param>
/// <param name="controlNombre">Control donde se pasa el nombre a filtrar</param>
/// <param name="controlApellido1">Control donde se pasa el apellido1 a filtrar</param>
/// <param name="controlApellido2">Control donde se pasa el apellido2 a filtrar</param>
/// <param name="controlCodigoHost">Control donde se pasa el codigohost a filtrar</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
function InvocarBuscadorPersonas(evento, tipoBuscador, controlNIF, controlNombre, controlApellido1, controlApellido2, controlCodigoHost, controlRetorno)
{        
	// URL del buscador
	var url = _APPLICATION_PATH + '/Dialogos/Buscador/Buscador.aspx?tipoBuscador=' + tipoBuscador;
	
	// Añadimos los parameros de filtro de personas
	var control;
	control = document.getElementById(controlNIF);
	if (control != null && control.value != "") url += "&nif=" + control.value;
	control = document.getElementById(controlNombre);
	if (control != null && control.value != "") url += "&nombre=%" + control.value + "%";
	control = document.getElementById(controlApellido1);
	if (control != null && control.value != "") url += "&apellido1=%" + control.value + "%";
	control = document.getElementById(controlApellido2);
	if (control != null && control.value != "") url += "&apellido2=%" + control.value + "%";
	control = document.getElementById(controlCodigoHost);
	if (control != null && control.value != "") url += "&codigoHost=" + control.value;

	// Mostrar el diaologo
	if (_DLG_JQUERY) {
	    InvocarDialogoJQuery(evento, url, controlRetorno, 700, 350, CerrarAsignarResultado)
	    return false;
	}
	else {
	    InvocarDialogo(url, controlRetorno, 650, 350)
	}
}

/// <summary>
/// Invoca el dialogo de seleccion de opciones y actualiza los controles
/// que contienen la lista de opciones seleccionadas y la suma de sus
/// valores
/// </summary>
/// <param name="evento">Evento que dispara la función</param>
/// <param name="tipoExtra">Tipo de extras a mostrar (OPCIONES o ACCESORIOS)</param>
/// <param name="idControlRetorno">IdCliente del control donde se devuelve el resultado</param>
/// <param name="idControlListaExtras">IdCliente del control que tiene los elementos seleccionados hasta el momento</param>
/// <param name="idControlVehiculo">IdCliente del control que tiene el identificador del vehiculo</param>
/// <param name="aliasProducto">Alias del producto con la que se trabaja</param>
/// <param name="subTipoExtra">SubTipo del extra a mostrar (SONIDO o NOSONIDO)</param>
/// <param name="mostrarCheck">Indica si muestra o no los checkboxes (True/false)</param>
/// <param name="editarDescripcion">Indica si permite editar o no la descripcion(True/false)</param>
/// <param name="mostrarValor">Indica si muestra o no los valores (True/false)</param>
/// <param name="editarValor">Indica si permite editar o no los valores (True/false)</param>
/// <param name="idControlFecha">IdCliente del control que tiene la fecha de matriculacion</param>
/// <param name="mostrarTipo">Indica si muestra o no el combo de tipos (True/false)</param>
/// <param name="diccionarioTipo">Indica el diccionario que se ha de cargar en el combo de tipos</param>
/// <param name="mostrarContratoMantenimiento">Indica si muestra o no el combo de contratos de mantenimiento (True/false)</param>
/// <param name="diccionarioContratoMantenimiento">Indica el diccionario que se ha de cargar en el combo de contratos de mantenimiento</param>
function InvocarExtras(evento, tipoExtra, idControlRetorno, idControlListaExtras, idControlVehiculo, aliasProducto, subTipoExtra, idControlImporte,
mostrarCheck, editarDescripcion, mostrarNumeroSerie, editarNumeroSerie, mostrarValor, editarValor, mostrarAdicional, editarAdicional, idControlFecha
, mostrarTipo, diccionarioTipo, mostrarTipoAdicional, diccionarioTipoAdicional)
{
	var controlListaExtras = document.getElementById(idControlListaExtras);
	var controlVehiculo = document.getElementById(idControlVehiculo);
	var controlFecha = document.getElementById(idControlFecha);	
	var controlImporte = document.getElementById(idControlImporte);
	var fecha = "";
	var importeExtras = "";
	var idVehiculo = "";

	if (controlVehiculo != null)
		idVehiculo = controlVehiculo.value;
		
	if (controlFecha != null)
		fecha = controlFecha.value;
	
	if (controlImporte != null)
		importeExtras = controlImporte.value;
	
	var url = _APPLICATION_PATH + '/Dialogos/Extras/Extras.aspx';
	url = url.concat("?idVehiculo=", idVehiculo, 
		"&aliasProducto=", aliasProducto, 
		"&tipoExtra=", tipoExtra, 
		"&seleccion=", encodeURI(controlListaExtras.value),
		"&subTipoExtra=", subTipoExtra,
		"&importeExtras=", importeExtras,
		"&mostrarCheck=", mostrarCheck,
		"&editarDescripcion=", editarDescripcion,
		"&mostrarNumeroSerie=", mostrarNumeroSerie,
		"&editarNumeroSerie=", editarNumeroSerie,
		"&mostrarValor=", mostrarValor,
		"&editarValor=", editarValor,
		"&mostrarAdicional=", mostrarAdicional,
		"&editarAdicional=", editarAdicional,
		"&fecha=", fecha,
		"&mostrarTipo=", mostrarTipo,
		"&diccionarioTipo=", diccionarioTipo,
		"&mostrarTipoAdicional=", mostrarTipoAdicional,
		"&diccionarioTipoAdicional=", diccionarioTipoAdicional);

	// Calculamos los anvhos en función del tipo de extra a pintar
	var width = 450;
	var height = 500;
	if (tipoExtra == "VARIOS" || tipoExtra == "LICENCIA")
	{
	    width = 700;
		height = 350;
	}

    if (subTipoExtra == "SECTINCENDIO") {
        width = 900;
        height = 375;
    }
    if (tipoExtra == "OPCION") {
        width = 450;
        height = 700;
    }
	// Invocamos el diálogo
	if (_DLG_JQUERY) {
	    InvocarDialogoJQuery(evento, url, idControlRetorno, width, height, CerrarAsignarResultado)
	    return false;
	}
	else {
	    InvocarDialogo(url, idControlRetorno, width, height);
	}
}

/// <summary>
/// Muestra una ventana con el PDF del proyecto auto a imprimir
/// </summary>
function InvocarImprimirCartaGarantiasAuto(idContrato, idContratosAdicionales)
{
	// Control donde pondremos el retorno de retorno de los datos
	var url = _APPLICATION_PATH + '/Auto/Contratacion/Imprimir.aspx?idContrato=' + idContrato + '&idContratosAdicionales=' + idContratosAdicionales;
	window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes");
}

/// <summary>
/// Invoca el dialogo de seleccion de opciones y actualiza los controles
/// que contienen la lista de opciones seleccionadas y la suma de sus
/// valores
/// </summary>
function InvocarCartaGarantiasAuto(tipoBuscador)
{
	// Dialogo de búsqueda de polizas
	var url = _APPLICATION_PATH + '/Dialogos/Buscador/Buscador.aspx?tipoBuscador=' + tipoBuscador;
	var returnValue = "";
	if (_DLG_JQUERY) {
        $.urlNavReturn = _APPLICATION_PATH + '/Auto/Contratacion/Imprimir.aspx?idContrato=';
        InvocarDialogoJQuery(null, url, null, 650, 350, CerrarNavegarUrl);
	    return false;
	}
	else {
	    returnValue = InvocarDialogo(url, "", 700, 350);
	    // Impresion del PDF
	    if (returnValue != undefined && returnValue != _DLG_CANCEL && returnValue != -1) {
	        var url = _APPLICATION_PATH + '/Auto/Contratacion/Imprimir.aspx?idContrato=' + returnValue;
	        window.open(url);
	    }

	    //	event.returnValue = false;
	}
}

/// <summary>
/// Muestra una ventana con el PDF del proyecto a imprimir
/// </summary>
/// <param name="idContrato">Identificador encriptado del contrato</param>
/// <param name="adicionales">Lista de prodcutos adicionales seleccionados</param>
/// <param name="productos">Lista de productos seleccionados</param>
function InvocarImpimirComparativaAuto(idContrato, adicionales, productos)
{
	// Control donde pondremos el retorno de retorno de los datos
	var url = _APPLICATION_PATH + '/Auto/Comparativa/Imprimir.aspx?idContrato=' + idContrato + '&adicionales=' + adicionales + '&productos=' + productos; 
	//window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, top=" + this.screenTop + ", left=" + this.screenLeft + ", height=" + this.height + ", width=" + this.width);
	window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes");
}

/// <summary>
/// Muestra una ventana con el PDF del proyecto artículo a imprimir
/// </summary>
function InvocarImprimirCartaGarantiasArticulo(idContrato)
{
	// Control donde pondremos el retorno de retorno de los datos
	var url = _APPLICATION_PATH + '/Articulo/Contratacion/Imprimir.aspx?idContrato=' + idContrato;
	window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes");
	return false;	
}

/// <summary>
/// Muestra una ventana con el PDF del proyecto artículo a imprimir
/// </summary>
function InvocarImprimirCartaGarantiasArticuloContratosAnulados(idContrato)
{
	// Control donde pondremos el retorno de retorno de los datos
	var url = _APPLICATION_PATH + '/Articulo/Contratacion/Imprimir.aspx?idContrato=' + idContrato + '&anulados=ANULADOS';
	window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes");	
}

/// <summary>
/// Funcion que invoca el buscador y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="url">URL del dialogo a invocar</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
/// <param name="width">Ancho de la ventana del dialogo</param>
/// <param name="controlRetorno">Alto de la ventana del dialogo</param>
function InvocarDialogo(url, controlRetorno, width, height)
{
    // Muestra el DivLoading para bloquear la pantalla
    ShowDivLoading();
    
    // Control donde pondremos el retorno de retorno de los datos
	returnValue = window.showModalDialog(url,'', 'dialogHeight:' + height + 'px; dialogWidth:' + width + 'px;  center:yes; help:no; resizable:no; status:no;');
	if (controlRetorno != "")
	{
		var control = MM_findObj(controlRetorno);
		control.value = returnValue;
	}
	return returnValue;
	//window.open(url,"", "location=no, menubar=no, resizable=yes, status=no, scrollbars=yes");
}

/// <summary>
/// Asume el RETURN de teclado y dispara el click del boton indicado
/// </summary>
function AceptarReturn(idBoton, evento)
{
	// Recuperamos en el evento (the Firefox o IE)
	if (evento == null) evento = window.event;

	if (idBoton == "") 
	{
		if (evento.keyCode == 13)	// Return
		{
			evento.returnValue = false;
			evento.keyCode = 0;
		}
	}
	else
	{
	    var boton = document.getElementById(idBoton);
		if (boton != null
			&& evento.keyCode == 13)	// Return
		{
			boton.click();
			evento.returnValue = false;
			evento.keyCode = 0;
		}
	}
}

/// <summary>
/// Asume el BACKSPACE de teclado y dispara el click del boton indicado
/// </summary>
function AceptarBackSpace(idBoton, evento) {
    // Recuperamos en el evento (the Firefox o IE)
    if (evento == null) evento = window.event;

    if (idBoton == "") {
        if (evento.keyCode == 8)	// BackSpace
        {
            var targ = null;
            if (evento.target) targ = evento.target;
            else if (evento.srcElement) targ = evento.srcElement;
            
            if (targ != null && targ.nodeType == 3)
            if (targ.nodeType == 3) // defeat Safari bug
                targ = targ.parentNode;
            
            if (targ.id.indexOf('txt') == -1) {
                evento.returnValue = false;
                evento.keyCode = 0;
            }            
        }
    }
    else {
        var boton = document.getElementById(idBoton);
        if (boton != null
			&& evento.keyCode == 8)	// BackSpace
        {
            boton.click();
            evento.returnValue = false;
            evento.keyCode = 0;
        }
    }
}

/// <summary>
/// Funcion que invoca el diálogo jQuery y pone el resultado de la llamada en el control especificado
/// Usualmente una caja de texto, o una etiqueta oculta.
/// El programa deberia tratar en el evento de servidor el resultado de la llamada.
/// </summary>
/// <param name="evento">Evento, para poder conocer el control que lo ha provocado, para posteriormente ejecutar su postback</param>
/// <param name="url">URL del dialogo a invocar</param>
/// <param name="controlRetorno">Control donde se entrega el retorno</param>
/// <param name="ancho">Ancho de la ventana del dialogo</param>
/// <param name="alto">Alto de la ventana del dialogo</param>
/// <param name="callbackFunction">Función de callback</param>
function InvocarDialogoJQuery(evento, url, controlRetorno, ancho, alto, callbackFunction) {

    if (evento) {
        if (evento.srcElement) {
            $.controlOrigen = evento.srcElement.name;
        }
        else {
            $.controlOrigen = evento.target.name;
        }
    }
    $.controlRetorno = controlRetorno;
    //Esperamos un tiempo prudencial para poder comprobar si se va a producir un postback.
    setTimeout("AbrirDialogoJQuery('" + url + "'," + ancho + "," + alto + "," + callbackFunction +")", 100);
}
function gup(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}
/// <summary>
///Función para enviar el height de la ventana a traves del iframe al parent
/// </summary>
function setHeightURL(height) {
    //Obtenemos el url del parent del querystring
    var parent_url = gup("parent_url");
    //Llamada a la función que enviará el height al parent
    if (parent_url != null) {
        setHeight(height);
    }
    //Función que envía el height de la ventana a través del iframe al parent
    function setHeight(height) {
        $.postMessage({ if_height: height }, parent_url, parent);
    };
    
}

function AbrirDialogoJQuery(url, ancho, alto, callbackFunction) {
    //Si se va a producir un postback no abrimos el diálogo (varible informada en evento submit del form)
    if ($.formSubmit != 'true')  {

//        $(window).resize(function () {
//            $(".ui-dialog-content").dialog("option", "position", "center");
//        });
        $dialog = $('<div><iframe id="frameDialogo" style="overflow=hidden;position:absolute;top:0px;left:0px;" frameborder="0"></iframe></div>')
        .dialog({
            autoOpen: false,
            modal: true,
            draggable: false,
            resizable: false,
            position: "center",
            width: ancho,
            height: alto,
            close: function (ev, ui) { $(this).remove(); }
        });
        $("#frameDialogo").attr("src", url);
        $dialog.callbackFunction = callbackFunction;
        $dialog.dialog('open');
        //Buscamos el z-index mayor y sumamos uno para que el diálogo se vea por encima de todos los elementos.
        var maxZ = Math.max.apply(null, $.map($('body > *'), function (e, n) {
            if ($(e).css('position') == 'absolute')
                    return parseInt($(e).css('z-index')) || 1;
            })
        );
        $dialog.parent().zIndex(maxZ + 1);
        $("#frameDialogo").width($dialog.parent().width());
        $("#frameDialogo").height($dialog.height());
        setHeightURL($dialog.height()+150);
        $('.ui-widget-header').removeClass('ui-widget-header').addClass('TablaCabecera Titulo1').css({ 'font-size': '11px', 'height': '15px' });
        $("#frameDialogo").load(function () {
            $dialog.dialog({
                title: $("#frameDialogo").contents().find("title").html()
            });
        });
    }
}

/// <summary>
/// Funcion que deben invocar los botones de aceptar, cancelar, ... del diálogo
/// para devolver el resultado y ejecutar el postback del control origen si es necesario.
/// </summary>
/// <param name="resultado">Resultado de la llamada</param>
function CerrarAsignarResultado(resultado) {
    $("#" + $.controlRetorno).val(resultado);
    $dialog.dialog('close');
    if (resultado != undefined && resultado != _DLG_CANCEL) {
        __doPostBack($.controlOrigen, '');
    }
}

function CerrarNavegarUrl(resultado) {
    $dialog.dialog('close');
    if ($.urlNavReturn) {
        if (resultado != undefined && resultado != _DLG_CANCEL && resultado != -1) {
            //Si no se hace el setTimeout en Firefox no funciona
            setTimeout("window.open('" + $.urlNavReturn + resultado + "')",200);
        }
    }
}

var d;
var objBody;
var divLoading;
var divLoadingOverlay;
var txtUpgradeApplication;
var divUpgradeApplication;
var divUpgradeApplicationOverlay;
var divMensajeError;
var divMensajeErrorOverlay;
var modalDivOverlay;

/// <summary>
/// Muestra el DivLoading en el frame principal
/// </summary>
function ShowDivLoading() {
    HideDivMensajeError();
    if (window.parent.frames[1] != null) {
        d = window.parent.frames[1].document;
        objBody = MM_findObj('theBody', d);
        divLoading = MM_findObj('divLoading', d);
        divLoadingOverlay = MM_findObj('divLoadingOverlay', d);
    }
    else {
        objBody = MM_findObj('theBody');
        divLoading = MM_findObj('divLoading');
        divLoadingOverlay = MM_findObj('divLoadingOverlay');
    }
    if (divLoading != null && divLoadingOverlay != null) {
        divLoading.style.display = 'block';
        divLoadingOverlay.style.display = 'block';
        if (objBody != null) {
//            alert('objBody.scrollTop: ' + objBody.scrollTop);
//            alert('objBody.clientHeight: ' + objBody.clientHeight);
//            alert('objBody.scrollHeight: ' + objBody.scrollHeight);
//            alert('objBody.clientHeight: ' + objBody.clientHeight + ' objBody.scrollHeight: ' + objBody.scrollHeight);
            
            divLoading.style.left = objBody.scrollLeft + (objBody.clientWidth / 2) - (divLoading.clientWidth / 2);
            divLoading.style.top = objBody.scrollTop + (objBody.clientHeight / 2);
            divLoadingOverlay.style.width = objBody.clientWidth;
            divLoadingOverlay.style.height = GetHeight(objBody);
        }
    }
}

/// <summary>
/// Muestra el DivUpgradeApplication en el frame principal
/// </summary>
function ShowDivUpgradeApplication() {
    HideDivMensajeError();
    HideDivLoading();
    if (window.parent.frames[1] != null) {
        d = window.parent.frames[1].document;
        objBody = MM_findObj('theBody', d);
        divUpgradeApplication = MM_findObj('divUpgradeApplication', d);
        divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay', d);
    }
    else {
        objBody = MM_findObj('theBody');
        divUpgradeApplication = MM_findObj('divUpgradeApplication');
        divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay');
    }  
    if (divUpgradeApplication != null && divUpgradeApplicationOverlay != null) {                
        divUpgradeApplication.style.display = 'block';
        divUpgradeApplicationOverlay.style.display = 'block';
        if (objBody != null) {                      
            divUpgradeApplication.style.left = objBody.scrollLeft + (objBody.clientWidth / 2) - (divUpgradeApplication.clientWidth / 2);
            divUpgradeApplication.style.top = objBody.scrollTop + (objBody.clientHeight / 2);
            divUpgradeApplicationOverlay.style.width = objBody.clientWidth;
            divUpgradeApplicationOverlay.style.height = GetHeight(objBody);
        }
    }    
}

/// <summary>
/// Oculta el DivLoading en el frame principal
/// </summary>
function HideDivLoading() {
    try {
        if (window.parent.frames[1] != null) {
            d = window.parent.frames[1].document;
            objBody = MM_findObj('theBody', d);
            divLoading = MM_findObj('divLoading', d);
            divLoadingOverlay = MM_findObj('divLoadingOverlay', d);
        }
        else {
            objBody = MM_findObj('theBody');
            divLoading = MM_findObj('divLoading');
            divLoadingOverlay = MM_findObj('divLoadingOverlay');
        }
        if (divLoading != null && divLoadingOverlay != null) {
            divLoading.style.display = 'none';
            divLoadingOverlay.style.display = 'none';
        }    
    }
    catch (err) {
        //Nothing
    }
}

/// <summary>
/// Oculta el DivMensajeError en el frame principal
/// </summary>
function HideDivMensajeError() {
    try {
        if (window.parent.frames[1] != null) {
            d = window.parent.frames[1].document;
            objBody = MM_findObj('theBody', d);
            divMensajeError = MM_findObj('divMensajeError', d);
            divMensajeErrorOverlay = MM_findObj('divMensajeErrorOverlay', d);
        }
        else {
            objBody = MM_findObj('theBody');
            divMensajeError = MM_findObj('divMensajeError');
            divMensajeErrorOverlay = MM_findObj('divMensajeErrorOverlay');
        }
        if (divMensajeError != null && divMensajeErrorOverlay != null) {
            divMensajeError.style.display = 'none';
            divMensajeErrorOverlay.style.display = 'none';
        }
    }
    catch (err) {
        //Nothing
    }        
}

/// <summary>
/// Oculta el DivUpgradeApplication en el frame principal
/// </summary>
function HideDivUpgradeApplication() {
    try {
        if (window.parent.frames[1] != null) {
            d = window.parent.frames[1].document;
            objBody = MM_findObj('theBody', d);
            divUpgradeApplication = MM_findObj('divUpgradeApplication', d);
            divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay', d);
        }
        else {
            objBody = MM_findObj('theBody');
            divUpgradeApplication = MM_findObj('divUpgradeApplication');
            divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay');
        }
        if (divUpgradeApplication != null && divUpgradeApplicationOverlay != null) {
            divUpgradeApplication.style.display = 'none';
            divUpgradeApplicationOverlay.style.display = 'none';
        }
    }
    catch (err) {
        //Nothing
    }
}

/// <summary>
/// Mantiene el DivLoading, DivUpgradeApplication y el DivMensajeError en el centro y expande los overlays
/// </summary>
function CheckDivsSize() {
    if (window.parent.frames[1] != null) {
        d = window.parent.frames[1].document;
        objBody = MM_findObj('theBody', d);
        divLoading = MM_findObj('divLoading', d);
        divLoadingOverlay = MM_findObj('divLoadingOverlay', d);
        divUpgradeApplication = MM_findObj('divUpgradeApplication', d);
        divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay', d);
        divMensajeError = MM_findObj('divMensajeError', d);
        divMensajeErrorOverlay = MM_findObj('divMensajeErrorOverlay', d);
        modalDivOverlay = MM_findObj('modalDivOverlay', d);
    }
    else {
        objBody = MM_findObj('theBody');
        divLoading = MM_findObj('divLoading');
        divLoadingOverlay = MM_findObj('divLoadingOverlay');
        divUpgradeApplication = MM_findObj('divUpgradeApplication');
        divUpgradeApplicationOverlay = MM_findObj('divUpgradeApplicationOverlay');
        divMensajeError = MM_findObj('divMensajeError');
        divMensajeErrorOverlay = MM_findObj('divMensajeErrorOverlay');
        modalDivOverlay = MM_findObj('modalDivOverlay');
    }
    // divLoading            
    if (divLoading != null && objBody != null) {            
        divLoading.style.left = objBody.scrollLeft + (objBody.clientWidth / 2) - (divLoading.clientWidth / 2);
        divLoading.style.top = objBody.scrollTop + (objBody.clientHeight / 2);
        divLoadingOverlay.style.width = objBody.clientWidth;
        divLoadingOverlay.style.height = GetHeight(objBody);
    }
    // divUpgradeApplication    
    if (divUpgradeApplication != null && objBody != null) {
        divUpgradeApplication.style.left = objBody.scrollLeft + (objBody.clientWidth / 2) - (divUpgradeApplication.clientWidth / 2);
        divUpgradeApplication.style.top = objBody.scrollTop + (objBody.clientHeight / 2);
        divUpgradeApplicationOverlay.style.width = objBody.clientWidth;
        divUpgradeApplicationOverlay.style.height = GetHeight(objBody);
    }
    // divMensajeError        
    if (divMensajeError != null && divMensajeErrorOverlay != null && objBody != null    ) {
        divMensajeError.style.left = objBody.scrollLeft + (objBody.clientWidth / 2) - (divMensajeError.clientWidth / 2);
        divMensajeError.style.top = objBody.scrollTop + (objBody.clientHeight / 2);
        if (objBody != null) {
            divMensajeErrorOverlay.style.width = objBody.clientWidth;
            divMensajeErrorOverlay.style.height = GetHeight(objBody);
        }
    }
    // modalDivOverlay            
    if (modalDivOverlay != null && objBody != null) {
//        alert('objBody.clientHeight: ' + objBody.clientHeight + ' objBody.scrollHeight: ' + objBody.scrollHeight);
        modalDivOverlay.style.width = objBody.clientWidth;
        modalDivOverlay.style.height = GetHeight(objBody);
    }
}

/// <summary>
/// Función para obtener el Height del body 
/// </summary>
function GetHeight(objBody) {
    // Protección
    if (objBody == null) return 0;

    return (objBody.clientHeight > objBody.scrollHeight ? objBody.clientHeight : objBody.scrollHeight);
}

/// <summary>
/// Inicializamos los eventos onScroll y onResize de la pagina para que mantenga el DivLoading y el DivMensajeError en el centro
/// </summary>
window.onscroll = window.onresize = CheckDivsSize;

/// <summary>
/// Convierte un string en valor numérico
/// </summary>
/// <param name=value>Valor del string</param>
function String2Number(value)
{
	value = value.replace(/[^0123456789,]/g, "");	// Elimina caracteres no validos
	value = value.replace(",", ".");	// Cambia el punto decimal
	return Number(value);
}

/// <summary>
/// Expande una fila de la subBand (segundo nivel) de la grid indicada
/// </summary>
/// <param name=tableName>Nombre identificador de la grid</param>
/// <param name=itemName>Nombre identificador del botón que lanza el evento</param>
function NuevaFila(tableName, itemName)
{ 
	// Nueva fila a la band[1] (de la cela seleccionada)
	igtbl_addNew(tableName, 1);
}

/// <summary>
/// cancela la ejecución en cascada del evento
/// </summary>
function CancelBubble()
{
	try
	{
		window.event.cancelBubble = true;
	}
	catch(err)
	{
		//Nothing TODO (en Firefox falla el cancelBubble)
	}
}

/// <summary>
/// Macromedia function for serach object
/// </summary>
function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

/// <summary>
/// Macromedia swap image function
/// </summary>
function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function FuncionAuxiliar(returnValue, cellDatosParametrosAux) {
    cellDatosParametrosAux.setValue(returnValue);
}
