//*****************************************************************************
// Contenido : Librería estandar de MENUS: Funciones y Clases
// Proyecto  : PATANEGRA Soft Web Utilities
// Observs.  : -
//
// Creada    : Jue-15-Jun-2001 / Federico Murcia (FMD)
// Actualiz. : Mié-23-Ene-2002 / Federico Murcia (FMD)
// Copyright : PATANEGRA Soft - Jun 2001 - Sevilla (SPAIN)
//*****************************************************************************


// Valores por defecto
var nPicWidthStd     = 85;                                             // Ancho por defecto de un {Pic} o {PiK}
var nVTabStd         = 4;                                              // Pixels por defecto para un tabulador vertical (VTab)

// Icono por defecto de la llamada de atención
var sRemarkStdFile   = "http://webanterior.feada.org/_sys/pic/bolaamarilla_0013x0013x08_fTm.gif";  // Archivo
var nRemarkStdWidth  = 8;                                              // Ancho por defecto
var nRemarkStdHeight = 8;                                              // Alto por defecto
var bRemarkStdLftPos = false;                                          // ¿Posicionar a la izquierda? (si no, a la derecha)


// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################
//
//    Declaración e inicialización de FUNCIONES
//
// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################


// *******************************************************************************
// Funcion   : Ejecución de código de enlaces JS (TxtJS y PicJS)
// Parametros: 1. (s) Código a ejecutar
// Devuelve  : -
//
// Creada    : Mar-08-Ene-2002 / Federico Murcia (FMD)
// Actualiz. : Mar-08-Ene-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function JSExec(sCode)
{
	// zz eval( sCode );
	alert('Estoy en "JSExec" »' + sCode + '«');
}


// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################
//
//    Declaración e inicialización de CLASES
//
// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################


// **************************************************************************************************************************************************************
// Clase     : Opción de menú
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-31-Dic-2001 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: 1. (s) Selector de hoja de estilo alternativa
//             2. (s) Tipo de item (Ver observaciones)
//             3. (s) Alineación
//             4. (s) Texto o archivo si es un PIC
//             5. (s) URL si es un LNK
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-31-Dic-2001 / Federico Murcia (FMD)
// Observ.   : Tipos de "MenuItem":
//                 1.- ""       : *** Se convertirá en un tipo "Tab" ***
//                 2.- "Nul"    : Celda vacía (En realidad vale cualquier cadena que no coincida con algún otro tipo)
//                 3.- "Tab"    : Tabulador vertical (En base a "nVTabStd" pixels)
//                 4.- "Lin"    : Línea
//                 5.- "Txt"    : Texto
//                 6.- "TxtLnk" : Texto con enlace
//                 7.- "TxtJS"  : Texto con función JavaScript
//                 8.- "Pic"    : Dibujo
//                 9.- "PicLnk" : Dibujo con elace
//                10.- "PicJS"  : Dibujo con función JavaScript
//             El atributo de estilo "sStyle" sólo se usa cuando la opción debe
//             formatearse mediante una tabla específica para la opción. Por
//             ejemplo, cuando tiene que mostrar el icono de llamada de atención,
//             en cuyo caso se crea una tabla con dos celdas
// *******************************************************************************
function Option(sCSSAlt, sType, sAlign, sHTML, sURL)
{
	// ---------- Atributos
	this.sCSS       = sCSSAlt + 'opO';    // CSS
	this.sHTML      = sHTML;              // HTML
	this.sType      = (sType == '' ? 'Tab' : sType).toUpperCase();
	this.sAlign     = (sAlign == 'L' ? 'left' : (sAlign == 'R' ? 'right' : 'center'));
	this.sVAlign    = 'middle';
	this.sURL       = sURL;
	this.sALT       = '';
	this.nPicWidth  = nPicWidthStd;       // Ancho de un {Pic} o {PiK}. Se le asigna el ancho por defecto
	this.nHeight    = '';                 // Alto
	//zz this.bNewWindow = false;              // ¿Abrir el enlace en una ventana nueva?
	this.bRemark    = false;              // Llamada de atención. ¿Tiene?
	this.sRemarkIco = sRemarkStdFile;     // Llamada de atención. Se le asigna el icono por defecto
	this.bRmkLftPos = false;              // Llamada de atención. Se le asigna el posicionamiento por defecto
	this.nRmkWidth  = nRemarkStdWidth;    // Llamada de atención. Se le asigna el ancho por defecto
	this.nRmkHeight = nRemarkStdHeight;   // Llamada de atención. Se le asigna el alto por defecto
	this.nRmkBorder = 0;                  // Llamada de atención. Por defecto 0
	this.sRmkAlign  = 'center';           // Llamada de atención.
	this.sRmkVAlign = 'middle';           // Llamada de atención.
	this.sTabPxTop  = '0';                // Tabulador por pixels. Top
	this.sTabPxBot  = '0';                // Tabulador por pixels. Bottom
	this.sTabPxLef  = '0';                // Tabulador por pixels. Left
	this.sTabPxRig  = '0';                // Tabulador por pixels. Right

	// ---------- Métodos
	this.getOptionHTML = getOptionHTML;
}

// *******************************************************************************
// Método    : Devuelve el código HTML para el despliegue de la opción.
// Parametros: -
// Devuelve  : (s)
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Mié-23-Ene-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function getOptionHTML()
{
	var sAuxParams = '';
	var sRmkAux    = '';
	var sWriteRow  = '';
	var sTabPxTL   = '';
	var sTabPxRB   = '';
	var sAux       = '';

	// Preparar las tabulaciones en pixels para "Top/Left y Right/Bottom"
	sTabPxTL  += (this.sTabPxTop > 0 ? getTblTabHTML(        '100%', this.sTabPxTop) : '');
	sTabPxTL  += (this.sTabPxLef > 0 ? getTblImgHTML(this.sTabPxLef,            '1') : '');
	sTabPxRB  += (this.sTabPxRig > 0 ? getTblImgHTML(this.sTabPxRig,            '1') : '');
	sTabPxRB  += (this.sTabPxBot > 0 ? getTblTabHTML(        '100%', this.sTabPxBot) : '');

	// Inicio de la linea de opcion
	sAuxParams  = '';
	sAuxParams += (this.sCSS             != '' ? 'class="'       + this.sCSS             + '" ' : '');
	sAuxParams += (this.sAlign           != '' ? 'align="'       + this.sAlign           + '" ' : '');
	sAuxParams += (this.sVAlign          != '' ? 'valign="'      + this.sVAlign          + '" ' : '');
	sAuxParams += (this.nHeight          != '' ? 'height="'      + this.nHeight          + '" ' : '');
	sWriteRow  += 	'<tr>';
	sWriteRow  += 		'<td ' + sAuxParams + '>';

	// Si tiene llamada de atención inicializar la tabla de maquetado de opcion
	if(this.bRemark)
	{
		sAuxParams  = '';
		sAuxParams += (this.sCSS             != '' ? 'class="'       + this.sCSS             + '" ' : '');
		sAuxParams += (this.nRmkWidth        != '' ? 'width="'       + this.nRmkWidth        + '" ' : '');

		sRmkAux   +=	'<td ' + sAuxParams + '>';

		sAuxParams  = '';
		sAuxParams += (this.sCSS             != '' ? 'class="'       + this.sCSS             + '" ' : '');
		sAuxParams += (this.sRemarkIco       != '' ? 'src="'         + this.sRemarkIco       + '" ' : '');
		sAuxParams += 'width="'  + this.nRmkWidth  + '" '
		sAuxParams += 'height="' + this.nRmkHeight + '" '
		sAuxParams += 'border="' + this.nRmkBorder + '" '
		sAuxParams += (this.sRmkAlign        != '' ? 'align="'       + this.sRmkAlign        + '" ' : '');
		sAuxParams += (this.sRmkVAlign       != '' ? 'valign="'      + this.sRmkVAlign       + '" ' : '');

		if      (this.sType == "TXTLNK" || this.sType == "PICLNK")
			sRmkAux   += (this.sURL              != '' ? '<a href=' + this.sURL + '>'               : '');
		else if (this.sType == "TXTJS"  || this.sType == "PICJS")
			sRmkAux   += (this.sURL              != '' ? '<a href=javascript:' + this.sURL + '>'    : '');

		sRmkAux   +=		'<img ' + sAuxParams + '>';
		sRmkAux   +=	'</td>';

		if      (this.sType == "TXTLNK" || this.sType == "PICLNK" || this.sType == "TXTJS"  || this.sType == "PICJS")
			sRmkAux   += (this.sURL              != '' ? '</a>'                                     : '');

		sWriteRow += 	'<table border="0" width="100%" cellpadding="0" cellspacing="0" class="' + this.sCSS + '"><tr>';
		sWriteRow += 		(this.bRmkLftPos ? sRmkAux : '');

		sAuxParams  = '';
		sAuxParams += (this.sCSS             != '' ? 'class="'       + this.sCSS             + '" ' : '');
		sAuxParams += (this.nHeight          != '' ? 'height="'      + this.nHeight          + '" ' : '');
		sAuxParams += (this.sAlign           != '' ? 'align="'       + this.sAlign           + '" ' : '');
		sAuxParams += (this.sVAlign          != '' ? 'valign="'      + this.sVAlign          + '" ' : '');

		sWriteRow += 		'<td ' + sAuxParams + '>';
	}
	sWriteRow += sTabPxTL;

	// Determinar el tipo de item y construir el código HTML que le corresponde
	if (this.sType == "TAB")
	{
		sWriteRow += '<img border="0" src="http://webanterior.feada.org/_sys/pic/px_ft.gif" width="1" height="' + nVTabStd + '" ';
		sWriteRow += 'alt="' + this.sALT + '"></td>';
	}
	else
	{
		if (this.sType == "LIN")                 // Else.01 ------------------------------
	{
		sWriteRow += '<hr width="90%" class="' + this.sCSS + '">';
	}
	else { if (this.sType == "TXT")              // Else.02 ------------------------------
	{
		sWriteRow += this.sHTML;
	}
	else { if (this.sType == "TXTLNK")           // Else.03 ------------------------------
	{
		sWriteRow += '<a class="' + this.sCSS + '" href=' + this.sURL + ' ';
		sWriteRow += 'alt="' + this.sALT + '">' + this.sHTML + '</a>';
	}
	else { if (this.sType == "TXTJS")            // Else.04 ------------------------------
	{
		sWriteRow += '<a class="' + this.sCSS + '" href=javascript:' + this.sURL + ' ';
		sWriteRow += 'alt="' + this.sALT + '">' + this.sHTML + '</a>';
	}
	else { if (this.sType == "PIC")              // Else.05 ------------------------------
	{
		sWriteRow += '<img align="' + this.sAlign + '" border="0" src="' + this.sHTML + '" ';
		sWriteRow += 'width="' + this.nPicWidth + '" alt="' + this.sALT + '">';
	}
	else { if (this.sType == "PICLNK")           // Else.06 ------------------------------
	{
		sWriteRow += '<a href=' + this.sURL + '>';
		sWriteRow += 	'<img align="' + this.sAlign + '" border="0" src="' + this.sHTML + '" ';
		sWriteRow += 	'width="' + this.nPicWidth + '" alt="' + this.sALT + '">';
		sWriteRow += '</a>';
	}
	else { if (this.sType == "PICJS")            // Else.07 ------------------------------
	{
		sWriteRow += '<a href=javascript:' + this.sURL + '>';
		sWriteRow += 	'<img align="' + this.sAlign + '" border="0" src="' + this.sHTML + '" ';
		sWriteRow += 	'width="' + this.nPicWidth + '" alt="' + this.sALT + '">';
		sWriteRow += '</a>';
	}

	// Cierre de los "else"
	}   // Else.07
	}   // Else.06
	}   // Else.05
	}   // Else.04
	}   // Else.03
	}   // Else.02
	}   // Else.01

	// Si tiene llamada de atención finalizar la tabla de maquetado de opcion
	if(this.bRemark)
	{
		sWriteRow += 			sTabPxRB;
		sWriteRow += 		'</td>';
		sWriteRow += 		(this.bRmkLftPos ? '' : sRmkAux);
		sWriteRow += 	'</tr></table>';
	}
	else
	{
		sWriteRow += sTabPxRB;
	}

	// Cierre de la linea de opcion
	sWriteRow   += 		'</td>';
	sWriteRow   += 	'</tr>';

	// Código HTML de despliegue del item
	return sWriteRow;
}


// **************************************************************************************************************************************************************
// Clase     : Menú
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Jue-20-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: 1. (s) Selector de hoja de estilo alternativa
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-21-Sep-2001 / Federico Murcia (FMD)
// Observ.   : Por defecto, toma la CSS de "menu.css"
// *******************************************************************************
function Menu(sCSSAlt)
{
	// ---------- Atributos
	this.nVTabBefore      = 0;                  // Tabulación vertical anterior  (en pixels)
	this.nVTabAfter       = 0;                  // Tabulación vertical posterior (en pixels)

	this.sTableCSS        = sCSSAlt + 'mnT';    // Tabla contenedora. CSS
	this.sTableBGColor    = '';                 // Tabla contenedora. Fondo. Color
	this.sTableBGImage    = '';                 // Tabla contenedora. Fondo. Imagen
	this.sTableHPos       = 'center';           // Tabla contenedora. Alineación horizontal
	this.sTableWidth      = '100%';             // Tabla contenedora. Ancho
	this.sTableBorder     = '0';                // Tabla contenedora. Ancho del borde
	this.sTablePadding    = '0';                // Tabla contenedora. Margen de las celdas
	this.sTableSpacing    = '0';                // Tabla contenedora. Espacio entre celdas

	this.sHeadCSS         = sCSSAlt + 'mnH';    // Tabla contenedora. Celda de Cabecera. CSS
	this.sHeadHTML        = '';                 // Tabla contenedora. Celda de Cabecera. HTML
	this.sHeadBGColor     = '';                 // Tabla contenedora. Celda de Cabecera. Fondo. Color
	this.sHeadBGImage     = '';                 // Tabla contenedora. Celda de Cabecera. Fondo. Imagen
	this.sHeadAlign       = 'center';           // Tabla contenedora. Celda de Cabecera. Alineación horizontal
	this.sHeadVAlign      = 'middle';           // Tabla contenedora. Celda de Cabecera. Alineación vertical
	this.sHeadHeight      = '';                 // Tabla contenedora. Celda de Cabecera. Alto
	this.sHeadTabPxTop    = '0';                // Tabla contenedora. Celda de Cabecera. Tabulador por pixels. Top
	this.sHeadTabPxBot    = '0';                // Tabla contenedora. Celda de Cabecera. Tabulador por pixels. Bottom
	this.sHeadTabPxLef    = '0';                // Tabla contenedora. Celda de Cabecera. Tabulador por pixels. Left
	this.sHeadTabPxRig    = '0';                // Tabla contenedora. Celda de Cabecera. Tabulador por pixels. Right
	this.sHeadURL         = '';                 // Tabla contenedora. URL si se quiere que sea un LNK además de una cabecera

	this.sHeadBodyCSS     = sCSSAlt + 'mnHB';   // Tabla contenedora. Celda separadora de Cabecera/Cuerpo. CSS
	this.sHeadBodyHTML    = '';                 // Tabla contenedora. Celda separadora de Cabecera/Cuerpo. HTML
	this.sHeadBodyBGColor = '';                 // Tabla contenedora. Celda separadora de Cabecera/Cuerpo. Fondo. Color
	this.sHeadBodyBGImage = '';                 // Tabla contenedora. Celda separadora de Cabecera/Cuerpo. Fondo. Imagen
	this.sHeadBodyHeight  = '';                 // Tabla contenedora. Celda separadora de Cabecera/Cuerpo. Alto

	this.sBodyCSS         = sCSSAlt + 'mnB';    // Tabla contenedora. Celda de Cuerpo. CSS
	this.sBodyBGColor     = '';                 // Tabla contenedora. Celda de Cuerpo. Fondo. Color
	this.sBodyBGImage     = '';                 // Tabla contenedora. Celda de Cuerpo. Fondo. Imagen
	this.sBodyAlign       = 'center';           // Tabla contenedora. Celda de Cuerpo. Alineación horizontal
	this.sBodyVAlign      = 'middle';           // Tabla contenedora. Celda de Cuerpo. Alineación vertical
	this.sBodyTabPxTop    = '0';                // Tabla contenedora. Celda de Cuerpo. Tabulador por pixels. Top
	this.sBodyTabPxBot    = '0';                // Tabla contenedora. Celda de Cuerpo. Tabulador por pixels. Bottom
	this.sBodyTabPxLef    = '0';                // Tabla contenedora. Celda de Cuerpo. Tabulador por pixels. Left
	this.sBodyTabPxRig    = '0';                // Tabla contenedora. Celda de Cuerpo. Tabulador por pixels. Right

	this.sBodyFootCSS     = sCSSAlt + 'mnBF';   // Tabla contenedora. Celda separadora de Cuerpo/Pie. CSS
	this.sBodyFootHTML    = '';                 // Tabla contenedora. Celda separadora de Cuerpo/Pie. HTML
	this.sBodyFootBGColor = '';                 // Tabla contenedora. Celda separadora de Cuerpo/Pie. Fondo. Color
	this.sBodyFootBGImage = '';                 // Tabla contenedora. Celda separadora de Cuerpo/Pie. Fondo. Imagen
	this.sBodyFootHeight  = '';                 // Tabla contenedora. Celda separadora de Cuerpo/Pie. Alto

	this.sFootCSS         = sCSSAlt + 'mnF';    // Tabla contenedora. Celda de Pie. CSS
	this.sFootHTML        = '';                 // Tabla contenedora. Celda de Pie. HTML
	this.sFootBGColor     = '';                 // Tabla contenedora. Celda de Pie. Fondo. Color
	this.sFootBGImage     = '';                 // Tabla contenedora. Celda de Pie. Fondo. Imagen
	this.sFootAlign       = 'center';           // Tabla contenedora. Celda de Pie. Alineación horizontal
	this.sFootVAlign      = 'middle';           // Tabla contenedora. Celda de Pie. Alineación vertical
	this.sFootHeight      = '';                 // Tabla contenedora. Celda de Pie. Alto
	this.sFootTabPxTop    = '0';                // Tabla contenedora. Celda de Pie. Tabulador por pixels. Top
	this.sFootTabPxBot    = '0';                // Tabla contenedora. Celda de Pie. Tabulador por pixels. Bottom
	this.sFootTabPxLef    = '0';                // Tabla contenedora. Celda de Pie. Tabulador por pixels. Left
	this.sFootTabPxRig    = '0';                // Tabla contenedora. Celda de Pie. Tabulador por pixels. Right
	this.sFootURL         = '';                 // Tabla contenedora. URL si se quiere que sea un LNK además de un pie

	this.sOptionCSS       = sCSSAlt + 'mnO';    // Tabla de Opciones. CSS (El CSS se especifica para tags "table" y "td")
	this.sOptionBGColor   = '';                 // Tabla de Opciones. Fondo. Color
	this.sOptionBGImage   = '';                 // Tabla de Opciones. Fondo. Imagen
	this.sOptionHPos      = 'center';           // Tabla de Opciones. Alineación horizontal
	this.sOptionWidth     = '100%';             // Tabla de Opciones. Ancho
	this.sOptionBorder    = '0';                // Tabla de Opciones. Ancho del borde
	this.sOptionPadding   = '0';                // Tabla de Opciones. Margen de las celdas
	this.sOptionSpacing   = '0';                // Tabla de Opciones. Espacio entre celdas

	this.sOptInterCSS     = sCSSAlt + 'mnOI';   // Tabla de Opciones. Celda separadora de Opciones. CSS
	this.sOptInterHTML    = '';                 // Tabla de Opciones. Celda separadora de Opciones. HTML
	this.sOptInterBGColor = '';                 // Tabla de Opciones. Celda separadora de Opciones. Fondo. Color
	this.sOptInterBGImage = '';                 // Tabla de Opciones. Celda separadora de Opciones. Fondo. Imagen

	this.uOptionLst = new Array();            // Objetos "Option" del menú

	// ---------- Métodos
	this.AddOption  = AddOption;
	this.AddOptArr  = AddOptArr;
	this.MenuDeploy = MenuDeploy;
}

// *******************************************************************************
// Método    : Añade una opción al menú.
// Parametros: 1. (u) Objeto "Option"
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function AddOption(uOption)
{
	this.uOptionLst[this.uOptionLst.length] = uOption;
}

// *******************************************************************************
// Método    : Añade opciones al menú almacenadas en un array
// Parametros: 1. (u) Array de objetos "Option"
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function AddOptArr(uOptArr)
{
	for(var nAux = 0; nAux < uOptArr.length; nAux++)
	{
		this.AddOption(uOptArr[nAux]);
	}
}

// *******************************************************************************
// Método    : Despliega el menú.
// Parametros: -
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-21-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function MenuDeploy()
{
	var sAuxParams = '';
	var sWrite     = '';
	var sTabPxTL   = '';
	var sTabPxRB   = '';

	// Tabulación vertical anterior  (en pixels)
	sWrite += (this.nVTabBefore > 0 ? getTblTabHTML(1, this.nVTabBefore) : '');

	// Inicialización de la tabla contenedora
	sAuxParams  = '';
	sAuxParams += (this.sTableCSS        != '' ? 'class="'       + this.sTableCSS        + '" ' : '');
	sAuxParams += (this.sTableBGColor    != '' ? 'bgcolor="'     + this.sTableBGColor    + '" ' : '');
	sAuxParams += (this.sTableBGImage    != '' ? 'background="'  + this.sTableBGImage    + '" ' : '');
	sAuxParams += (this.sTableHPos       != '' ? 'align="'       + this.sTableHPos       + '" ' : '');
	sAuxParams += (this.sTableWidth      != '' ? 'width="'       + this.sTableWidth      + '" ' : '');
	sAuxParams += (this.sTableBorder     != '' ? 'border="'      + this.sTableBorder     + '" ' : '');
	sAuxParams += (this.sTablePadding    != '' ? 'cellpadding="' + this.sTablePadding    + '" ' : '');
	sAuxParams += (this.sTableSpacing    != '' ? 'cellspacing="' + this.sTableSpacing    + '" ' : '');

	sWrite += '<table ' + sAuxParams + '>';

	// Tabla contenedora. Celda de Cabecera (Si la tiene)
	if (this.sHeadHTML.length > 0)
	{
		// Preparar las tabulaciones en pixels para "Top/Left y Right/Bottom"
		sTabPxTL   = '';
		sTabPxRB   = '';
		sTabPxTL  += (this.sHeadTabPxTop > 0 ? getTblTabHTML(            '100%', this.sHeadTabPxTop) : '');
		sTabPxTL  += (this.sHeadTabPxLef > 0 ? getTblImgHTML(this.sHeadTabPxLef,                '1') : '');
		sTabPxRB  += (this.sHeadTabPxRig > 0 ? getTblImgHTML(this.sHeadTabPxRig,                '1') : '');
		sTabPxRB  += (this.sHeadTabPxBot > 0 ? getTblTabHTML(            '100%', this.sHeadTabPxBot) : '');

		sAuxParams  = '';
		sAuxParams += (this.sHeadCSS         != '' ? 'class="'       + this.sHeadCSS         + '" ' : '');
		sAuxParams += (this.sHeadBGColor     != '' ? 'bgcolor="'     + this.sHeadBGColor     + '" ' : '');
		sAuxParams += (this.sHeadBGImage     != '' ? 'background="'  + this.sHeadBGImage     + '" ' : '');
		sAuxParams += (this.sHeadAlign       != '' ? 'align="'       + this.sHeadAlign       + '" ' : '');
		sAuxParams += (this.sHeadVAlign      != '' ? 'valign="'      + this.sHeadVAlign      + '" ' : '');
		sAuxParams += (this.sHeadHeight      != '' ? 'height="'      + this.sHeadHeight      + '" ' : '');
		sWrite += '<tr>';
		sWrite += 	'<td ' + sAuxParams + '>';
		sWrite +=		sTabPxTL;
		sWrite +=		(this.sHeadURL.length > 0 ? '<a href="' + this.sHeadURL + '">' : '');
		sWrite +=			this.sHeadHTML;
		sWrite +=		(this.sHeadURL.length > 0 ? '</a>' : '');
		sWrite +=		sTabPxRB;
		sWrite += 	'</td>';
		sWrite += '</tr>';
	}

	// Tabla contenedora. Celda separadora de Cabecera/Cuerpo (Si la tiene)
	if (this.sHeadBodyHTML.length > 0)
	{
		sAuxParams  = '';
		sAuxParams += (this.sHeadBodyCSS     != '' ? 'class="'       + this.sHeadBodyCSS     + '" ' : '');
		sAuxParams += (this.sHeadBodyBGColor != '' ? 'bgcolor="'     + this.sHeadBodyBGColor + '" ' : '');
		sAuxParams += (this.sHeadBodyBGImage != '' ? 'background="'  + this.sHeadBodyBGImage + '" ' : '');
		sAuxParams += (this.sHeadBodyHeight  != '' ? 'height="'      + this.sHeadBodyHeight  + '" ' : '');

		sWrite += '<tr>';
		sWrite += 	'<td ' + sAuxParams + '>';
		sWrite +=		this.sHeadBodyHTML;
		sWrite += 	'</td>';
		sWrite += '</tr>';
	}

	// ------------------------------------------
	// Tabla contenedora. Celda de Cuerpo. Inicio
	// ------------------------------------------

	// Preparar las tabulaciones en pixels para "Top/Left y Right/Bottom"
	sTabPxTL   = '';
	sTabPxRB   = '';
	sTabPxTL  += (this.sBodyTabPxTop > 0 ? getTblTabHTML(            '100%', this.sBodyTabPxTop) : '');
	sTabPxTL  += (this.sBodyTabPxLef > 0 ? getTblImgHTML(this.sBodyTabPxLef,                '1') : '');
	sTabPxRB  += (this.sBodyTabPxRig > 0 ? getTblImgHTML(this.sBodyTabPxRig,                '1') : '');
	sTabPxRB  += (this.sBodyTabPxBot > 0 ? getTblTabHTML(            '100%', this.sBodyTabPxBot) : '');

	sAuxParams  = '';
	sAuxParams += (this.sBodyFootCSS     != '' ? 'class="'       + this.sBodyFootCSS     + '" ' : '');
	sAuxParams += (this.sBodyFootBGColor != '' ? 'bgcolor="'     + this.sBodyFootBGColor + '" ' : '');
	sAuxParams += (this.sBodyFootBGImage != '' ? 'background="'  + this.sBodyFootBGImage + '" ' : '');
	sAuxParams += (this.sBodyFootHeight  != '' ? 'height="'      + this.sBodyFootHeight  + '" ' : '');

	sWrite += '<tr>';
	sWrite += 	'<td ' + sAuxParams + '>';

	// Despliegue de la opciones del menú
	sAuxParams  = '';
	sAuxParams += (this.sOptionCSS       != '' ? 'class="'       + this.sOptionCSS       + '" ' : '');
	sAuxParams += (this.sOptionBGColor   != '' ? 'bgcolor="'     + this.sOptionBGColor   + '" ' : '');
	sAuxParams += (this.sOptionBGImage   != '' ? 'background="'  + this.sOptionBGImage   + '" ' : '');
	sAuxParams += (this.sOptionHPos      != '' ? 'align="'       + this.sOptionHPos      + '" ' : '');
	sAuxParams += (this.sOptionWidth     != '' ? 'width="'       + this.sOptionWidth     + '" ' : '');
	sAuxParams += (this.sOptionBorder    != '' ? 'border="'      + this.sOptionBorder    + '" ' : '');
	sAuxParams += (this.sOptionPadding   != '' ? 'cellpadding="' + this.sOptionPadding   + '" ' : '');
	sAuxParams += (this.sOptionSpacing   != '' ? 'cellspacing="' + this.sOptionSpacing   + '" ' : '');

	sWrite += 		sTabPxTL;
	sWrite += 		'<table ' + sAuxParams + '>';
	for (var nAux = 0; nAux < this.uOptionLst.length; nAux++)
	{
		// ..............................................................................
		sWrite += this.uOptionLst[nAux].getOptionHTML();   // Fila y celda-s de la opción
		// ..............................................................................

		// Despliegue del Separador de Opciones
		if(nAux < (this.uOptionLst.length - 1) && this.sOptInterHTML.length > 0)
		{
			sAuxParams  = '';
			sAuxParams += (this.OptIntersCSS     != '' ? 'class="'       + this.OptIntersCSS     + '" ' : '');
			sAuxParams += (this.OptIntersBGColor != '' ? 'bgcolor="'     + this.OptIntersBGColor + '" ' : '');
			sAuxParams += (this.OptIntersBGImage != '' ? 'background="'  + this.OptIntersBGImage + '" ' : '');
			sWrite +=	'<tr>';
			sWrite +=		'<td ' + sAuxParams + '>';
			sWrite +=			this.sOptInterHTML;
			sWrite += 	'</tr>';
		}
	}
	sWrite += 		'</table>';
	sWrite += 		sTabPxRB;

	// Tabla contenedora. Celda de Cuerpo. Cierre
	sWrite += 	'</td>';
	sWrite += '</tr>';
	// ------------------------------------------

	// Tabla contenedora. Celda separadora de Cuerpo/Pie (Si la tiene)
	if (this.sBodyFootHTML.length > 0)
	{
		sAuxParams  = '';
		sAuxParams += (this.sBodyFootCSS     != '' ? 'class="'       + this.sBodyFootCSS     + '" ' : '');
		sAuxParams += (this.sBodyFootBGColor != '' ? 'bgcolor="'     + this.sBodyFootBGColor + '" ' : '');
		sAuxParams += (this.sBodyFootBGImage != '' ? 'background="'  + this.sBodyFootBGImage + '" ' : '');
		sAuxParams += (this.sBodyFootHeight  != '' ? 'height="'      + this.sBodyFootHeight  + '" ' : '');

		sWrite += '<tr>';
		sWrite += 	'<td ' + sAuxParams + '>';
		sWrite +=		this.sBodyFootHTML;
		sWrite += 	'</td>';
		sWrite += '</tr>';
	}

	// Tabla contenedora. Celda de Pie (Si la tiene)
	if (this.sFootHTML.length > 0)
	{
		sAuxHeight = (this.sFootHeight.length > 0 ? ' height="'+this.sFootHeight+'"' : '')

		// Preparar las tabulaciones en pixels para "Top/Left y Right/Bottom"
		sTabPxTL   = '';
		sTabPxRB   = '';
		sTabPxTL  += (this.sFootTabPxTop > 0 ? getTblTabHTML(            '100%', this.sFootTabPxTop) : '');
		sTabPxTL  += (this.sFootTabPxLef > 0 ? getTblImgHTML(this.sFootTabPxLef,                '1') : '');
		sTabPxRB  += (this.sFootTabPxRig > 0 ? getTblImgHTML(this.sFootTabPxRig,                '1') : '');
		sTabPxRB  += (this.sFootTabPxBot > 0 ? getTblTabHTML(            '100%', this.sFootTabPxBot) : '');

		sAuxParams  = '';
		sAuxParams += (this.sFootCSS         != '' ? 'class="'       + this.sFootCSS         + '" ' : '');
		sAuxParams += (this.sFootBGColor     != '' ? 'bgcolor="'     + this.sFootBGColor     + '" ' : '');
		sAuxParams += (this.sFootBGImage     != '' ? 'background="'  + this.sFootBGImage     + '" ' : '');
		sAuxParams += (this.sFootAlign       != '' ? 'align="'       + this.sFootAlign       + '" ' : '');
		sAuxParams += (this.sFootVAlign      != '' ? 'width="'       + this.sFootVAlign      + '" ' : '');
		sAuxParams += (this.sFootHeight      != '' ? 'height="'      + this.sFootHeight      + '" ' : '');

		sWrite += '<tr>';
		sWrite += 	'<td ' + sAuxParams + '>';
		sWrite +=		sTabPxTL + (this.sFootURL.length > 0 ? '<a href="' + this.sFootURL + '">' : '');
		sWrite +=			this.sFootHTML;
		sWrite +=		(this.sFootURL.length > 0 ? '</a>' : '') + sTabPxRB;
		sWrite += 	'</td>';
		sWrite += '</tr>';
	}

	// Finalización de la tabla contenedora
	sWrite += '</table>';

	// Tabulación vertical posterior  (en pixels)
	sWrite += (this.nVTabAfter > 0 ? getTblTabHTML(1, this.nVTabAfter) : '');

	// Despliegue del menú
	document.write(sWrite);
}


// **************************************************************************************************************************************************************
// Clase     : Barra de menús
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-21-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: 1. (s) Selector de hoja de estilo alternativa
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-21-Sep-2001 / Federico Murcia (FMD)
// Observ.   : Por defecto, toma la CSS de "menu.css"
//             La barra no tiene más formato propio que el separador de menús
// *******************************************************************************
function BarMenu(sCSSAlt)
{
	// ---------- Atributos
	this.nVTabBefore    = 0;                  // Tabulación vertical anterior  (en pixels)
	this.nVTabAfter     = 0;                  // Tabulación vertical posterior (en pixels)

	this.sMenuInterCSS  = sCSSAlt + 'bmMI';   // Separador de Menús. CSS
	this.sMenuInterHTML = '';                 // Separador de Menús. HTML

	this.uMenuLst = new Array();              // Objetos "Menu" de la barra

	// ---------- Métodos
	this.AddMenu   = AddMenu;
	this.AddMnuArr = AddMnuArr;
	this.BarDeploy = BarDeploy;
}

// *******************************************************************************
// Método    : Añade un item de menú al menú.
// Parametros: 1. (u) Objeto Menu
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function AddMenu(uMenu)
{
	this.uMenuLst[this.uMenuLst.length] = uMenu;
}

// *******************************************************************************
// Método    : Añade menús almacenados en un array
// Parametros: 1. (u) Array de objetos "Menu"
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function AddMnuArr(uMnuArr)
{
	for(var nAux = 0; nAux < uMnuArr.length; nAux++)
	{
		this.AddMenu(uMnuArr[nAux]);
	}
}

// *******************************************************************************
// Método    : Despliega la barra de menús.
// Parametros: -
// Devuelve  : -
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-21-Sep-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function BarDeploy()
{
	// Tabulación vertical anterior  (en pixels)
	if(this.nVTabBefore > 0)
	{
		document.write(getTblTabHTML(1, this.nVTabBefore));
	}

	// Despliegue de los menús de la barra
	for (var nAux = 0; nAux < this.uMenuLst.length; nAux++)
	{
		this.uMenuLst[nAux].MenuDeploy();

		// Despliegue del Separador de Menús
		if(nAux < (this.uMenuLst.length - 1) && this.sMenuInterHTML.length > 0)
		{
			document.write(this.sMenuInterHTML);
		}
	}

	// Tabulación vertical posterior  (en pixels)
	if(this.nVTabAfter > 0)
	{
		document.write(getTblTabHTML(1, this.nVTabAfter));
	}
}
