//*****************************************************************************
// Contenido : Librería COMUN: Funciones y Clases
// Proyecto  : PATANEGRA Soft Web Utilities
// Observs.  : -
//
// Creada    : Lun-30-Oct-2000 / Federico Murcia (FMD)
// Actualiz. : Vié-18-Jun-2000 / Federico Murcia (FMD)
// Copyright : PATANEGRA Soft - Dic 2000 - Sevilla (SPAIN)
//*****************************************************************************


// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################
//
//    Declaración e inicialización de FUNCIONES
//
// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################


// *******************************************************************************
// Funcion   : PATANEGRA JavaScript Includer
//             Genera un código HTML para cargar un archivo JavaScript
// Parametros: 1. (s) URL del archivo JavaScript
// Devuelve  : -
//
// Creada    : Mar-07-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-07-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PNSInclude(sURLCGI)
{
	document.write('<' + 'script language="JavaScript" src="' + sURLCGI + '">' + '<' + '/script' + '>');
}


// *******************************************************************************
// Funcion   : Devuelve un número aleatorio entredos rangos
// Parametros: 1. (n) Rango. Límite inferior
//             2. (n) Rango. Límite superior
// Devuelve  : (n) Número aleatorio
//
// Creada    : Mar-04-Jun-2002 / Federico Murcia (FMD)
// Actualiz. : Mar-04-Jun-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function aleatorio(nLimInf, nLimSup)
{
	var nRango = 0;
	var nAleat = 0;

	nRango = nLimSup - nLimInf;
	nAleat = Math.round(Math.random() * nRango);
	nAleat = parseInt(nLimInf) + nAleat;

	return nAleat;
}


// *******************************************************************************
// Funcion   : Genera claves basadas en un plantilla dada
// Parametros: 1. (s) Plantilla
//             2. (b) ¿Incluir caracteres confusos?
// Devuelve  : (s) Cadena con la clave
//
// Creada    : Jue-04-Jul-2002 / Federico Murcia (FMD)
// Actualiz. : Lun-08-Jul-2002 / Federico Murcia (FMD)
//
// Observ.   : (1) Comodines de la plantilla:
//                    '#' : Cualquier dígito o caracter mayúscula o minúscula
//                    '9' : Sólo digitos
//                    '>' : Sólo caracter mayúscula
//                    '<' : Sólo caracter minúscula
//                    '}' : Cualquier dígito o caracter mayúscula
//                    '{' : Cualquier dígito o caracter minúscula
//                    '@' : Sólo caracter mayúscula o minúscula
//
//             (2) Los caracteres "confusos" son los que, en muchas fuentes de
//                 letras, se pueden confundir con otros. A saber:
//                    En los dígitos:      El '0' con el caracter mayúscula 'O'
//                                         El '1' con el caracter minúscula 'l'
//                    En las mayúsculas:   La 'I' con el caracter minúscula 'l'
//                                         La 'O' con el dígito             '0'
//                    En las minúsculas:   La 'l' con el caracter mayúscula 'I'
//                                         La 'l' con el dígito             '1'
//                    En las mayúsculas se quita la 'L' para evitar conflictos
//                    en claves "case NO sensitive".
// *******************************************************************************
function getKey(sTemplate, bCfs)
{
	var nChr       = sTemplate.length;   // Número de caracteres en total para la clave
	var sChr       = "";                 // Item en curso de la plantilla
	var nRnd       = 0;
	var sValChrDig = (bCfs ? "01" : "") + "23456789";
	var sValChrUpp = "ABCDEFGH" + (bCfs ? "I" : "") + "JK" + (bCfs ? "L" : "") + "MN" + (bCfs ? "O" : "") + "PQRSTUVWXYZ";
	var sValChrLow = "abcdefghijk" + (bCfs ? "l" : "") + "mnopqrstuvwxyz";
	var sValChr    = "";
	var sRet       = "";

	for(nAux = 0; nAux < nChr; nAux++)
	{
		// Tomar el item en curso de la plantilla
		sChr = sTemplate.substring(nAux, nAux+1);

		// Determinar cadena de caracteres válida para el item de la plantilla en curso
		if(sChr == "") sValChrTot = "";
		else if(sChr == "#") sValChr = sValChrDig + sValChrUpp + sValChrLow;
		else if(sChr == "9") sValChr = sValChrDig;
		else if(sChr == ">") sValChr = sValChrUpp;
		else if(sChr == "<") sValChr = sValChrLow;
		else if(sChr == "}") sValChr = sValChrDig + sValChrUpp;
		else if(sChr == "{") sValChr = sValChrDig + sValChrLow;
		else if(sChr == "@") sValChr = sValChrUpp + sValChrLow;

		// De la cadena válida, tomar al azar un caracter y asignarlo a la clave en formación
		nRnd = aleatorio(0, sValChr.length-1);
		sRet += sValChr.substring(nRnd, nRnd+1);
	}

	return sRet;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada para representar Euros
// Parametros: 1. (n) Número
// Devuelve  : (s) Cadena formateada "###0.00E"
//
// Creada    : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Actualiz. : Jue-14-Mar-2002 / Federico Murcia (FMD)
// Observ.   : Representación JavaScript del simbolo del euro es:
//                   unescape('%u20AC')
//                o bien
//                   String.fromCharCode(8364)       (Código Unicode 8364)
// ******************************************************************************/
function toEuroString( nNum )
{
	return (toDecimalString(nNum, 2) + String.fromCharCode(8364));
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada para representar un numero con N
//             decimales.
// Parametros: 1. (n) Número
//             2. (n) Número de decimales
// Devuelve  : (s) Cadena formateada "###0.00...(N)"
//
// Creada    : Jue-14-Mar-2002 / Federico Murcia (FMD)
// Actualiz. : Vié-15-Mar-2002 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function toDecimalString( nNum, nDec )
{
	var sRet    = '' + (Math.round(nNum*Math.pow(10,nDec))/Math.pow(10,nDec));		// Redondear a N decimales
	var nDecIdx = -1;																					// Contador de decimales

	for(var nIdx = 0; nIdx < sRet.length; nIdx++)
	{
		if(sRet.substring(nIdx,nIdx+1) == '.' || nDecIdx > -1) nDecIdx++;
	}

	if(nDecIdx < 1)      sRet += '.' + Repl('0',nDec);
	else if(nDecIdx < nDec) sRet += Repl('0',nDec-nDecIdx);

	return sRet;
}


// *******************************************************************************
// Funcion   : Devuelve la letra para conformar un NIF a partir de un DNI
// Parametros: 1. (s) Cadena con el número de DNI
// Devuelve  : (s) Letra
//
// Creada    : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Actualiz. : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Observ.   : No admite puntuaciones ni guiones en la cadena del NIF
//             Cadena de letras NIF ( ABCDEFGHJKLMNPQRSTVWXYZ )
// ******************************************************************************/
function getNIFLetter( sDNI )
{
	var nAux, sLetter = '';

	if( sDNI != '' )
	{
		nAux= parseFloat( sDNI ) % 23;
		switch( nAux )
		{
			case  0: sLetter = 'T'; break;
			case  1: sLetter = 'R'; break;
			case  2: sLetter = 'W'; break;
			case  3: sLetter = 'A'; break;
			case  4: sLetter = 'G'; break;
			case  5: sLetter = 'M'; break;
			case  6: sLetter = 'Y'; break;
			case  7: sLetter = 'F'; break;
			case  8: sLetter = 'P'; break;
			case  9: sLetter = 'D'; break;
			case 10: sLetter = 'X'; break;
			case 11: sLetter = 'B'; break;
			case 12: sLetter = 'N'; break;
			case 13: sLetter = 'J'; break;
			case 14: sLetter = 'Z'; break;
			case 15: sLetter = 'S'; break;
			case 16: sLetter = 'Q'; break;
			case 17: sLetter = 'V'; break;
			case 18: sLetter = 'H'; break;
			case 19: sLetter = 'L'; break;
			case 20: sLetter = 'C'; break;
			case 21: sLetter = 'K'; break;
			case 22: sLetter = 'E'; break;
		}
	}

	return sLetter;
}


// *******************************************************************************
// Funcion   : Valida un NIF
// Parametros: 1. (s) Cadena con el número NIF
// Devuelve  : (b) Validez
//
// Creada    : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Actualiz. : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Observ.   : No admite puntuaciones ni guiones en la cadena del NIF
// ******************************************************************************/
function ifValidNIF( sNIF )
{
	var bRet = false;
	var sLetter = sNIF.substring((sNIF.length - 1), sNIF.length).toUpperCase();
	var sNumber = '' + parseInt(sNIF.substring(0, (sNIF.length - 1)));

	if( sLetter.charCodeAt(0) > 64 && sLetter.charCodeAt(0) < 91 )
	{
		bRet = (sLetter == getNIFLetter( sNumber ));
	}

	return bRet;
}


// *******************************************************************************
// Funcion   : Valida los constructores de una fecha
// Parametros: 1. (n) Día del mes
//             2. (n) Mes
//             3. (n) Año
// Devuelve  : (b) Validez
//
// Creada    : Dom-20-Ene-2002 / Federico Murcia (FMD)
// Actualiz. : Lun-21-Ene-2002 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function IsValidDate( nDay, nMonth, nYear )
{
	var bRet = true;
	var fAux = new Date(nYear, nMonth-1, nDay);

	bRet = (nDay   == fAux.getDate());
	bRet = (nMonth == fAux.getMonth() + 1);
	bRet = (nYear  == fAux.getFullYear() + (fAux.getFullYear() < 1000 ? 1900 : 0));

	return bRet;
}


// *******************************************************************************
// Funcion   : Devuelve el año con cuatro cifras
// Parametros: 1. (d) Date
// Devuelve  : (n) Año
//
// Creada    : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Actualiz. : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Observ.   : El método "getFullYear()" de la clase Date de JavaScript devuelve una
//             cadena, de dos caracteres, con los año transcurrido desde el
//             "1900".
//             El Ms.I.Explorer, para acabar de arreglarlo lo hace así hasta el
//             1999 y a partir de ese devuelve el año con cuatro dígitos.
// ******************************************************************************/
function getYearOk( dDate )
{
	var nDate = dDate.getFullYear();
	nDate += (nDate < 1000 ? 1900 : 0)

	return nDate;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "yyyy,mm,dd,hh,mm,ss" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la fecha formateada
//
// Creada    : Mar-19-Feb-2002 / Federico Murcia (FMD)
// Actualiz. : Mar-19-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function getDate4New( dDate )
{
	var sDate = '';

	sDate += getYearOk(dDate)   + ',';
	sDate += dDate.getMonth()   + ',';
	sDate += dDate.getDate()     + ',';
	sDate += dDate.getHours()   + ',';
	sDate += dDate.getMinutes() + ',';
	sDate += dDate.getSeconds();

	return sDate;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "Lun-01-Ene-0000" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la fecha formateada
//
// Creada    : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Actualiz. : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Observ.   : Utiliza las variables globales, cargada desde 'global_dat.js',
//             "sSysCnt_AuxDias" y "sSysCnt_AuxMeses".
// ******************************************************************************/
function getDateFmt( dDate )
{
	var sDate = '';

	sDate += sSysCnt_AuxDias[dDate.getDay()].substring(0,3)    + '-';
	sDate += LPad('' + dDate.getDate(), '0', 2)                + '-';
	sDate += sSysCnt_AuxMeses[dDate.getMonth()].substring(0,3) + '-';
	sDate += getYearOk(dDate);

	return sDate;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "Lun01Ene0000" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la fecha formateada
//
// Creada    : Sab-15-Feb-2002 / Federico Murcia (FMD)
// Actualiz. : Sab-15-Feb-2002 / Federico Murcia (FMD)
// Observ.   : Utiliza las variables globales, cargada desde 'global_dat.js',
//             "sSysCnt_AuxDias" y "sSysCnt_AuxMeses".
// ******************************************************************************/
function getDateFmt2( dDate )
{
	var sDate = '';

	sDate += sSysCnt_AuxDias[dDate.getDay()].substring(0,3)   ;
	sDate += LPad('' + dDate.getDate(), '0', 2)               ;
	sDate += sSysCnt_AuxMeses[dDate.getMonth()].substring(0,3);
	sDate += getYearOk(dDate);

	return sDate;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "01Ene0000" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la fecha formateada
//
// Creada    : Sab-15-Feb-2002 / Federico Murcia (FMD)
// Actualiz. : Mié-01-May-2002 / Federico Murcia (FMD)
// Observ.   : Utiliza las variables globales, cargada desde 'global_dat.js',
//             "sSysCnt_AuxDias" y "sSysCnt_AuxMeses".
// ******************************************************************************/
function getDateFmt3( dDate )
{
	var sDate = '';

	sDate += LPad('' + dDate.getDate(), '0', 2)               ;
	sDate += sSysCnt_AuxMeses[dDate.getMonth()].substring(0,3);
	sDate += getYearOk(dDate);

	return sDate;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "00:00:00" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la hora formateada
//
// Creada    : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Actualiz. : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function getTimeFmt( dDate )
{
	var sTime = '';

	sTime += LPad('' + dDate.getHours()  , '0', 2) + ':';
	sTime += LPad('' + dDate.getMinutes(), '0', 2) + ':';
	sTime += LPad('' + dDate.getSeconds(), '0', 2);

	return sTime;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena formateada "000000" a partir de "Date"
// Parametros: 1. (d) Date
// Devuelve  : (s) Cadena con la hora formateada
//
// Creada    : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Actualiz. : Mar-02-Ene-2001 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function getTimeFmt2( dDate )
{
	var sTime = '';

	sTime += LPad('' + dDate.getHours()  , '0', 2);
	sTime += LPad('' + dDate.getMinutes(), '0', 2);
	sTime += LPad('' + dDate.getSeconds(), '0', 2);

	return sTime;
}


// *******************************************************************************
// Funcion   : Elimina los espacios de la izquierda de un string
// Parametros: 1. (s) String original
// Devuelve  : (s) String sin los espacios de la izquierda
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function LTrim( sString )
{
	nAux = 0;
	while (sString.substring(nAux, nAux+1) == ' ') { nAux++ };

	return sString.substring(nAux, sString.length);
}


// *******************************************************************************
// Funcion   : Elimina los espacios de la derecha de un string
// Parametros: 1. (s) String original
// Devuelve  : (s) String sin los espacios de la derecha
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function RTrim( sString )
{
	nAux = sString.length;
	while (sString.substring(nAux-1, nAux) == ' ') { nAux-- };

	return sString.substring(0, nAux);
}


// *******************************************************************************
// Funcion   : Elimina los espacios de la izquierda y derecha de un string
// Parametros: 1. (s) String original
// Devuelve  : (s) String sin los espacios de la izquierda y derecha
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function AllTrim( sString )
{
	return LTrim(RTrim( sString ));
}


// *******************************************************************************
// Funcion   : Rellena, por izquierda, una cadena con un caracter hasta longitud
// Parametros: 1. (s) String original
//             2. (s) Caracter de relleno
//             3. (n) Longitud final de la cadena
// Devuelve  : (s) String de longitud especificada rellenado con el caracter dado
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function LPad( sString, sChar, nLen )
{
	while (sString.length < nLen) { sString = sChar + sString };
	return sString;
}


// *******************************************************************************
// Funcion   : Rellena, por derecha, una cadena con un caracter hasta longitud
// Parametros: 1. (s) String original
//             2. (s) Caracter de relleno
//             3. (n) Longitud final de la cadena
// Devuelve  : (s) String de longitud especificada rellenado con el caracter dado
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function RPad( sString, sChar, nLen )
{
	while (sString.length < nLen) { sString += sChar };
	return sString;
}


// *******************************************************************************
// Funcion   : Replica una cadena un numero de veces
// Parametros: 1. (s) String a replicar
//             2. (n) Numero de veces
// Devuelve  : (s) String con la cadena especificada replicada el numero de veces
//
// Creada    : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Actualiz. : Mié-31-Mar-1999 / Federico Murcia (FMD)
// Observ.   : -
// ******************************************************************************/
function Repl( sString, nNum )
{
	sRet = '';
	while (nNum-- > 0) { sRet += sString };
	return sRet;
}


// *******************************************************************************
// Funcion   : Devuelve cadena con espacios "NoBrake"
// Parametros: 1. (n) Número de espacios
// Devuelve  : (s) Cadean con los espacios
//
// Creada    : Mar-07-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-23-Oct-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function space(nSpaces)
{
	for(var nAux = 0; nAux < nSpaces; nAux++)
	{
		sAux = sAux + '&nbsp;';
	}

	return sAux;
}


// *******************************************************************************
// Funcion   : Cambia los ceros iniciales de una cadena por espacios para que
//             eval() no tome una cadena por un numero octal al convertirla
// Parametros: 1. (s) Cadena inicial
// Devuelve  : (s) Cadean con los espacios
//
// Creada    : Jue-04-Jul-2002 / Federico Murcia (FMD)
// Actualiz. : Jue-04-Jul-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function toNoOctal(sTxt)
{
	var sRet = '';
	var bRpl = true;

	for(var nAux = 0; nAux < sTxt.length; nAux++)
	{
		bRpl =  (bRpl && sTxt.charAt(nAux) == '0' ? true : false);
		sRet += (bRpl && sTxt.charAt(nAux) == '0' ? '' : sTxt.charAt(nAux));
	}

	return sRet;
}


// *******************************************************************************
// Funcion   : Cambia una caracter por otro
// Parametros: 1. (s) Cadena a tratar
//             2. (s) Caracter a sustituir
//             3. (s) Caracter sustituto
// Devuelve  : (s) Cadena ya tratada
//
// Creada    : Mar-07-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-07-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function charChange(sTxt, sChrIni, sChrFin)
{
	var sRet = '';

	for(var nAux = 0; nAux < sTxt.length; nAux++)
	{
		sRet += (sTxt.charAt(nAux) == sChrIni ? sChrFin : sTxt.charAt(nAux));
	}

	return sRet;
}


// *******************************************************************************
// Funcion   : Cambia una cadena por otra
// Parametros: 1. (s) Cadena a tratar
//             2. (s) Cadena a sustituir
//             3. (s) Cadena sustituta
// Devuelve  : (s) Cadena ya tratada
//
// Creada    : Mié-06-Mar-2002 / Federico Murcia (FMD)
// Actualiz. : Mié-06-Mar-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function strChange(sTxt, sStrIni, sStrFin)
{
	var sAuxIzq    = '';
	var sAuxDer    = '';
	var nStrPosIni = sTxt.indexOf( sStrIni );
	var nStrIniLen = sStrIni.length;
	var nTxtLen    = sTxt.length;

	while( nStrPosIni >= 0)
	{
		sAuxIzq = sTxt.substring(0,nStrPosIni);
		sAuxDer = sTxt.substring(nStrPosIni+nStrIniLen, nTxtLen);
		sTxt    = sAuxIzq + sStrFin + sAuxDer;
		nStrPosIni = sText.indexOf( sStrIni );
	}

	return sTxt;
}


// *******************************************************************************
// Funcion   : Cambia espacios de tipo "Soft" por espacios de tipo "NoBrake"
// Parametros: 1. (s) Cadena a tratar
// Devuelve  : (s) Cadena ya tratada
//
// Creada    : Mar-23-Oct-2001 / Federico Murcia (FMD)
// Actualiz. : Mar-23-Oct-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function noSoftSpaces(sText)
{
	var nAux;
	var aAux = '';

	for( nAux = 0; nAux < sText.length; nAux++)
	{
		aAux += (sText.charAt(nAux) == ' ' ? '&nbsp;' : sText.charAt(nAux));
	}

	return aAux;
}


// *******************************************************************************
// Funcion   : Split de QueryString
// Parametros: 1. (s) Cadena QueryString (con o sin el '?' inicial)
// Devuelve  : (Array de objetos QSParam) Parametros y sus valores
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Vié-18-Jun-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function splitQueryString(sQS)
{
	var sQSAux, nSgmts = 0, sSgmts = new Array(), sParams = new Array();

	// Convertir las secuencias de escape del query string a caracteres nromales con acentos y demás
	sQS = sQS.split('&nbsp;').join(' ');   // El replace() es un coñazo de expresiones regulares
	sQS = unescape(sQS);

	// Quitar el '?' inicial si la cadena parámetro lo trae
	if(sQS.substring(1, 0) == '?')
	{
		sQS = sQS.substring(1, sQS.length);
	}

	// Split del QueryString: Paso 1de2
	// Dividir en segmentos por el separador '&' (si procede)
	//
	sSgmts = sQS.split('&');

	// Split del QueryString: Paso 2de2
	// Subdividir los segmentos obtenidos por el separador '=' (si procede)
	//
	for(var nAux = 0; nAux < sSgmts.length; nAux++)
	{
		sParams[nAux] = new QSParam( sSgmts[nAux], '');
		if(sSgmts[nAux].indexOf('=') >= 0)
		{
			sParams[nAux] = new QSParam( sSgmts[nAux].substring(0, sSgmts[nAux].indexOf('=')),
		   	                          sSgmts[nAux].substring(sSgmts[nAux].indexOf('=')+1, sSgmts[nAux].length));
		}
	}

	return sParams;
}

// *******************************************************************************
// Método    : Devuelve un objeto QueryString de la URL de la página web en curso
// Parametros: 1. (s) "Ruta de objetos"
// Devuelve  : -
//
// Creada    : Vié-15-Feb-2002 / Federico Murcia (FMD)
// Actualiz. : Vié-15-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function GetQSFromWeb(sParents)
{
	var uQSRet = new QueryString();

	if(sParents.length > 0) sParents += '.';

	uQSRet.SetFromQS(eval(sParents + 'location.search'));

	return uQSRet;
}


// *******************************************************************************
// Funcion   : Si es un dominio de los declarados en "global_dat.js"
// Parametros: 1. (s) Name del dominio
// Devuelve  : (b) Si está o no declarado
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function isDomDecl(sDomName)
{
	var bDomDecl = false;   // La inicializacion "new Boolean()" no es de fiar

	for(var nAux = 0; nAux < uDomLst.length; nAux++)
	{
		if(uDomLst[nAux].Name == sDomName)
		{
			bDomDecl = true;
			break;
		}
	}

	return bDomDecl;
}


// *******************************************************************************
// Funcion   : Devuelve uno de los dominios declarados en "global_dat.js"
// Parametros: 1. (s) Name del dominio
// Devuelve  : (b) Si está o no declarado
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : Si el parámetro no coincide con ningun "Name" de dominio declarado
//             se devuelve un objeto dominio vacío
// *******************************************************************************
function getDomDecl(sDomName)
{
	var uDomDecl = new Dominio('' , '', '', '', '');

	for(var nAux = 0; nAux < uDomLst.length; nAux++)
	{
		if(uDomLst[nAux].Name == sDomName)
		{
			uDomDecl = uDomLst[nAux];
			break;
		}
	}

	return uDomDecl;
}


// *******************************************************************************
// Funcion   : Establece valores en la "memoria"
// Parametros: 1. (s) Identificador de variable
//             2. (s) Valor para la variable
// Devuelve  : -
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-12-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function setInMem(sVarID, sVarValue)
{
	var uQSMem = getMem();

			var sZZsearch   = parent.PnlMem.location.search;
			var sZZPrmID    = sVarID;
			var sZZPrmValue = sVarValue;
			var nZZlength   = uQSMem.PrmLst.length;
			var sZZEntire   = uQSMem.Entire();

	uQSMem.PrmSet(sVarID, sVarValue);

	parent.PnlMem.location.href = '_sys/htm/Sys(pnl-mem).htm' + uQSMem.Entire();
/* ZZ
alert(	'' +
			'YA FUERA (Antes):\n' +
			'-----------------------------------------\n' +
			'PnlMem.location.search: »' + sZZsearch + '«\n' +
			'sPrmID: »' + sZZPrmID + '«\n' +
			'sPrmValue: »' + sZZPrmValue + '«\n' +
			'PrmLst: »' + nZZlength + '«\n' +
			'Entire: »' + sZZEntire() + '«\n' +
			'\n' +
			'YA FUERA (Después):\n' +
			'-----------------------------------------\n' +
			'PnlMem.location.search: »' + parent.PnlMem.location.search + '«\n' +
			'sPrmID: »' + sVarID + '«\n' +
			'sPrmValue: »' + sVarValue + '«\n' +
			'PrmLst: »' + uQSMem.PrmLst.length + '«\n' +
			'Entire: »' + uQSMem.Entire() + '«\n' +
			'');
*/
alert('Entire: »' + uQSMem.Entire() + '«\n');
//ZZ document.write('Entire: »' + uQSMem.Entire() + '«');
}


// *******************************************************************************
// Funcion   : Devuelve la "memoria"
// Parametros: -
// Devuelve  : (QueryString) Contenido de la "memoria"
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-12-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function getMem()
{
	return (new QueryString(parent.PnlMem.location.search));
}


// *******************************************************************************
// Funcion   : Borra la "memoria"
// Parametros: -
// Devuelve  : -
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-12-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function clearMem()
{
	parent.PnlMem.location.href = '_sys/htm/Sys(pnl-mem).htm';
}


// *******************************************************************************
// Funcion   : Libera una variable la "memoria"
// Parametros: 1. (s) Identificador de variable
// Devuelve  : -
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Mar-12-Feb-2002 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function clearMemVar(sVarID)
{
	var uQSMem = getMem();
	uQSMem.PrmDel(sVarID);
	parent.PnlMem.location.href = '_sys/htm/Sys(pnl-mem).htm' + uQSMem.Entire();
}


// *******************************************************************************
// Método    : Averigua la "memoria" dispone de la variable especificada
// Parametros: 1. (s) Identificador de variable
// Devuelve  : (b) Si lo tiene o no
//
// Creada    : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function existMemVar(sVarID)
{
	var uQSMem = getMem();
	return uQSMem.PrmExist(sVarID);
}


// *******************************************************************************
// Funcion   : Devuelve el valor de una variable la "memoria"
// Parametros: 1. (s) Identificador de variable
// Devuelve  : -
//
// Creada    : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function getMemVar(sVarID)
{
	var uQSMem = getMem();
	return uQSMem.PrmGetVal(sVarID);
}


// *******************************************************************************
// Funcion   : Abre una nueva instancia del navegador y carga la URL dada
// Parametros: 1. (s) URL
// Devuelve  : -
//
// Creada    : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-20-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function openURLInNewNav(sURL)
{
	var sNewNav = window.open();
	sNewNav.location.href = sURL;
}


// *******************************************************************************
// Funcion   : Actualiza los paneles indicados en la "query string" indicada
// Parametros: -
// Devuelve  : (s) Cadena con una cadena "query string"
//
// Creada    : Mié-27-Dic-2000 / Federico Murcia (FMD)
// Actualiz. : Mié-27-Dic-2000 / Federico Murcia (FMD)
// Observ.   : Utiliza la variable global 'sPnlLst' cargada en 'global_dat.js'
// *******************************************************************************
function UpdPnlFromQS(sQS)
{
	// Creación de un objeto "QueryString" para tratar los parámetros
	var uQS = new QueryString();
	uQS.SetFromQS(sQS);

	// Escaneo de las llamadas a los paneles en el "query string"
	for(var nAux = 0; nAux < sPnlLst.length; nAux++)
	{
		if(uQS.PrmExist('Upd' + sPnlLst[nAux]))
		{
			eval('parent.' + sPnlLst[nAux] + '.location.href = "' + uQS.PrmGetVal('Upd' + sPnlLst[nAux]) + '"');
		}
	}
}


// *******************************************************************************
// Funcion   : Devuelve una cadena HTML con una tabla para tabulación
// Parametros: 1. (n) Pixels horizontales
//             2. (n) Pixels verticales
// Devuelve  : (s) Cadena HTML
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : Usa el GIF "http://webanterior.feada.org/_sys/pic/px_ft.gif"
// ******************************************************************************/
function getTblTabHTML(nHorPx, nVerPx)
{
	sRet = '';
	sRet += '<table border="0" cellspacing="0" cellpadding="0"><tr><td>';
	sRet += '<img border="0" src="http://webanterior.feada.org/_sys/pic/px_ft.gif" width="' + nHorPx + '" height="' + nVerPx + '">';
	sRet += '</td></tr></table>';
	return sRet;
}


// *******************************************************************************
// Funcion   : Devuelve una cadena HTML con una imagen para tabulación
// Parametros: 1. (n) Pixels horizontales
//             2. (n) Pixels verticales
// Devuelve  : (s) Cadena HTML
//
// Creada    : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-17-Sep-2001 / Federico Murcia (FMD)
// Observ.   : Usa el GIF "http://webanterior.feada.org/_sys/pic/px_ft.gif"
// ******************************************************************************/
function getTblImgHTML(nHorPx, nVerPx)
{
	return '<img border="0" src="http://webanterior.feada.org/_sys/pic/px_ft.gif" width="' + nHorPx + '" height="' + nVerPx + '">';
}


// *******************************************************************************
// Funcion   : Ordena arrays de cadenas
// Parametros: 1. (s) Array
// Devuelve  : (s) Array ordenado
//
// Creada    : Vie-19-Oct-2001 / Federico Murcia (FMD)
// Actualiz. : Vie-19-Oct-2001 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function sSort(sAuxArray)
{
	var sTmp = "";

	for(var nAuxP1 = 0; nAuxP1 < sAuxArray.length; nAuxP1++)
	{
		for(var nAuxP2 = (nAuxP1 + 1); nAuxP2 < sAuxArray.length; nAuxP2++)
		{
			if(sAuxArray[nAuxP1] > sAuxArray[nAuxP2])
			{
				sTmp              = sAuxArray[nAuxP1];
				sAuxArray[nAuxP1] = sAuxArray[nAuxP2];
				sAuxArray[nAuxP2] = sTmp;
			}
		}
	}

	return sAuxArray;
}


// *******************************************************************************
// Funcion   : Ordena arrays de objetos
// Parametros: 1. (u) Array
// Devuelve  : (u) Array ordenado
//
// Creada    : Jue-18-Oct-2001 / Federico Murcia (FMD)
// Actualiz. : Jue-18-Oct-2001 / Federico Murcia (FMD)
// Observ.   : Las clases deben disponer del atributo "sSysOrder"
// *******************************************************************************
function uSort(uAuxArray)
{
	var uTmp = "";

	for(var nAuxP1 = 0; nAuxP1 < uAuxArray.length; nAuxP1++)
	{
		for(var nAuxP2 = (nAuxP1 + 1); nAuxP2 < uAuxArray.length; nAuxP2++)
		{
			if(uAuxArray[nAuxP1].sSysOrder > uAuxArray[nAuxP2].sSysOrder)
			{
				uTmp              = uAuxArray[nAuxP1];
				uAuxArray[nAuxP1] = uAuxArray[nAuxP2];
				uAuxArray[nAuxP2] = uTmp;
			}
		}
	}

	return uAuxArray;
}


// *******************************************************************************
// Funcion   : Devuelve un caracter a partir de su código ASCII
// Parametros: 1. (n) Código ASCII
// Devuelve  : (s) Caracter
//
// Creada    : Lun-05-Nov-2001 / Federico Murcia (FMD)
// Actualiz. : Lun-05-Nov-2001 / Federico Murcia (FMD)
// Observ.   : .- Devuelve "" si el ASCII es menor a 32
// *******************************************************************************
function Chr(nASCII)
{
	if( nASCII < 32)                  // Limitación de códigos
		return "";
	if( nASCII == 34)                 // Devolución de la doble comilla
		return '"';
	// En esta cadena las comillas son un espacio y, falta caracteres que no ha devuelto el MultiEdit
	return 	" ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»___¦¦Á¼¡©¦¦++¢¥++--+-+ãÃ++--¦-+¤ðÐÊËÈiÍÎÏ++__¦Ì_ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±_¾¶§÷¸°¨·¹³²_ ".substring((nASCII-32), (nASCII-32+1));
}



// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################
//
//    Declaración e inicialización de CLASES
//
// ##############################################################################################################################################################
// ##############################################################################################################################################################
// ##############################################################################################################################################################


// **************************************************************************************************************************************************************
// Clase     : Dominio
//
// Creada    : Mié-08-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: 1. (s) Identificador (Código)
//             2. (s) Nombre del dominio (sin el protocolo)
//             3. (s) Directorio para CGI's
//             4. (s) Compañía dueña del dominio
// Devuelve  : -
//
// Creada    : Mié-08-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function Dominio(sID, sName, sCGIDir, sCompany)
{
	// ---------- Atributos
	this.ID      = sID;
	this.Name    = sName;
	this.CGIDir  = sCGIDir;
	this.Company = sCompany;
}


// **************************************************************************************************************************************************************
// Clase     : Parámetro de Objeto QueryString
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: 1. (s) Identificador (Código)
//             2. (s) Valor
// Devuelve  : -
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function QSParam(sID, sValue)
{
	// ---------- Atributos
	this.ID    = sID;
	this.Value = sValue;
}


// **************************************************************************************************************************************************************
// Clase     : QueryString
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// **************************************************************************************************************************************************************

// *******************************************************************************
// CONSTRUCTOR
// Parametros: -
// Devuelve  : -
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-11-Dic-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function QueryString()
{
	// ---------- Atributos
	this.PrmLst = new Array();

	// ---------- Métodos
	this.SetFromLst = SetFromLst;
	this.SetFromQS  = SetFromQS;
	this.Entire     = Entire;
	this.PrmNum     = PrmNum;
	this.PrmExist   = PrmExist;
	this.PrmGetVal  = PrmGetVal;
	this.PrmSet     = PrmSet;
	this.PrmDel     = PrmDel;
}

// *******************************************************************************
// Método    : Modificación o adición batch de parámetros a partir de una lista
//             de objetos QSParam
// Parametros: 1. (Array de objetos QSParam)
// Devuelve  : -
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-11-Dic-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function SetFromLst(uQSPrmLst)
{
	for(var nAux = 0; nAux < uQSPrmLst.length; nAux++)
	{
		this.PrmSet(uQSPrmLst[nAux]);
	}
}

// *******************************************************************************
// Método    : Modificación o adición batch de parámetros a partir de una cadena
//             con formato QueryString
// Parametros: 1. (s) Cadena QueryString
//                (Puede o no incluir el '?', ya que "split" lo quita si lo hay)
// Devuelve  : -
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-11-Dic-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function SetFromQS(sQS)
{
	var uQSPrmLst = new Array();

	uQSPrmLst = splitQueryString(sQS);
	this.SetFromLst(uQSPrmLst);
}

// *******************************************************************************
// Método    : Devuelve una cadena QueryString completa del objeto QueryString
//             (Incluye el '?' inicial)
// Parametros: -
// Devuelve  : -
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-11-Dic-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function Entire()
{
	var sQS = '';

	if(this.PrmLst.length < 1)
	{
		// Devolver cadena vacía
		return '';
	}
	else
	{
		// Componer la cadena en bruto (&Var1=Value1&Var2=Value2&Var3=Value3...)
		for(nAux = 0; nAux < this.PrmLst.length; nAux++)
		{
			sQS += '&' + this.PrmLst[nAux].ID + '=' + this.PrmLst[nAux].Value;
		}

		// Devolver la cadena añadiendole al inicio el '?' y quitandole el primer '&'
		return '?' + sQS.substring(1, sQS.length);
	}
}

// *******************************************************************************
// Método    : Devuelve el número de parámetros del QS
// Parametros: -
// Devuelve  : (n) Número de parámetros
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PrmNum()
{
	return this.PrmLst.length;
}

// *******************************************************************************
// Método    : Averigua si el QS tiene o no el parámetro especificado
// Parametros: 1. (s) ID del parámetro
// Devuelve  : (b) Si lo tiene o no
//
// Creada    : Lun-13-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-13-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PrmExist(sPrmID)
{
	var bExist = false;   // La inicializacion "new Boolean()" no es de fiar

	for(var nAux = 0; nAux < this.PrmLst.length; nAux++)
	{
		if(this.PrmLst[nAux].ID == sPrmID)
		{
			bExist = true;
			break;
		}
	}

	return bExist;
}

// *******************************************************************************
// Método    : Devuelve el valor del parámetro de QS especificado
// Parametros: 1. (s) ID del parámetro
// Devuelve  : (s) Valor ('' Si no tiene o no existe)
//
// Creada    : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-09-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PrmGetVal(sPrmID)
{
	var sValue = '';

	if(this.PrmExist(sPrmID))
	{
		for(var nAux = 0; nAux < this.PrmLst.length; nAux++)
		{
			if(this.PrmLst[nAux].ID == sPrmID)
			{
				sValue = this.PrmLst[nAux].Value;
				break;
			}
		}
	}

	return sValue;
}

// *******************************************************************************
// Método    : Modifica el valor de un parámetro al QueryString o lo Añade
//             si no existía
// Parametros: 1. (Parámetro de QueryString)
// Devuelve  : -
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Lun-11-Dic-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PrmSet(uQSPrm)
{
	// Comprobar si existe ya la variable en memoria y, si es asi, cambiar su valor
	if(this.PrmExist(uQSPrm.ID))
	{
		for(var nAux = 0; nAux < this.PrmLst.length; nAux++)
		{
			if(this.PrmLst[nAux].ID == uQSPrm.ID)
			{
				this.PrmLst[nAux].Value = uQSPrm.Value;
				break;
			}
		}
	}
	else
	{
		// Dar de alta la variable con su valor si no existía ya
		this.PrmLst[this.PrmLst.length] = uQSPrm;
	}
}

// *******************************************************************************
// Método    : Elimina un parámetro al QueryString, si existe
// Parametros: 1. (s) ID del parámetro
// Devuelve  : -
//
// Creada    : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Actualiz. : Jue-16-Nov-2000 / Federico Murcia (FMD)
// Observ.   : -
// *******************************************************************************
function PrmDel(sPrmID)
{
	var sRet       = '';
	var uPrmLstAux = new Array();

	uPrmLstAux     = this.PrmLst;     // Salvaguardar los parametrios actuales
	this.PrmLst    = new Array();     // Reinicializar el array de parametros

	// Recorrer los parámetros salvaguardados para formar el nuevo array de parametros
	for(var nAux = 0; nAux < uPrmLstAux.length; nAux++)
	{
		if(uPrmLstAux[nAux].ID != sPrmID)
		{
			this.PrmLst[this.PrmLst.length] = new QSParam(uPrmLstAux[nAux].ID, uPrmLstAux[nAux].Value);
		}
	}
}

/*

ZZ zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

<!-- TWO STEPS TO INSTALL ASCII ENCRYPTION:

  1.  Copy the coding into the HEAD of your HTML document
  2.  Add the last code into the BODY of your HTML document  -->

<!-- STEP ONE: Paste this code into the HEAD of your HTML document  -->

<HEAD>

<SCRIPT LANGUAGE="JavaScript">
<!-- Original:  David Salsinha (david.salsinha@popsi.pt) -->

<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!! http://javascript.internet.com -->

<!-- Begin
function Encrypt(theText) {
output = new String;
Temp = new Array();
Temp2 = new Array();
TextSize = theText.length;
for (i = 0; i < TextSize; i++) {
rnd = Math.round(Math.random() * 122) + 68;
Temp[i] = theText.charCodeAt(i) + rnd;
Temp2[i] = rnd;
}
for (i = 0; i < TextSize; i++) {
output += String.fromCharCode(Temp[i], Temp2[i]);
}
return output;
}
function unEncrypt(theText) {
output = new String;
Temp = new Array();
Temp2 = new Array();
TextSize = theText.length;
for (i = 0; i < TextSize; i++) {
Temp[i] = theText.charCodeAt(i);
Temp2[i] = theText.charCodeAt(i + 1);
}
for (i = 0; i < TextSize; i = i+2) {
output += String.fromCharCode(Temp[i] - Temp2[i]);
}
return output;
}
//  End -->
</script>
</HEAD>

<!-- STEP TWO: Copy this code into the BODY of your HTML document  -->

<BODY>

<center>
<form name=encform onsubmit="return false;">
<textarea name=box1 rows=5 cols=50>The quick brown fox jumps over the lazy dog</textarea>
<p>
<input type=button value="Encrypt Box1 to Box2" onClick="this.form.box2.value=Encrypt(this.form.box1.value);">
<p>
<textarea name=box2 rows=5 cols=50></textarea>
<p>
<input type=button value="Decrypt Box2 to Box3" onClick="this.form.box3.value=unEncrypt(this.form.box2.value);">
<p>
<textarea name=box3 rows=5 cols=50></textarea>
</form>
</center>

<p><center>
<font face="arial, helvetica" size="-2">Free JavaScripts provided<br>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>

<!-- Script Size:  1.83 KB -->*/
