//
// class.lang.Basics.js
//
var loadTime  = loadTime ? loadTime : DOMTimeStamp();
var namespace = window;

//________________________________________________________________________________________
//
if ( !window.Language )
{
 var original  = {};
 var ABSTRACT  = {CLASS:{}};
 var CLASS     = namespace;
 var COMPONENT = {CLASS:{}};
 var CONST     = {Integer:{},Number:{},String:{}};
 var FINAL     = {CLASS:{}};
 var INTERFACE = {};
 var NATIVE    = namespace;
 var PUBLIC    = namespace;
 var PROTECTED = {CLASS:{}};
 var SERVICE   = {CLASS:{}};

 //_______________________________________________________________________________________
 //
 var BROWSER_ID =
 {
  "Konqueror" : "KO",   // Konqueror
  "MSPIE"     : "PE",   // Pocket Explorer
  "Pocket"    : "PE",   // Pocket Explorer
  "MSIE"      : "IE",   // Internet Explorer
  "Microsoft" : "IE",   // Internet Explorer
  "Opera"     : "OP",   // Opera
  "Netscape"  : "NS",   // Netscape
  "Netscape6" : "NS",   // Netscape
  "Firefox"   : "FF",   // Mozilla Firefox
  "Firebird"  : "MZ",   // Mozilla Firebird
  "Phoenix"   : "MZ",   // Mozilla Phoenix
  "Safari"    : "SF",   // Safari
  "K-Meleon"  : "KM",   // K-Meleon
  "Gecko"     : "GG",   // Generic Gecko
  "Mozilla"   : "GM"    // Generic Moz
 };

 //_______________________________________________________________________________________
 //
 var SYSTEM_ID =
 {
  "Windows NT 6.0" : "WVI",
  "Windows NT 5.2" : "WS3",
  "Windows XP"     : "WXP",
  "Windows NT 5.1" : "WXP",
  "Windows 2000"   : "W2K",
  "Windows NT 5.0" : "W2K",
  "Windows NT 4.0" : "W40",
  "Windows NT"     : "WNT",
  "WinNT"          : "WNT",
  "Windows ME"     : "WME",
  "Win 9x"         : "WME",
  "Windows 98"     : "W98",
  "Win98"          : "W98",
  "Windows 95"     : "W95",
  "Win95"          : "W95",
  "Windows CE"     : "WCE",
  "SunOS"          : "SUN",
  "Linux"          : "LNX",
  "Macintosh"      : "MAC",
  "Mac OS"         : "MAC",
  "Mac_68K"        : "MAC",
  "Mac_PPC"        : "MAC",
  "Mac_PowerPC"    : "MAC",
  "OS/2"           : "OS2",
  "PalmOS"         : "POS"
 };

 //_______________________________________________________________________________________
 //
 var WINDOWS_VERSION =
 {
  "WCE" : 1.0, // Windows CE/Windows Mobile
  "W95" : 2.0, // Windows 95
  "W98" : 2.2, // Windows 98/Windows 98 SE
  "WME" : 2.5, // Windows Mellenium
  "WNT" : 3.0, // Windows NT >= 3.0
  "W40" : 4.0, // Windows NT >= 4.0
  "W2K" : 5.0, // Windows 2000
  "WXP" : 5.1, // Windows XP
  "WS3" : 5.2, // Windows Server 2003
  "WVI" : 6.0  // Windows Vista
 };

 //_______________________________________________________________________________________
 //
 var WINDOWS_COMPONENT =
 {
  "IE"  : "{89820200-ECBD-11CF-8B85-00AA005B4383}", // Internet Explorer
  "MVM" : "{08B0E5C0-4FCB-11CF-AAA5-00401C608500}"  // Virtual Machine
 };

 //_______________________________________________________________________________________
 //
 var JAVA_WEB_START =
 {
  "JavaWebStart.isInstalled.1.6.0.0" : "1,6",
  "JavaWebStart.isInstalled.1.5.0.0" : "1,5",
  "JavaWebStart.isInstalled.1.5.0.0" : "1,5",
  "JavaWebStart.isInstalled.1.4.2.0" : "1,4,2,0",
  "JavaWebStart.isInstalled.1"       : "1,4,1,0",
  "JavaWebStart.isInstalled.3"       : "1,3",
  "JavaWebStart.isInstalled.2"       : "1,2",
  "JavaWebStart.isInstalled"         : "1,0"
 };

 /**
 *  Testimonial (sin uso)
 */
 CLASS. Basics = function()
 {
  eval( lang ); with(STATIC) with(PROTECTED) with(PUBLIC) with(PRIVATE) {

    //____________________________________________________________________________________
    //
    PRIVATE. constructor = new function()
    {
     Super();
    }

  }
 } // end class
}

//________________________________________________________________________________________
// DEPRECATED
var widthof  = pxwidthof;
var heightof = pxheightof;

//________________________________________________________________________________________
// DEPRECATED (utilizar pxleftof)
function leftof( oNode )
{
 var iAux = 0;

 if ( typeof(oNode) == "string" )
    oNode = pointerof( oNode );

 if ( oNode )
 {
  var oAux = oNode;
  while ( oAux.nodeName != "BODY" )
  {
   iAux += oAux.offsetLeft;
   oAux  = oAux.parentNode;
  }

  var iZoom = 0;
  try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
  if ( iZoom == 0 ) iZoom = 100;
  iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );
 }

 return (iAux);
}

//________________________________________________________________________________________
// DEPRECATED: (utilizar pxtopof)
function topof( oNode )
{
 var iAux = 0;

 if ( typeof(oNode) == "string" )
    oNode = pointerof( oNode );

 if ( oNode )
 {
  var oAux = oNode;
  while ( oAux.nodeName != "BODY" )
  {
   iAux += oAux.offsetTop;
   oAux  = oAux.parentNode;
  }

  var iZoom = 0;
  try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
  if ( iZoom == 0 ) iZoom = 100;
  iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );
 }

 return (iAux);
}

//________________________________________________________________________________________
// Retorna un numero aleatorio de 1..15 digitos
function randomof( iTop )
{
 if ( (iTop == undefined) || (iTop < 1) || (iTop > 15) ) iTop = 2;

 var sAux = "" + (new Date).getTime();
 sAux     = "" + Math.round( Math.random() * Math.pow(10,iTop) ) + sAux;
 sAux     = sAux.substring( 0, iTop );

 return parseInt(sAux,10);
}

//________________________________________________________________________________________
// Retorna el caracter equivalente a un codigo UNICODE
function charof( iCode )
{
 return String.fromCharCode( iCode );
}

//________________________________________________________________________________________
// Retorna el codigo UNICODE equivalente a un caracter
function unicodeof( cArg )
{
 return cArg.charCodeAt(0);
}

//________________________________________________________________________________________
// Retorna 0, o el valor numerico entero o real de cualquier string
function valueof( sValue, iRadix )
{
 var nAux = 0;

 if ( !sValue ) return (0);
 sValue = sValue.toString();

 // Valor introducido: currency-es
 if ( sValue.indexOf(',') != -1 || iRadix == 1 )
 {
  iRadix = 0
  sValue = sValue.replace( /\./g, ""  );
  sValue = sValue.replace( /\D/g, "." );
 }

 if ( sValue.indexOf('.') == -1 )
    nAux = parseInt( sValue, (iRadix ? iRadix : 10) );
 else
    nAux = parseFloat( sValue );

 return (isNaN(nAux) ? 0 : nAux);
}

//________________________________________________________________________________________
//
function urlof( sURI, oWin )
{
 var iHost     = -1;
 var iProtocol = -1
 var oLocation = oWin ? oWin.location : window.location;

 // Not host
 iHost = sURI.indexOf( "/"+"/" );
 if ( iHost == -1 )
 {
  // Not path
  if ( sURI.charAt(0) != "/" )
  {
   var sPath = oLocation.pathname.replace( /\\/g,"/" );
   sURI      = sPath.substring( 0, sPath.lastIndexOf("/") + 1 ) + sURI;
  }

  sURI  = "/"+"/"+ oLocation.host + sURI;
  iHost = 0;
 }

 // Not protocol
 iProtocol = sURI.indexOf( ":" );
 if ( (iProtocol == -1) || (iProtocol > iHost) )
    sURI = oLocation.protocol + sURI;

 return (sURI);
}

//_______________________________________________________________________________________________________
// Retorna el protocolo de la URL (p.e. http, https)
function urlProtocol (sUrl)
{
  var sProtocol = sUrl.toLowerCase().substring( 0, sUrl.indexOf('/')).replace(/:/g,"");
  if  ((sProtocol != "file") && (sProtocol != "Ftp") &&
       (sProtocol != "http") && (sProtocol != "Https"))
    return("");
  else
   return(sProtocol);
}

//_______________________________________________________________________________________________________
// Retorna el host de la URL (p.e. www.intrallianz.es)
function urlHost (sUrl)
{
  var sProtocol = urlProtocol(sUrl);
  if (sProtocol.length > 0)
  {
    var sUrlAux = sUrl.toLowerCase()
    if (sUrlAux.indexOf(sProtocol) >= 0)
      sUrlAux = sUrlAux.substring(sUrlAux.indexOf(sProtocol) + sProtocol.length);

    if (sUrlAux.indexOf("//") > -1)
      sUrlAux = sUrlAux.substring(sUrlAux.indexOf("//") + 2);

    sUrlAux = sUrlAux.substring(0, sUrlAux.indexOf("/"));

    return(sUrlAux);
  }
  return "";
}

//_______________________________________________________________________________________________________
// Retorna el pathname de la URL (p.e. drieoo/ie50wi00.jsp)
function urlPathName (sUrl)
{
  var sUrlAux = sUrl.toLowerCase();

  var sHost = urlHost(sUrl);
  if (sHost.length > 0)
  {
    if (sUrlAux.indexOf(sHost) >= 0)
      sUrlAux = sUrlAux.substring(sUrlAux.indexOf(sHost) + sHost.length);
  }

  if (sUrlAux.charAt(0) == '/')
    sUrlAux = sUrlAux.substring(1);

  if (sUrlAux.indexOf("#") > -1)
    sUrlAux = sUrlAux.substring(0, sUrlAux.indexOf("#"));

  return(sUrlAux);
}

//_______________________________________________________________________________________________________
// Retorna el hash de la URL (p.e. #llbLink?uid=pepe o ?uid=pepe)
function urlHash (sUrl)
{
  var sUrlAux = sUrl;

  if (sUrlAux.indexOf('#') >= 0)
    sUrlAux = sUrlAux.substring(sUrlAux.indexOf('#') + 1);
  else if (sUrlAux.indexOf('?') >= 0)
    sUrlAux = sUrlAux.substring(sUrlAux.indexOf('?') + 1);
  else
    sUrlAux = "";

  return(sUrlAux);

}

//________________________________________________________________________________________
// Retorna el 'name' o el 'id' de un objeto HTML. Si no existe lo asigna autmaticamente
function idof( oHtml )
{
 if ( arguments.callee.counter == null ) arguments.callee.counter = 1;
 if ( oHtml                    == null ) oHtml = { name:"", id:"" };

 if ( oHtml.type == "radio" )
 {
  if ( oHtml.id   && oHtml.id   == "" ) oHtml.id   = "o_"+ arguments.callee.counter++;
  if ( oHtml.name && oHtml.name == "" ) oHtml.name = "o_"+ arguments.callee.counter++;
 }
 else
 {
  var sAux = "";
  if ( oHtml.name && oHtml.name != "" ) sAux =  oHtml.name;
  if ( oHtml.id   && oHtml.id   != "" ) sAux =  oHtml.id;

  if ( sAux == "" ) sAux = "o_"+ arguments.callee.counter++;

  oHtml.id = oHtml.name = sAux;
 }

 return (oHtml.id);
}

//________________________________________________________________________________________
// Formaliza un string para poder ser utilizado como identificador
function nameof( sAux )
{
 sAux = sAux.replace( /[\xE0-\xE5]/g, "a" );
 sAux = sAux.replace( /[\xE8-\xEB]/g, "e" );
 sAux = sAux.replace( /[\xEC-\xEF]/g, "i" );
 sAux = sAux.replace( /[\xF2-\xF6]/g, "o" );
 sAux = sAux.replace( /[\xF9-\xFC]/g, "u" );

 sAux = sAux.replace( /[\xC0-\xC5]/g, "A" );
 sAux = sAux.replace( /[\xC8-\xCB]/g, "E" );
 sAux = sAux.replace( /[\xCC-\xCF]/g, "I" );
 sAux = sAux.replace( /[\xD2-\xD6]/g, "O" );
 sAux = sAux.replace( /[\xD9-\xDC]/g, "U" );

 sAux = sAux.replace( /[\xE7]/g,      "c" );
 sAux = sAux.replace( /[\xF1]/g,      "n" );
 sAux = sAux.replace( /[\x9A]/g,      "s" );
 sAux = sAux.replace( /[\xFD\xFF]/g,  "y" );
 sAux = sAux.replace( /[\x9E]/g,      "z" );

 sAux = sAux.replace( /[\xC7]/g,      "C" );
 sAux = sAux.replace( /[\xD1]/g,      "N" );
 sAux = sAux.replace( /[\x8A]/g,      "S" );
 sAux = sAux.replace( /[\xDD\x9F]/g,  "Y" );
 sAux = sAux.replace( /[\x8E]/g,      "Z" );

 sAux = sAux.replace( /[^A-Za-z0-9_\$]/g, "_" );
 return (sAux);
}

//________________________________________________________________________________________
// Eliminacion de espacios por derecha e izquierda
function trimof( sText )
{
 sText = sText.replace( /(^\s*)/, "" );
 sText = sText.replace( /(\s*$)/, "" );
 return (sText);
}

//________________________________________________________________________________________
// Retorna el texto o HTML contenido en un objeto HTML
function innerof( oHTML, bHTML )
{
 var sAux = "";

 if ( bHTML == true )
    sAux = oHTML.innerHTML   ? oHTML.innerHTML   : "";
 else if ( isIE )
    sAux = oHTML.innerText   ? oHTML.innerText   : "";
 else
    sAux = oHTML.textContent ? oHTML.textContent : "";

 return (sAux);
}

//________________________________________________________________________________________
// Retorna una colecion de elemntos HTML en base a su className
function elementsof( sClassName, sTag, oWin )
{
 var aElements = [];

 if ( oWin == null )
    oWin = window;

 var aAux = oWin.document.getElementsByTagName( sTag ? sTag : "*" );

 if ( sClassName == null )
    aElements = aAux;
 else
    for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
        if ( aAux[Idx].className == sClassName )
           aElements.push( aAux[Idx] );

 return (aElements);
}

//________________________________________________________________________________________
// Retrorna un string con el constructor de un objeto o valor
function classof( oTarget )
{
 if ( oTarget == null ) return (null);

 var sAux = "";
 if ( isIE )
 {
  if ( typeof(getTypeName) == "undefined" )
     execScript("Function getTypeName(s) getTypeName=TypeName(s) End Function", "vbs" );

  sAux = getTypeName( oTarget );
  if ( sAux == "JScriptTypeInfo" )
  {
   sAux = oTarget.constructor.toString();
  }
  else if ( sAux.substring(0,4) == "HTML" )
  {
   if ( sAux != "HTMLDocument" )
   {
    if ( sAux == "HTMLWindow2" )
       sAux = "Window";
    else if ( sAux.indexOf("Element") == -1 )
       sAux += "Element";

    switch( sAux )
    {
     case "HTMLGenericElement": sAux = "HTMLUnknownElement";  break;
     case "HTMLBlockElement":   sAux = "HTMLPreElement";      break;
     case "HTMLHeaderElement":  sAux = "HTMLHeadingElement";  break;
     case "HTMLImgElement":     sAux = "HTMLImageElement";    break;
     case "HTMLParaElement":    sAux = "HTMLParagrphElement"; break;
     case "HTMLObjectElement":
          if ( oTarget.nodeName == "APPLET" ) sAux = "HTMLAppletElement";
          break;
     case "HTMLUListElement":
          if ( oTarget.nodeName == "DIR" )
             sAux = "HTMLDirectoryElement";
          else if ( oTarget.nodeName == "MENU" )
             sAux = "HTMLMenuElement";
          break;
     case "HTMLPhraseElement":
          if ( oTarget.nodeName == "DEL" )
             sAux = "HTMLDelElement";
          else if ( oTarget.nodeName == "INS" )
             sAux = "HTMLInsElement";
          else if ( oTarget.nodeName == "Q" )
             sAux = "HTMLQuoteElement";
          break;
    }
   }
  }
 }
 else // Firefox
 {
  if ( oTarget.nodeName )
     sAux = oTarget.toString();
  else
     sAux = oTarget.constructor.toString();
 }

 if ( sAux.indexOf("function ") != -1 )
    sAux = sAux.substring( sAux.indexOf(" ") + 1, sAux.indexOf("(") );
 else
    sAux = sAux.replace(/\[object\s/,"").replace(/[\[\]]/g,"");

 if (  sAux=="Long" || sAux=="Byte" )
    sAux = "Integer";
 else if ( sAux=="Number" && parseFloat(oTarget) == parseInt(oTarget) )
    sAux = "Integer";
 else if ( sAux=="Single" || sAux=="Double" || sAux=="Currency" || sAux=="Decimal" )
    sAux = "Number";
 else if ( sAux=="Unknown" || sAux=="Nothing" || sAux=="Empty" || sAux=="Null" )
    return (null);

 return (sAux);
}

//________________________________________________________________________________________
// Retrorna una copia estructural de un objeto (solo se copian propiedades no metodos)
function copyof( oTarget )
{
 if ( oTarget == null || typeof(oTarget) != "object" )
 {
  var oCopy = (typeof oTarget == "function") ? null : oTarget;
 }
 else
 {
  var oCopy = (oTarget.constructor == Array) ? [] : {};
  for ( var Member in oTarget )
      if ( oTarget[Member] && typeof(oTarget[Member]) == "object" )
         oCopy[Member] = copyof( oTarget[Member] );
      else
         oCopy[Member] = (typeof oTarget[Member] == "function") ? null: oTarget[Member];
 }

 return (oCopy);
}

//________________________________________________________________________________________
// Retorna un string con el nombre de la funcion argumentada
function identityof(p)
{
 var sAux = "";

 p = (p == null) ? arguments.callee.caller : p;
 if ( typeof(p) == "object" )
    p = p.constructor;

 if ( typeof(p) == "function" )
 {
  sAux = p.toString();
  sAux = sAux.substring( sAux.indexOf("function") + 8, sAux.indexOf('(') );
  if ( sAux != "" )
  {
   sAux = trimof(sAux);
   return (sAux);
  }
 }

 return (sAux);
}

//________________________________________________________________________________________
// Retorna un texto formateado en base a una fecha argumentada. Si la fecha argumentada
// es un nulo, retornara el texto en base a la fecha actual.
// MASCARAS:
// @d    Dia numerico (1 o 2 digitos):           2
// @dd   Dia numerico (2 digitos):               02
// @D    Dia textual:                            Martes
// @m    Mes numerico (1 o 2 digitos):           1
// @mm   Mes numerico (2 digitos):               01
// @M    Mes textual:                            Enero
// @yy   Aħo numerico (2 digitos):               05
// @yyyy Aħo numerico (4 digitos):               2005
// @h    Hora numerica (1 o 2 digitos):          7
// @hh   Hora numerica (2 digitos):              07
// @x    Minutos numericos (1 o 2 digitos):      3
// @xx   Minutos numericos (2 digitos):          03
// @s    Segundos numericos (1 o 2 digitos):     5
// @ss   Segundos numericos (2 digitos):         05
// @j    Fecha numerica juliana (8 digitos):     20050102
// @t    Fecha numerica estandar (millonesimas): 1116344276893
// @L    Fecha textual local (toLocaleString):   Martes 2 de Enero de 2005
//
// Eje.  "@dd/@mm/@yyyy"
function dateof( vValue, sMask, bLess1900 )
{
 var oDate = new Date;
 var aAux  = null;
 var sAux  = "";
 var iAux  = 0;

 vValue = vValue ? vValue.toString() : oDate.getTime().toString();
 if ( sMask == null ) sMask = "@dd/@mm/@yyyy";

 if ( isFinite(vValue) ) // No hay separadores, fecha numerica
 {
  iAux = vValue.length;
  if ( iAux > 8 ) // Fecha > 8 (timeStamp)
  {
   oDate.setTime( valueof(vValue) );
  }
  else if ( iAux == 8 ) // Fecha de 8
  {
   // Fecha yyyymmdd (yyyy no puede ser menor de 1900)
   if (!bLess1900 && valueof(vValue.substr(0,2)) > 18 && valueof(vValue.substr(4,2)) < 13)
      iAux = Date.UTC( valueof(vValue.substr(0,4)),
                       valueof(vValue.substr(4,2))-1,
                       valueof(vValue.substr(6,2)) );
   else // Fecha ddmmyyyy
      iAux = Date.UTC( valueof(vValue.substr(4,4)),
                       valueof(vValue.substr(2,2))-1,
                       valueof(vValue.substr(0,2)) );
   oDate.setTime( iAux );
  }
  else if ( iAux == 6 ) // Fecha de 6 (ddmmyy)
  {
   iAux = Date.UTC( valueof(vValue.substr(0,2)),
                    valueof(vValue.substr(2,2))-1,
                    valueof(vValue.substr(4,2))+2000 );
   oDate.setTime( iAux );
  }
 }
 else // Hay separadores
 {
  vValue = vValue.replace( /\D/g, "/" );  // Convertir separadores a /
  aAux   = vValue.split("/");

  aAux[0] = valueof( aAux[0] );
  aAux[1] = valueof( aAux[1] ) - 1;
  aAux[2] = aAux[2].length < 4 ? valueof( aAux[2] ) + 2000 : valueof( aAux[2] );

  iAux = Date.UTC( aAux[2], aAux[1], aAux[0] );
  oDate.setTime( iAux );
 }

 sMask = sMask.replace( /@L/g,    "@D @d de @M de @yyyy" ); // Locale string
 sMask = sMask.replace( /@j/g,    "@yyyy@mm@dd" );          // Julian
 sMask = sMask.replace( /@dd/g,   (oDate.getDate()<10 ? "0":"") + oDate.getDate() );
 sMask = sMask.replace( /@d/g,    oDate.getDate() );
 sMask = sMask.replace( /@mm/g,   ((oDate.getMonth()+1)<10 ? "0":"")+(oDate.getMonth()+1));
 sMask = sMask.replace( /@m/g,    oDate.getMonth()+1 );
 sMask = sMask.replace( /@yyyy/g, oDate.getFullYear() );
 sMask = sMask.replace( /@yy/g,   oDate.getFullYear().toString().substr(2,2) );
 sMask = sMask.replace( /@hh/g,   (oDate.getHours() < 10 ? "0":"") + oDate.getHours() );
 sMask = sMask.replace( /@h/g,    oDate.getHours() );
 sMask = sMask.replace( /@xx/g,   (oDate.getMinutes() < 10 ? "0":"")+oDate.getMinutes() );
 sMask = sMask.replace( /@x/g,    oDate.getMinutes() );
 sMask = sMask.replace( /@ss/g,   (oDate.getSeconds() < 10 ? "0":"")+oDate.getSeconds() );
 sMask = sMask.replace( /@s/g,    oDate.getSeconds() );
 sMask = sMask.replace( /@t/g,    oDate.getTime() );

 switch( oDate.getDay() )
 {
  case 1:  sAux = "Lunes";     break;  case 2:  sAux = "Martes"; break;
  case 3:  sAux = "Miercoles"; break;  case 4:  sAux = "Jueves"; break;
  case 5:  sAux = "Viernes";   break;  case 6:  sAux = "Sabado"; break;
  case 0:  sAux = "Domingo";   break;
  default: sAux = "";
 }
 sMask = sMask.replace( /@D/g,  sAux );

 switch( oDate.getMonth() )
 {
  case 0:  sAux = "Enero";      break;  case 1:  sAux = "Febrero";   break;
  case 2:  sAux = "Marzo";      break;  case 3:  sAux = "Abril";     break;
  case 4:  sAux = "Mayo";       break;  case 5:  sAux = "Junio";     break;
  case 6:  sAux = "Julio";      break;  case 7:  sAux = "Agosto";    break;
  case 8:  sAux = "Septiembre"; break;  case 9:  sAux = "Octubre";   break;
  case 10: sAux = "Noviembre";  break;  case 11: sAux = "Diciembre"; break;
  default: sAux = "";
 }
 sMask = sMask.replace( /@M/g, sAux );

 return (sMask);
}
//________________________________________________________________________________________
// Retorna un texto numerico formateado en base a una valor argumentado.
// MASCARAS:
// $i.d monetaria:    $8.2 = 12.345.678,12
// @i.d compacta:     @8.2 = 1234567812
// &i.d operativa:    &8.2 = 12345678,12
// #i.d computacinal: #8.2 = 12345678.12
function numberof( vValue, sMask )
{
 var iInt = 0;
 var iDec = 0;
 var sInt = "";
 var sDec = "";
 var vAux = "";

 if ( vValue == null || vValue == "" )
    vValue = "0";
 else if ( typeof(vValue) == "number" )
    vValue = vValue.toString().replace( /\./,"," );
 else
    vValue = vValue.toString();

 if ( sMask == null )
    sMask = "$7.2";

 // La mascara indica decimales...
 var iAux = sMask.indexOf( '.' );
 if ( iAux == -1 )
 {
  iInt = valueof( sMask.substr(1) );
  iDec = 0;
 }
 else
 {
  iInt = valueof( sMask.substring(1,iAux) );
  iDec = valueof( sMask.substr(iAux+1) );
 }

 // Eliminar digitos NO numericos (menos la coma)
 vValue = vValue.replace( /[^\d,]/g, "" );

 // Localizar ultimo separador
 iAux = vValue.lastIndexOf( ',' )
 if ( iAux == -1 )
 {
  sInt = vValue;
  sDec = "";
 }
 else
 {
  sInt = vValue.substring( 0, iAux );  // Parte entera  textual
  sDec = vValue.substr( iAux + 1 );    // Parte decimal textua
 }

 // Relleno de ceros por la derecha
 if ( iDec )
    sDec = (sDec + "00000000000000000000").substring( 0, iDec );

 if ( sMask.charAt(0) == "&" )
 {
  vAux = sInt;
  if ( iDec ) vAux += ","+ sDec;
 }
 else if ( sMask.charAt(0) == "#" )
 {
  vAux = sInt;
  if ( iDec ) vAux += "."+ sDec;
  vAux = valueof( vAux );
 }
 else if ( sMask.charAt(0) == "@" )
 {
  sInt = "00000000000000000000" + sInt;
  sInt = sInt.substr( sInt.length - iInt );
  vAux = sInt + (iDec ? sDec : "");
 }
 else if ( sMask.charAt(0) == "$" )
 {
  if ( sInt.length > 3 )
  {
   vAux = "";
   for ( var Idx = sInt.length - 3; Idx > 0; Idx -= 3 )
       vAux = '.' + sInt.substr( Idx, 3) + vAux;
   sInt = sInt.substring( 0, Idx + 3 ) + vAux;
  }

  vAux = sInt;
  if ( iDec ) vAux += ","+ sDec;
 }

 return (vAux);
}

//________________________________________________________________________________________
// Retorna un texto formateado en longitud y relleno indicado
// MASCARAS:
// p<d:">10"  String de 10 con alineacion a la derecha y relleno de espacios
// p>d:"*<10" String de 10 con alineacion izquierda y relleno de asteriscos
function fillof( vValue, sMask )
{
 var sAux = "";
 var iAux = 0;
 var sPad = " ";
 var iLen = 0;
 var iTop = 0;

 if ( vValue == null )
    vValue = "";
 else
    vValue = vValue.toString();

 if ( sMask == null )
    sMask = "<255";

 iAux = sMask.indexOf( "<" );
 if ( iAux == -1 )
    iAux = sMask.indexOf( ">" );

 if ( iAux != -1 )
 {
  if ( iAux > 0 )
     sPad = sMask.charAt( iAux - 1 );             // Nuevo padding

  iLen = valueof( sMask.substr(iAux+1) );         // Length del string
  iTop = (iLen > vValue.length) ? iLen - vValue.length : 0;

  while ( sPad.length < iTop )
        sPad += sPad;

  if ( sMask.charAt(iAux) == '<' )
     sAux = (vValue + sPad).substring(0, iLen);   // Alineacion izquierda
  else
     sAux = (sPad.substring(0,iTop) + vValue).substring(0, iLen); // Alineacion derecha
 }

 return (sAux);
}

//________________________________________________________________________________________
// Retorna la coordenada de "latitud" absoluta de un objeto HTML
function pxleftof( vNode )
{
 var oNode = vNode;
 if ( typeof(vNode) == "string" )
    oNode = pointerof( vNode );
 if ( !oNode || !oNode.offsetParent )
    return (0);

 var iAux = 0;
 while ( oNode.offsetParent )
  {
    iAux += oNode.offsetLeft;
    oNode = oNode.offsetParent;
  }

 var iZoom = 0;
 try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
 if ( iZoom == 0 ) iZoom = 100;
 iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );

 return (iAux);
}

//________________________________________________________________________________________
// Retorna la coordenada de "altitud" absoluta de un objeto HTML
function pxtopof( vNode )
{
 var oNode = vNode;
 if ( typeof(vNode) == "string" )
    oNode = pointerof( vNode );
 if ( !oNode || !oNode.offsetParent )
    return (0);

 var iAux = 0;
  while ( oNode.offsetParent )
  {
    iAux += oNode.offsetTop;
    oNode = oNode.offsetParent;
  }

 var iZoom = 0;
 try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
 if ( iZoom == 0 ) iZoom = 100;
 iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );

 return (iAux);
}

//________________________________________________________________________________________
// Retorna la anchura absoluta de un objeto HTML
function pxwidthof( oNode )
{
 var iAux = 0;

 if ( typeof(oNode) == "string" )
    oNode = pointerof( oNode );

 if ( oNode )
 {
  var iZoom = 0;
  try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
  if ( iZoom == 0 ) iZoom = 100;
  iAux = oNode.offsetWidth;
  iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );
 }

 return (iAux);
}

//________________________________________________________________________________________
// Retorna la altura absoluta de un objeto HTML
function pxheightof( oNode )
{
 var iAux = 0;

 if ( typeof(oNode) == "string" )
    oNode = pointerof( oNode );

 if ( oNode )
 {
  var iZoom = 0;
  try { iZoom = valueof( root.document.body.style.zoom ); } catch(e) {}
  if ( iZoom == 0 ) iZoom = 100;
  iAux = oNode.offsetHeight;
  iAux = Math.round( iAux + ((iAux * (iZoom - 100)) / 100) );
 }

 return (iAux);
}
//________________________________________________________________________________________
// Retorna nulo o una instancia al objeto ActiveX
function activexof( sActivexID )
{
 var oAux = null;

 try
 {
  if ( window.ActiveXObject )
     oAux = new ActiveXObject( sActivexID );
  else if ( window.GeckoActiveXObject )
     oAux = new GeckoActiveXObject( sActivexID );
 } catch(e) {}

 return (oAux);
}

//________________________________________________________________________________________
// Retorna un objeto [Function] el cual retorna el valor actual de un atributo de estilo
function styleof( oHTML )
{
 var sAux = idof( oHTML );
 var fAux = null;

  if ( oHTML.currentStyle )
    fAux = new Function("a","var oAux = document.getElementById('"+ sAux +"')\n"+
                            "return oAux.currentStyle[a];" );
  else if ( window.getComputedStyle )
    fAux = new Function("a","var oAux   = document.getElementById('"+ sAux +"')\n"+
                            "var oStyle = document.defaultView.getComputedStyle(oAux,null)\n"+
                             "return oStyle.getPropertyValue(a);" );
 return (fAux);
}

//________________________________________________________________________________________
// Retrorna un puntero a un objeto HTML en base a un 'id' o 'name'
// Esta funcion tambien incorpora al objeto una envoltura necesaria (wrapper)
// para poder manejar eventos de forma estandar DOM W3C.
function pointerof( vName, oWin )
{
 if ( vName == null ) return (null);

 var oTarget = oWin ? oWin : window;
 var oHTML   = null;

 if ( vName.constructor == String )
    oHTML = oTarget.document.getElementById( vName.toString() );
 else
    oHTML = vName;

 if ( oHTML && oHTML.setInnerHTML == undefined )
 {
  oHTML.setInnerHTML = DOMSetInnerHTML;
  oHTML.getInnerHTML = DOMGetInnerHTML;
  oHTML.setOuterHTML = DOMSetOuterHTML;
  oHTML.getOuterHTML = DOMGetOuterHTML;
  oHTML.setInnerText = DOMSetInnerText;
  oHTML.getInnerText = DOMGetInnerText;
  oHTML.insertAfter  = DOMInsertAfter;

  if ( isIE )
  {
   oHTML.dispatchEvent       = DOMDispatchEvent;
   oHTML.removeEventListener = DOMRemoveEventListener;
   oHTML.addEventListener    = DOMAddEventListener;
  }
 }

 return (oHTML);
}


//________________________________________________________________________________________
// Retorna una cadena como resultado de la concatenacion de todos los caracteres de la
//   cadena origen. Sirve para crear excepcciones de cadenas a traducir por Assima.
function str2assima (sOrigen)
{
  if (sOrigen == null)
    sOrigen = "";

  if (sOrigen.length > 0)
  {
    var sRet = "";

    for (var iIdx=0, iSize=sOrigen.length ; iIdx<iSize ; iIdx++)
      sRet = sRet + "'" + sOrigen.charAt(iIdx)  + "'+";

    if (sRet.charAt(sRet.length-1) == '+')
      sRet = sRet.substr(0, sRet.length-1);
    return(sRet);
  }
  else
  {
    return("''");
  }
}


//________________________________________________________________________________________
//
function DOMToSource(){return this.scopeName+". CLASS. "+this.className+" = "+this.toString();}
function DOMToString() { return (this.message); }
function DOMInitEvent( sType, bBubble, bCancelable ) { this.type = sType; }
function DOMEventGetKey() { return (this.which); }
function DOMPreventDefault() { this.returnValue = false; } // Cancelar evento
function DOMStopPropagation() { this.cancelBubble = true; } // Cancelar burbuja
function DOMSetInnerText(sTxt) {if (isIE) this.innerText=sTxt; else this.textContent=sTxt;}
function DOMGetInnerText() { return ( isIE ? this.innerText : this.textContent ); }
function DOMDispatchEvent( oEvent ) { this.fireEvent( "on" + oEvent.type, oEvent ); }
function DOMEventGetTarget() { return (this.target ? this.target : this.currentTarget); }
function DOMEventGetType() { return (this.type); }
function DOMEventGetTime() { return (this.timeStamp); }
function DOMEventGetKeyFlags(){return{alt:this.altKey,ctrl:this.ctrlKey,shift:this.shiftKey};}
function DOMSetInnerHTML( sHTML ) { this.innerHTML = sHTML; }
function DOMGetInnerHTML() { return (this.innerHTML); }
function DOMSetOuterHTML( sHTML ) { return (false); }

//________________________________________________________________________________________
//
function DOMInsertAfter( oNewNode, oChildNode )
{
 if ( oChildNode && oChildNode.nextSibling )
    this.insertBefore( oNewNode, oChildNode.nextSibling );
 else
    this.appendChild( oNewNode );
}

//________________________________________________________________________________________
//
function DOMTimeStamp( iTimeStart )
{
 var iTimeStop = new Date().getTime();
 if ( iTimeStart ) iTimeStop = numberof( (iTimeStop - iTimeStart) / 1000, "$9.2" )
 return (iTimeStop);
}

//________________________________________________________________________________________
//
function DOMGetOuterHTML()
{
 var oContainer = document.createElement( "div" );
 oContainer.appendChild( this.cloneNode(true) );
 return (oContainer.innerHTML);
}

//________________________________________________________________________________________
//
function DOMRemoveEventListener( sEvent, fHandler, bBubble )
{
 this.detachEvent( "on" + sEvent.toLowerCase(), fHandler );
}

//________________________________________________________________________________________
//
function DOMAddEventListener( sEvent, pHandler, bBubble )
{
 sEvent = sEvent.toLowerCase();

 this.attachEvent( "on" + sEvent, pHandler );

 // Element Node
 if ( this.nodeType == 1 )
    DOMEventsListeners.push( {target:this, event:sEvent, handler:pHandler} );
}

//________________________________________________________________________________________
// Retorna el objeto global de evento compatible DOM
function DOMEvent()
{
 var pCaller = arguments.callee.caller;
 var oEvent  = pCaller.arguments[0];

 if ( isIE )
 {
  if ( window.event )
     oEvent = window.event;
  else if ( oEvent == null )
     return (null);

  window.scrollX         = document.body.scrollLeft;
  window.scrollY         = document.body.scrollTop;

  oEvent.target          = oEvent.target ? oEvent.target : oEvent.srcElement;
  oEvent.currentTarget   = oEvent.target;
  oEvent.which           = oEvent.keyCode;
  oEvent.pageX           = oEvent.clientX + window.scrollX;
  oEvent.pageY           = oEvent.clientY + window.scrollY;
  oEvent.timeStamp       = DOMTimeStamp();
  oEvent.preventDefault  = DOMPreventDefault;    // Cancelar evento
  oEvent.stopPropagation = DOMStopPropagation;   // Cancelar burbuja

  if ( oEvent.type == "mouseover")
     oEvent.relatedTarget = oEvent.fromElement;
  else if ( oEvent.type == "mouseout")
     oEvent.relatedTarget = oEvent.toElement;
  else
     oEvent.relatedTarget = null;
 }
 else if ( typeof(oEvent) != "object" )
 {
  oEvent = null;
 }

 if ( oEvent != null )
 {
  oEvent.fullStop         = DOMEventFullStop
  oEvent.getTarget        = DOMEventGetTarget;
  oEvent.getType          = DOMEventGetType;
  oEvent.getTime          = DOMEventGetTime;
  oEvent.getMouseLocation = DOMEventGetMouseLocation;
  oEvent.getMouseFlags    = DOMEventGetMouseFlags;
  oEvent.getKeyFlags      = DOMEventGetKeyFlags;
  oEvent.getKey           = DOMEventGetKey;
  oEvent.setKey           = DOMEventSetKey;

/**  oEvent.constructor      = new Function("return DOMEvent;"); **/
 }

 return (oEvent);
}

//________________________________________________________________________________________
//
function DOMEventFullStop()
{
 this.preventDefault();
 this.stopPropagation();
 return (false);
}

//________________________________________________________________________________________
//
function DOMEventGetMouseLocation()
{
 var oAux = { clientLeft: this.clientX, clientTop: this.clientY,
              pageLeft:   this.pageX,   pageTop:   this.pageY,
              screenLeft: this.screenX, screenTop: this.screenY };
 return (oAux);
}

//________________________________________________________________________________________
//
function DOMEventGetMouseFlags()
{
 var iAux = this.button;

 if ( isIE )
 {
  if ( iAux == 2 )
      iAux = 3;
  else if ( iAux > 3 )
     iAux = 2;
 }

 return (iAux);
}

//________________________________________________________________________________________
//
function DOMEventSetKey( vArg )
{
 var iCode = 0;

 if ( typeof(vArg) == "string" )
    iCode = unicodeof( vArg );
 else
    iCode = vArg;

 if ( typeof(iCode) != "number" )
    return (false);

 if ( isIE )
 {
  this.keyCode = iCode;
  return (true);
 }
 else
 {
  this.fullStop();

  var oAux   = this.target;
  var iStart = oAux.selectionStart;
  var iEnd   = oAux.selectionEnd;
  var sAux   = oAux.value;

  oAux.value = sAux.substring( 0, iStart ) + charof(iCode) +  sAux.substring( iEnd );
  iStart++;
  oAux.setSelectionRange( iStart, iStart );

  return (false);
 }
}

//________________________________________________________________________________________
// Textualizar errores
function DOMException( vError, sMsg )
{
 var oAux = { code:0, message:"", toString:DOMToString };

 if ( typeof(vError) == "object" )
 {
  oAux.code    = vError.code    ? vError.code    : vError.number;
  oAux.message = vError.message ? vError.message : vError.description;
 }
 else if ( typeof(vError) == "number" )
 {
  oAux.code = vError;
  if ( typeof(sMsg) == "string" )
     oAux.message = sMsg;
 }
 else if ( typeof(vError) == "string" )
 {
  oAux.message = vError;
 }

 if ( oAux.code    == null || oAux.code    == 0  ) oAux.code    = 99;
 if ( oAux.message == null || oAux.message == "" ) oAux.message = "Evento inexperado";

 trace( "Excepci\Xf3n "+ oAux.code +": "+ oAux.message, 4 );

 return (oAux);
}

//________________________________________________________________________________________
// Contenedor compatible W3C (principalmente para popups)
function DOMContainer( iLeft, iTop, iWidth, iHeight )
{
 if ( iLeft   == null ) iLeft   = 0;
 if ( iTop    == null ) iTop    = 0;
 if ( iWidth  == null ) iWidth  = 100;
 if ( iHeight == null ) iHeight = 100;

 var oWin    = (isIE) ? window.createPopup() : window;
 var oCanvas = oWin.document.createElement( "div" );

 oCanvas.style.display  = "none";
 oCanvas.style.position = "absolute";
 oCanvas.style.left     = "0px";
 oCanvas.style.top      = "0px";
 oCanvas.style.width    = "100%";
 oCanvas.style.height   = "100%";

 oWin.document.body.appendChild( oCanvas );

 this.window = oWin;
 this.canvas = oCanvas;
 this.left   = iLeft;
 this.top    = iTop;
 this.width  = iWidth;
 this.height = iHeight;
 this.show   = DOMContainerShow;
 this.hide   = DOMContainerHide;
 this.remove = DOMContainerRemove;
}

//________________________________________________________________________________________
//
function DOMContainerShow( iLeft, iTop, iWidth, iHeight )
{
 var oContainer = this;

 if ( iLeft   == null ) iLeft   = valueof( oContainer.left   );
 if ( iTop    == null ) iTop    = valueof( oContainer.top    );
 if ( iWidth  == null ) iWidth  = valueof( oContainer.width  );
 if ( iHeight == null ) iHeight = valueof( oContainer.height );

 oContainer.left   = iLeft;
 oContainer.top    = iTop;
 oContainer.width  = iWidth;
 oContainer.height = iHeight;

 oContainer.canvas.style.display = "block";

 if ( isIE )
 {
  oContainer.window.show( iLeft, iTop, iWidth, iHeight, document.body );
 }
 else
 {
  oContainer.canvas.style.left   = iLeft   +"px";
  oContainer.canvas.style.top    = iTop    +"px";
  oContainer.canvas.style.width  = iWidth  +"px";
  oContainer.canvas.style.height = iHeight +"px";
 }
}

//________________________________________________________________________________________
//
function DOMContainerHide()
{
 var oContainer = this;
 if ( isIE ) oContainer.window.hide();
 oContainer.canvas.style.display = "none";
}

//________________________________________________________________________________________
//
function DOMContainerRemove()
{
 var oContainer = this;

 if ( Language )
     Language.garbageCollector( oContainer.canvas.getElementsByTagName("*") );

 oContainer.hide();
 oContainer.canvas.innerHTML = "";
 oContainer.canvas.parentNode.removeChild( oContainer.canvas );
}


//________________________________________________________________________________________
// USO RESERVADO (sujeto a modificaciones futuras)
function loadLibrary( sURL )
{
 var oHttp = new XMLHttpRequest;

 oHttp.open( "get", sURL, false );
 oHttp.send( null );

 if ( oHttp.status < 200 || oHttp.status > 299 )
 {
  trace( "Error al cargar la librer\xEDa\n"+ sURL +"\n"+ oHttp.status +": "+
         oHttp.statusText, 4 );
  return (oHttp.status);
 }

 try
 {
  var sAux = "\r\n\r\n/*\r\n"+
             "JScript On-Line\r\n"+
             "Copyright Allianz Seguros\r\n"+
             "Source: "+ sURL +"\r\n*/\r\n\r\n"+ trimof( oHttp.responseText ) +"\r\n\r\n";
  document.dispatchScript( sAux );
 }
 catch(e)
 {
  trace( "Error al ejecutar librer\xEDa\n"+ sURL, 4 );
  return (-1);
 }

 return (oHttp.status);
}

//________________________________________________________________________________________
// USO RESERVADO
function log( sMessage, iType )
{
 if ( !iType ) iType = 4;   // 4=Informacion, 2=Advertencia, 1=Error
 if ( !arguments.callee.shell) arguments.callee.shell = activexof( "WScript.Shell" );
 if ( arguments.callee.shell ) arguments.callee.shell.LogEvent( iType, sMessage );
}

//________________________________________________________________________________________
//
function trace( sMessage, iType )
{
 var sType = "";

 switch ( iType )
 {
  case 2:  sType = "i"; break;   // Inform
  case 3:  sType = "!"; break;   // Alert
  case 4:  sType = "X"; break;   // Crash
  default: sType = "$"; break;   // Comment
 }

 try
 {
  if ( top.document.console ) top.document.console( sMessage, document.URL, sType );
 } catch(e) {}

 if ( namespace.dump ) dump( sMessage );
}

//________________________________________________________________________________________
// Escribe codigo HTML a modo de consola en la pagina acutal
function echo( sHTML )
{
 var oAux = document.createElement( "div" );
 oAux.innerHTML = sHTML;
 document.body.appendChild( oAux );
}

//________________________________________________________________________________________
//
function StringBuffer( sText )
{
 this.data        = [sText];
 this.toString    = new Function(           "return this.data.join('');"                );
 this.split       = new Function( "x",      "return this.toString().split(s);"          );
 this.substring   = new Function( "x", "y", "return this.toString().substring(x,y);"    );
 this.substr      = new Function( "x", "y", "return this.toString().substr(x,y);"       );
 this.indexOf     = new Function( "s", "x", "return this.toString().indexOf(s,x);"      );
 this.lastIndexOf = new Function( "s", "x", "return this.toString().lastIndexOf(s,x);"  );
 this.chatAt      = new Function( "x",      "return this.toString().charAt(x);"         );
 this.append      = new Function( "s",      "this.data.push(s);"                        );
 this.insert      = new Function( "x","s",  "var z = this.toString();\n"+
                                  "this.data = [ z.substring(0,x) + s + z.substr(x) ];" );
 this.replace     = new Function( "x", "y", "z", "var s = this.toString();\n"+
                                  "if ( typeof x.valueOf() == 'number' )\n"+
                                  "  this.data = [ s.substr(0,x) + z + s.substr(y) ];\n"+
                                  "else\n"+
                                  "  this.data = [ s.replace(x,y) ];\n" );
}

//________________________________________________________________________________________
//
function Integer( vValue )
{
 this.value    = valueof( vValue, 10 );
 this.valueOf  = new Function( "return (this.value);" );
 this.toString = new Function( "return (''+this.value);" );
}

//________________________________________________________________________________________
//
function Collection()
{
 var oAux = [];

 if ( arguments.length == 1 && arguments[0] != null  )
 {
  var oArgv = arguments[0];
  for ( var Member in oArgv )
      oAux[Member] = oArgv[Member];
 }
 else
 {
  for ( var Idx = 0, Len = arguments.length; Idx < Len; Idx++ )
      oAux[ arguments[Idx] ] = Idx;
 }

 oAux.constructor = "Collection";

 return (oAux);
}

//________________________________________________________________________________________
//
function Pointer( oArg )
{
 var oAux      = new Function( "v","if(arguments.length)namespace[arguments.callee.id]=v;"+
                                   "return namespace[arguments.callee.id];" );
 oAux.valueOf  = new Function( "return namespace[this.id];" );
 oAux.toString = new Function( "return (this.id);" );
 oAux.destroy  = new Function( "namespace[this.id]=null;" );
 oAux.id       = idof();

 window.addEventListener( "unload", oAux.destroy, false);
 namespace[oAux.id] = oArg;
 oAux.constructor   = "Pointer";

 return (oAux);
}

//________________________________________________________________________________________
// Implementado para Mozilla
if (!namespace.Enumerator) namespace.Enumerator = function()
{
 this.index       = 0;
 this.data        = [];
 this.moveFirst   = function() {this.index=0;},
 this.moveNext    = function() {this.index++;},
 this.atEnd       = function() {return(this.index==this.data.length);},
 this.item        = function() {return(this.data[this.index]);}
 this.constructor = "Enumerator";

 var cArgs = arguments[0];
 for ( var Member in cArgs )
     this.data.push( cArgs[Member] );
}

//________________________________________________________________________________________
//
function Package( sName )
{
 if ( namespace[sName] != null ) return;
 namespace.js[sName] = {};
 namespace[sName]    = "var PRIVATE   = {};\n" +
                       "var PUBLIC    = Language.getThis(this);\n" +
                       "var PROTECTED = PUBLIC._protected;\n" +
                       "var STATIC    = arguments.callee;\n" +
                       "Language.setInstance(PUBLIC,PRIVATE,STATIC,PROTECTED);\n"+
                       "var private   = PRIVATE;\n"+     // Compatibilidad nuevas clases
                       "var public    = PUBLIC;\n"+      // Compatibilidad nuevas clases
                       "var protected = PROTECTED;\n"+   // Compatibilidad nuevas clases
                       "var static    = STATIC;\n";      // Compatibilidad nuevas clases

 // Compatibilidad nuevas clases
 if ( !window.Class )
 {
  window.global  = window;
  window.Class   = CLASS;
  window.service = SERVICE;
  window.public  = PUBLIC;
 }
}

//________________________________________________________________________________________
//
function Import( sURL, bSync )
{
 trace( "Import: "+ sURL, 2 );

 if ( sURL == null )
    return;

 var iAux = sURL.indexOf("/");

 // Si no es una URL formalizada
 if ( iAux == -1 )
 {
  if ( sURL.indexOf("config.") == 0 || sURL.indexOf("api.") == 0 )
     sURL = $LIBURI +"/js/"+ sURL +".js";
  else
     sURL = $LIBURI +"/js/class."+ sURL +".js";
 }

 var sAux = sURL.toLowerCase();

 // Verificar que no este ya cargada la libreria
 if ( isIE )
 {
  var aAux = document.getElementsByTagName( "script" );
  for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
      if ( aAux[Idx].src.toLowerCase() == sAux )
         return;
 }
 else
 {
  var oHead = document.getElementsByTagName( "head" );
  if ( oHead )
  {
   sAux     = urlof( sAux );
   var aAux = oHead[0].childNodes;
   for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
       if ( aAux[Idx].nodeName == "SCRIPT" && aAux[Idx].src.toLowerCase() == sAux )
          return;
  }
 }

 var iHttp = 0;
 if ( window.isReady == true || bSync == true ) // Si la pagina ya esta cargada..
    iHttp = loadLibrary( sURL );
 else
    document.write( "<script type='text/javascript' src='"+ sURL +"'></"+"script>" );

 if ( iHttp > 199 && iHttp < 300 ) iHttp = 0;

 return (iHttp);
}

if ( !window.Language ) {

//________________________________________________________________________________________
// Pila de escuchadores de eventos
if (!namespace.DOMEventsListeners) namespace.DOMEventsListeners = [];

//________________________________________________________________________________________
// Hace visible DOMimplementation
if (!namespace.DOMImplementation)
   namespace.DOMImplementation = new function() { return (document.implementation); }

//________________________________________________________________________________________
// Implementado para Microsoft
if (!namespace.DOMParser)
{
 namespace.DOMParseFromString = function( sXML, sContentType ) // contentType="text/xml"
 {
  var oDOMDocument = document.createElement( "xml" );
  oDOMDocument.loadXML( sXML );
  return (oDOMDocument.documentElement.ownerDocument);
 }
 namespace.DOMParser = function(v){ this.parseFromString = DOMParseFromString; }
}

//________________________________________________________________________________________
// Implementado para Microsoft
if (!namespace.XMLSerializer)
{
 namespace.XMLSerializeToString = function(oDoc){return (oDoc.xml?oDoc.xml:oDoc.outerHTML);}
 namespace.XMLSerializer        = function(){this.serializeToString=XMLSerializeToString;}
}

//________________________________________________________________________________________
// Implementado para Microsoft
if (!namespace.XMLHttpRequest) namespace.XMLHttpRequest = function(v)
{
 var oAux = activexof( "msXML2.XMLHttp" );
 return (oAux);
}

//________________________________________________________________________________________
// Implementado para Microsoft
if (!namespace.XSLTProcessor)
{
 namespace.XSLImportStylesheet = function( sDocXSL )
 {
  this._docXSL = sDocXSL;
 }

 namespace.XSLTransformToDocument = function( oDocXML )
 {
  return oDocXML.transformNode( this._docXSL );
 }

 namespace.XSLTProcessor = function(v)
 {
  this._docXSL             = null;
  this.importStylesheet    = XSLImportStylesheet;
  this.transformToDocument = XSLTransformToDocument;
 }
}

//________________________________________________________________________________________
// Implementado para Microsoft
if (!namespace.dump) namespace.dump = function( sExpression ) { Debug.write(sExpression);}

//________________________________________________________________________________________
// Retorna el TexRange de la seleccion actual (isCollapsed==false => Texto seleccionado)
if (!namespace.getSelection) namespace.getSelection = function()
{
 var oAux         = document.selection.createRange();
 oAux.isCollapsed = !(oAux.boundingWidth > 0 && oAux.offsetTop > 1);
 return (oAux);
}

//________________________________________________________________________________________
// Implementado para Microsoft
if (!document.defaultView) document.defaultView = window;

//________________________________________________________________________________________
// Retorna una colecion de elemntos HTML en base a su className
if (!document.getElementsByClassName) document.getElementsByClassName = elementsof;

//________________________________________________________________________________________
// Implementado para Microsoft (Events,MouseEvents,HTMLEvents,UIEvents,MutationEvents
if (!document.createEvent) document.createEvent = function( sAction )
{
 if ( sAction.toLowerCase() != "mouseevents" )
    return (null);

 var oEvent       = document.createEventObject();
 oEvent.initEvent = DOMInitEvent;

 return (oEvent);
}

//________________________________________________________________________________________
// Ejecuta script on-line
if (!document.dispatchScript) document.dispatchScript = function( sScript )
{
 var oScript = document.createElement( "script" );
 document.head.appendChild( oScript );
 oScript.text = sScript;
}

/**
*
*/
CLASS. LocalConfiguration = function()
{
 eval( lang ); with(STATIC) with(PROTECTED) with(PUBLIC) with(PRIVATE) {

   //_____________________________________________________________________________________
   //
   NATIVE. boolean. isInternal        = null; // Internal user
   NATIVE. boolean. isTrust           = null; // Trusted user
   NATIVE. boolean. isMaster          = null; // Master user

   NATIVE. string.  $DATE             = null  // Current date
   NATIVE. string.  $CHARSET          = null  // Current charset
   NATIVE. string.  $URL              = null; //    http://ntwasdes/draw00/img/allianz.gif
   NATIVE. string.  $PROTOCOL         = null; // protocol:                           http:
   NATIVE. string.  $DOMAIN           = null; // domain:                          ntwasdes
   NATIVE. string.  $HOST             = null; // domain + port:                ntwasdes:80
   NATIVE. string.  $URF              = null; // Full folder:  http://ntwasdes/draw00/img/
   NATIVE. string.  $URN              = null; // Resource name:                allianz.gif
   NATIVE. string.  $PATH             = null; // Full folder:                  /draw00/img
   NATIVE. string.  $NS               = null; // Main folder (namespace):          /draw00
   NATIVE. string.  $NSS              = null; // Last folder  (sub-namespace):        /img

   NATIVE. string.  $SCREEN           = null; // Screen configuration
   NATIVE. string.  $CONNECTION       = null; // Connection (lan, modem, offline, unknown)
   NATIVE. string.  $PLATFORM         = null; // OS platform
   NATIVE. string.  $CPU              = null; // CPU family
   NATIVE. boolean. $JAVA             = null; // Java enabled
   NATIVE. boolean. $COOKIES          = null; // Cookies enabled
   NATIVE. boolean. $AXO              = null; // Microsoft ActiveX Support

   NATIVE. string.  $DRIEURI          = null; // DRIE folder (/DRIE00 or /DRIE01. Default /DRIE00)

   STATIC. Object.  clientCaps        = null;

   //_____________________________________________________________________________________
   //
   EVENT. onkeydown = function()
   {
    var oEvent = DOMEvent();

    // [ALT] + admiracio
    if ( oEvent.altKey && oEvent.getKey() == 221 )
    {
     var sAux = "";
     for ( var Member in window )
         if ( Member.charAt(0) == "$" )
             sAux += Member +"="+ window[Member] +"\n";
     if ( sAux != "" )
        alert( "\n"+ sAux +"\n", 3 );
    }

    return (true);
   }

   //_____________________________________________________________________________________
   // Obtiene el entorno donde establecer la variable globales
   STATIC. Object. getEnvironment = function()
   {
    var oAux = null;
    try {if (parent.$USER)                            oAux = parent;           }catch(e){}
    try {if (oAux == null && top.$USER)               oAux = top;              }catch(e){}
    try {if (oAux == null && top.opener.$USER)        oAux = top.opener;       }catch(e){}
    try {if (oAux == null && top.opener.parent.$USER) oAux = top.opener.parent;}catch(e){}
    try {if (oAux == null && top.opener.top.$USER)    oAux = top.opener.top;   }catch(e){}
    if ( oAux == null )                               oAux = window;

    return (oAux)
   }

   //_____________________________________________________________________________________
   // Obtener registro de usuario
   STATIC. Object. getUserRegister = function( String )
   {
    var sUser = arguments[0];
    var oHttp = new XMLHttpRequest;
    var oAux  = null;

    oHttp.open( "post", $LIBURI +"/remoteResource/LDAP/getUserRegister.jsp", false );
    oHttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
    oHttp.send( "user="+ sUser );

    if ( oHttp.status >= 200 && oHttp.status <= 299 )
    {
     var sAux = trimof( oHttp.responseText );
     sAux     = sAux.replace( /, N\/A/g, ""   );
     sAux     = sAux.replace( /\[/g,     "{\n"  );
     sAux     = sAux.replace( /\]/g,     "'\n}" );
     sAux     = sAux.replace( /=/g,      ":'" );
     sAux     = sAux.replace( /,/g,      "',\n" );

     try { eval("oAux="+sAux); } catch(e) {}
    }

    return (oAux);
   }

   //_____________________________________________________________________________________
   //Acceso WMI a la maquina
   STATIC. Array. WMIQuery = function( String )
   {
    var sSQL = arguments[0];
    var aAux = [];

    try
    {
     var oLocator = activexof("WbemScripting.SWbemLocator");
     var oService = oLocator.ConnectServer();
     var oData    = oService.ExecQuery( sSQL.replace(/\'/g,'"') ); ; //"
     var oAux     = new Enumerator( oData );
     for ( var Idx = 0; !oAux.atEnd(); oAux.moveNext(), Idx++ )
     {
      aAux[Idx] = {};
      var oItem = oAux.item();
      var oEnum = new Enumerator( oItem.Properties_ );
      for (; !oEnum.atEnd(); oEnum.moveNext() )
      {
       if ( oEnum.item().IsArray )
          if ( oEnum.item().Value )
             aAux[Idx][oEnum.item().Name] = new VBArray(oEnum.item().Value).toArray();
          else
             aAux[Idx][oEnum.item().Name] = null;
       else
          aAux[Idx][oEnum.item().Name] = oEnum.item().Value;
      }
     }
    } catch(e) { return (null); }

    return (aAux);
   }

   //_____________________________________________________________________________________
   // Establece variables de generales de entorno
   STATIC. Void. setEnvironment = function()
   {
    var sAux    = (location.pathname.charAt(0) == "/") ?
                  location.pathname : "/" + location.pathname;

    $PROTOCOL   = location.protocol.toLowerCase();
    $DOMAIN     = location.hostname.toLowerCase();
    $HOST       = location.host.toLowerCase();
    $URL        = location.href;
    $URN        = sAux.substr( sAux.lastIndexOf("/") + 1 );
    $NS         = sAux.substring( 0, sAux.indexOf("/",1) );
    $PATH       = sAux.substring( 0, sAux.lastIndexOf("/") );
    $URF        = $PROTOCOL +"/"+"/"+ $HOST + $NS +"/";
    $NSS        = ($NS == $PATH)? $NS : $PATH.substr( $PATH.lastIndexOf("/") + 1 );

    $OVERLOAD   = clientCaps.uniqueNumber   ? clientCaps.uniqueNumber   : 0;
    $CONNECTION = clientCaps.connectionType ? clientCaps.connectionType : "unknown";
    $PLATFORM   = navigator.platform        ? navigator.platform        : "XXX"
    $CPU        = navigator.cpuClass        ? navigator.cpuClass        : "XXX";
    $SCREEN     = screen.width +"x"+ screen.height +"x"+ screen.colorDepth;
    $JAVA       = navigator.javaEnabled();

    $COOKIES    = (typeof window.dialogArguments == "undefined") ?
                  navigator.cookieEnabled : true;

    var sNsAux = $NS.toLowerCase();
    if ((sNsAux == "/drie00") || (sNsAux == "/drie01"))
      $DRIEURI = sNsAux;
    else
      $DRIEURI = "/drie00";

    try      { $CHARSET = document.charset ?
               document.charset.toUpperCase() : document.characterSet.toUpperCase(); }
    catch(e) { $CHARSET = ""; }

    $AXO  = activexof( "Scripting.Dictionary" ) ? true : false;
    $DATE = {toString:new Function("return dateof(null,'@dd/@mm/@yyyy');") };

    var oSrc = getEnvironment();

    window.$TIMER    = oSrc.$TIMER    ? oSrc.$TIMER    : null;
    window.$USER     = oSrc.$USER     ? oSrc.$USER     : "";
    window.$CN       = oSrc.$CN       ? oSrc.$CN       : "";
    window.$IP       = oSrc.$IP       ? oSrc.$IP       : "";
    window.$SERVER   = oSrc.$SERVER   ? oSrc.$SERVER   : "";
    window.$SESSION  = oSrc.$SESSION  ? oSrc.$SESSION  : "";
    window.$TERMINAL = oSrc.$TERMINAL ? oSrc.$TERMINAL : "";

    if ( !oSrc.$WINUSR )
    {
      if (isIE && (isIntra || isTrial) )
      {
        var oAux = activexof( "WScript.Network" );
        if ( oAux )
        {
          oSrc.$WINUSR  = oAux.UserName;     // Nombre local del usuario windows
          oSrc.$MACHINE = oAux.ComputerName; // Nombre local de la maquina
        }
        
/**********
        // VPN activada
        window.$VPN = false;
        var aRows = WMIQuery( "select * from Win32_NetworkAdapter where NetConnectionStatus > 0 and "+
                              "(Name like '% VPN %' or Name like '% Wireless %')" );
        if ( !aRows || aRows.length ) window.$VPN = true;
     
        // Numero de serie del equipo     
        var aRows = WMIQuery( "select * from Win32_BIOS" );
        if ( aRows && aRows.length ) window.$SERIAL = aRows[0].SerialNumber;
***********/
        // VPN desactivada
        window.$VPN = false;
      }
    }

    window.$MACHINE = oSrc.$MACHINE ? oSrc.$MACHINE : "";
    window.$WINUSR  = oSrc.$WINUSR  ? oSrc.$WINUSR  : "";

    // Si no hay usuario, Not User
    if ( window.$USER == "" ) window.$USER = "NOTUSER";

    // Si es desarrollo y no hay usuario, utilizar el del windows
    if ( isTrial && window.$USER == "NOTUSER" && window.$WINUSR != "" )
       window.$USER = window.$WINUSR.toUpperCase();

    if ( window.$MACHINE != "" )
    {
     var iAux = window.$MACHINE.indexOf('.');
     if ( iAux != -1 ) window.$MACHINE = window.$MACHINE.substring( 0, iAux )
    }

    window.$USERID  = oSrc.$USERID  ?oSrc.$USERID  :(oSrc.strEmpNIF ?oSrc.strEmpNIF :"");
    window.$COUNTRY = oSrc.$COUNTRY ?oSrc.$COUNTRY :(oSrc.pais      ?oSrc.pais      :"");
    window.$COMPANY = oSrc.$COMPANY ?oSrc.$COMPANY :(oSrc.codEmpresa?oSrc.codEmpresa:"");
    window.$ENVIRON = oSrc.$ENVIRON ?oSrc.$ENVIRON :(oSrc.entorno   ?oSrc.entorno   :"");
    window.$CONTEXT = oSrc.$CONTEXT ?oSrc.$CONTEXT :(oSrc.APP       ?oSrc.APP       :"");
    window.$LANG    = oSrc.$LANG    ?oSrc.$LANG    :(oSrc.idioma    ?oSrc.idioma    :"");
    window.$AREA    = oSrc.$AREA    ?oSrc.$AREA    :(oSrc.ALLar     ?oSrc.ALLar     :"");
    window.$DIV     = oSrc.$DIV     ?oSrc.$DIV     :(oSrc.ALLdiv    ?oSrc.ALLdiv    :"");
    window.$DEP     = oSrc.$DEP     ?oSrc.$DEP     :(oSrc.ALLdep    ?oSrc.ALLdep    :"");
    window.$OU      = oSrc.$OU      ?oSrc.$OU      :(oSrc.ALLcol    ?oSrc.ALLcol    :"");
    window.$BRANCH  = oSrc.$BRANCH  ?oSrc.$BRANCH  :(oSrc.sucursal  ?oSrc.sucursal  :"");
    window.$AGENT   = oSrc.$AGENT   ?oSrc.$AGENT   :(oSrc.agente    ?oSrc.agente    :"");
    window.$COL     = oSrc.$COL     ?oSrc.$COL     :(oSrc.colaborador?oSrc.colaborador:"");

    if ( window.$ENVIRON.length > 3 ) window.$ENVIRON = window.$ENVIRON.substring(0,4);

    if ( window.$TERMINAL == "" && window.$IP != "" ) try
    {
     var aAux = window.$IP.split( "." );
     aAux[0]  = valueof(aAux[0]).toString( 16 );
     aAux[1]  = valueof(aAux[1]).toString( 16 );
     aAux[2]  = valueof(aAux[2]).toString( 16 );
     aAux[3]  = valueof(aAux[3]).toString( 16 );

     window.$TERMINAL = (fillof(aAux[0],"0>2") + fillof(aAux[1],"0>2") +
                         fillof(aAux[2],"0>2") + fillof(aAux[3],"0>2")).toUpperCase();
    } catch(e) {}

    if ( window.$SESSION == "" ) try
    {
     var sAux = document.cookie;
     var iAux = sAux.indexOf( "JSESSIONID=" )
     if ( iAux != -1 ) window.$SESSION = sAux.substring( iAux+11,sAux.indexOf(":",iAux) );
    } catch(e) {}

    window.$CN      = window.$CN.toUpperCase();
    window.$DEP     = window.$DEP.toUpperCase();
    window.$DIV     = window.$DIV.toUpperCase();
    window.$AREA    = window.$AREA.toUpperCase();
    window.$OU      = window.$OU.toUpperCase();
    window.$COUNTRY = window.$COUNTRY.toUpperCase();

    window.$STYLE      = oSrc.$STYLE      ? oSrc.$STYLE      : "allianz3.5";
    window.$PATCH      = oSrc.$PATCH      ? oSrc.$PATCH      : getPatches();
    window.$TECHNOLOGY = oSrc.$TECHNOLOGY ? oSrc.$TECHNOLOGY : getTechnology();
    window.$JWS        = oSrc.$JWS        ? oSrc.$JWS        : getJavaWebStart();

    // JS Engine version
    setJSVersion();

    window.$BROWSER = oSrc.$BROWSER;
    if ( window.$BROWSER == null )
    {
     var sAux        = getBrowser();
     window.$BROWSER = sAux.substring( 0, 2 );
     window.$BROWVER = sAux.substr( 2 );
    }

    window.$BROWVER = oSrc.$BROWVER;
    if ( window.$BROWVER == null )
    {
     var sAux        = getBrowser();
     window.$BROWVER = sAux.substr( 2 );
    }

    window.$BROWRENDER = oSrc.$BROWRENDER;
    if ( window.$BROWRENDER == null )
      window.$BROWRENDER = renderBrowserVersion();

    // Mirem si escrida des de una app de widgets
    //
    if ( window.$WIDGETS == null )
    {
      window.$WIDGETS = oSrc.$WIDGETS;

      if ( window.$WIDGETS == null )
        window.$WIDGETS = "";
    }

    // Mirem si hi han posibles partners : p.e. BPI
    //
    if ( window.$CIAPARTNER == null )
    {
      window.$CIAPARTNER = oSrc.$CIAPARTNER;

      if ( window.$CIAPARTNER == null )
        window.$CIAPARTNER = "";
      else
        window.$CIAPARTNER = window.$CIAPARTNER.toUpperCase();
    }

    window.$IE = oSrc.$IE;
    if ( window.$IE == null )
    {
     window.$IE  = "";
     window.$MVM = "";
     if ( isIE && window.WINDOWS_COMPONENT ) try
     {
      window.$IE  = clientCaps.getComponentVersion(WINDOWS_COMPONENT["IE"], "componentID");
      window.$MVM = clientCaps.getComponentVersion(WINDOWS_COMPONENT["MVM"],"componentID");
     } catch(e){}
    }

    window.$WINVER = oSrc.$WINVER ? oSrc.$WINVER : getWindowsVersion(window.$TECHNOLOGY);
   }

   //_____________________________________________________________________________________
   // JavaScript engine version
   PRIVATE. Void. setJSVersion = function()
   {
    if ( !isReady )
       document.write( "<script language='JavaScript1.1'>$JS='1,1';</script>" +
                       "<script language='JavaScript1.2'>$JS='1,2';</script>" +
                       "<script language='JavaScript1.3'>$JS='1,3';</script>" +
                       "<script language='JavaScript1.4'>$JS='1,4';</script>" +
                       "<script language='JavaScript1.5'>$JS='1,5';</script>" +
                       "<script language='JavaScript1.6'>$JS='1,6';</script>" );
   }

   //_____________________________________________________________________________________
   // Get browser type
   PRIVATE. String. getBrowser = function()
   {
    var sUA  = navigator.userAgent + ' ';
    var iAux = 0;
    var sAux = "XX"; // unknown
    var oAux = window.BROWSER_ID ? window.BROWSER_ID : {};

    for ( var Member in oAux )
    {
     iAux = sUA.indexOf( Member );
     if ( iAux != -1 )
     {
      iAux = iAux + Member.length + 1;
      sAux = oAux[Member] + sUA.substring( iAux, sUA.indexOf(' ', iAux) );
      sAux = sAux.replace( /;/g, "" );
      break;
     }
    }

    return (sAux);
   }


   //_____________________________________________________________________________________
   // Get rederer browser version
   PRIVATE. String. renderBrowserVersion = function()
   {
    var iEngine = $BROWVER; // version actual IE

    if (document.documentMode)
      iEngine = document.documentMode;

    var sEngine = iEngine.toString();

    if (sEngine.length > 3)
      sEngine = sEngine.substr(0,3);

    return (sEngine);
   }


   //_____________________________________________________________________________________
   // Get system Type
   PRIVATE. String. getTechnology = function()
   {
    var sUA  = navigator.userAgent + ' ';
    var sAux = "XXX"; // unknown
    var cAux = window.SYSTEM_ID ? window.SYSTEM_ID : {};

    for ( var Member in cAux )
    {
     if ( sUA.indexOf(Member) != -1 )
     {
      sAux = cAux[Member];
      break;
     }
    }

    return (sAux);
   }

   //_____________________________________________________________________________________
   // Get windows system number version
   PRIVATE. Number. getWindowsVersion = function( String )
   {
    var sTech    = arguments[0];
    var iUnknown = 0.0;
    var cAux     = window.WINDOWS_VERSION ? window.WINDOWS_VERSION : {};

    return (cAux[sTech] ? cAux[sTech] : iUnknown);
   }

   //_____________________________________________________________________________________
   // Browser patch
   PRIVATE. String. getPatches = function()
   {
    var sAux = window.clientInformation ? window.clientInformation.appMinorVersion : "";

    if ( sAux != "" )
    {
     var iAux = sAux.indexOf(";");
     sAux = sAux.substr(iAux + 1).replace( /;/gim, " " );
    }

    return (sAux);
   }

   //_____________________________________________________________________________________
   // Sun Java Web Start (Java Virtual Machine)
   PRIVATE. String. getJavaWebStart = function()
   {
    var sAux = "";
    var cAux = window.JAVA_WEB_START ? window.JAVA_WEB_START : {};

    if ( isIE )
    {
     for ( var Member in cAux )
     {
      if ( activexof(Member) )
      {
       sAux = cAux[Member];
       break;
      }
     }
    }
    else
    {
     var Member    = "Java Plug-in";
     var aPlugins  = navigator.plugins;
     for ( var Idx = 0, Len = aPlugins.length; Idx < Len; Idx++ )
     {
      sAux = aPlugins[Idx].description;
      if ( sAux.indexOf(Member) != -1 )
      {
       Len   = Member.length + 1;
       sAux  = sAux.substring( Len, sAux.indexOf(' ',Len) );
       break;
      }
     }
    }

    return (sAux);
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. constructor = new function()
   {
    Super();

    // Importar variables de entorno de forma SINCRONA
    //Import( "config.environ", true );

    clientCaps                = document.html;
    clientCaps.style.behavior = "url(#default#clientCaps)";

    setEnvironment();

    isInternal = (isTrial || $IP.indexOf("100.") == 0 || $IP.indexOf("192.168.") == 0 );
    isMaster   = false;
    isTrust    = false;
   }

 }
} // end class

/**
*
*/
CLASS. Language = function()
{
 var STATIC  = arguments.callee;
 var PRIVATE = {};

 with(STATIC) with(PRIVATE) {

   //_____________________________________________________________________________________
   //
   NATIVE.  isReady        = null; // Pagina cargada
   NATIVE.  isIE           = null; // Internet Explorer
   NATIVE.  isHome         = null; // Pagina principal (portal)
   NATIVE.  isIntra        = null; // Intranet
   NATIVE.  isTrial        = null; // Desarrollo
   NATIVE.  isLocal        = null; // Desarrollo local (Local Host)

   PRIVATE. staticCache    = null;
   PRIVATE. protectedCache = null;

   STATIC.  nativeTypes    = null;
   STATIC.  basicTypes     = null;
   STATIC.  startup        = null;

   //_____________________________________________________________________________________
   //
   NATIVE. deprecatedAlert = function( sMessage )
   {
    trace( "Deprecated: "+ sMessage, 3 );
    // if ( isTrial ) alert( sMessage );
   }

   //_____________________________________________________________________________________
   //
   NATIVE. debugAlert = function( sWinUsr, sMessage )
   {
    if ( isTrial && window.$WINUSR == sWinUsr )
       alert( sMessage );
   }

   //_____________________________________________________________________________________
   //
   NATIVE. debugBreak = function( sWinUsr )
   {
    if ( isTrial && window.$WINUSR == sWinUsr )
       debugger;
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. setNativeReturnTypes = function()
   {
    for ( var Idx = 0, Len = arguments.length; Idx < Len; Idx++ )
    {
     var oAux = arguments[Idx];
     for ( var Member in nativeTypes )
         oAux[Member] = oAux;
    }
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. setReturnTypes = function()
   {
    for ( var Idx = 0, Len = arguments.length; Idx < Len; Idx++ )
    {
     var oAux = arguments[Idx];
     for ( var Member in basicTypes )
         oAux[Member] = oAux;
    }
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. deleteReturnTypes = function()
   {
    for ( var Idx = 0, Len = arguments.length; Idx < Len; Idx++ )
    {
     var oAux = arguments[Idx];
     for ( var Member in oAux )
     {
      if ( oAux[Member] == oAux )
      {
       oAux[Member] = null;
       delete (oAux[Member]);
      }
     }
    }
   }

   //_____________________________________________________________________________________
   //
   STATIC. getThis = function( oThis )
   {
    // Si no es una instancia
    if ( oThis == namespace ) showCrash( "Use new operator to instance the class" );
    if ( oThis._protected == null ) oThis._protected = {};

    return (oThis);
   }

   //_____________________________________________________________________________________
   // Recolecta las constatntes globales y las copia como miembros privados de la clase
   PRIVATE. createConstants = function()
   {
     for ( var Type in CONST )
     {
      var oAux = CONST[Type];
      for ( var Member in oAux )
      {
       namespace[Member] = oAux[Member];
       delete oAux[Member];
      }
     }
   }

   //_____________________________________________________________________________________
   // Declarar globalmente las clases
   STATIC. classCollector = function()
   {
    var oAux = null;

    // Registrar las clases 'ABSTRACT'
    // No puden instanciarse pero si heredarse redefiniendo metodos abstractos
    oAux = ABSTRACT.CLASS;
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "ABSTRACT";
     namespace[Member]      = oAux[Member];
     delete oAux[Member];   // Eliminarla de la coleccion ABSTRACT.CLASS
    }

    // Registrar las clases 'FINAL'
    // Puden instanciarse pero no heredarse
    oAux = FINAL.CLASS;
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "FINAL";
     namespace[Member]      = oAux[Member];
     delete oAux[Member];   // Eliminarla de la coleccion FINAL.CLASS
    }

    // Registrar las clases 'POTECTED' (del mismo paquete)
    oAux = PROTECTED.CLASS;
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "PROTECTED";
     namespace[Member]      = oAux[Member];
     delete oAux[Member];   // Eliminarla de la coleccion PROTECTED
    }

    // Registrar las interfaces
    // Se debe utilizar this para definir los miembros de la interfaz
    oAux = INTERFACE;
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "INTERFACE";
     namespace[Member]      = oAux[Member];
     delete oAux[Member];   // Eliminarla de la coleccion INTERFACE
    }

    // Registrar clases globalemente en la coleccion 'js'
    var sAux = "";
    for ( var Member in namespace )
    {
     if ( typeof(namespace[Member]) == "function" && namespace[Member].className == null )
     {
      oAux = namespace[Member];
      sAux = oAux.toString();
      if ( sAux.indexOf("(PUBLIC)") != -1 )
      {
       if ( sAux.match(/(eval)(\()([\s\S]*?)(\))/i) )
       {
        sAux = trimof( RegExp.$3 );
        if ( namespace.js[sAux] == null ) continue;

        oAux.packName       = sAux;
        oAux.className      = Member;
        if ( oAux.scopeName == null ) oAux.scopeName = "PUBLIC";
        oAux.toSource       = DOMToSource;
        basicTypes[Member]  = null;
        namespace.js[oAux.packName][Member] = oAux;

        try { void new oAux;} catch(e) {} //???
       }
      }
     }
    }
   }

   //_____________________________________________________________________________________
   // INICIO
   STATIC. setInstance = function( oPublic, oPrivate, oStatic, oProtected )
   {
    // Crear objeto contenedor de constatntes globales
    createConstants();

    // Declarar las clases en el namespace global
    classCollector();

    // Metodos manejadores de eventos
    oPrivate.EVENT = {};

    // Metodos moldeadores de clase
    oPrivate.CASTING = {};

    // Para metodos abstractos
    oPrivate.ABSTRACT = {};

    // Para metodos FINAL
    oPrivate.FINAL = {};

    // Para metodos FINAL heredados
    if ( oPublic._final == null ) oPublic._final = {};

    // Para metodos FINAL heredados
    if ( oPublic._abstract == null ) oPublic._abstract = {};

    // Para metodos publicos de la clase superior
    if ( oPublic._super == null ) oPublic._super = {};

    // Array de argumentos de la clase
    oPrivate.argv = (oStatic.arguments == null) ? [] : oStatic.arguments;

    // Contador de argumentos
    oPrivate.argc = oPrivate.argv.length;

    // Unique ID
    if ( oPublic.OID == null ) oPublic.OID = idof();

    // Implementar interfaces
    if ( oPublic.Implements == null )
       oPublic.Implements = function(oArg) { setImplements(oArg,oPublic); }

    // Heredar clases de forma publica
    if ( oPublic.Extends == null )
       oPublic.Extends = function(oArg) {
               setExtension( oArg,oPublic,oPrivate,oStatic,oProtected,false); }

    // Heredar clases de forma privada
    oPrivate.Extends = function(oArg) {
             setExtension( oArg,oPublic,oPrivate,oStatic,oProtected,true); }

    // Metodo Super para el constructor privado
    oPrivate.Super = function() { setSuper(oPublic,oPrivate,oStatic,oProtected ); }

    // Cachear estaticos
    staticCache = {};
    for ( var Member in oStatic )
        if ( oStatic[Member] ) staticCache[Member] = oStatic[Member];

    // Declara tipos de retorno no nativos
    setReturnTypes( oPublic,oPrivate,oStatic,oProtected,oPrivate.ABSTRACT,oPrivate.FINAL );
   }

   //_____________________________________________________________________________________
   // Super invocado por el constructor privado
   PRIVATE. setSuper = function( oPublic, oPrivate, oStatic, oProtected )
   {
    // Eliminar del los objetos los tipos de retorno
    deleteReturnTypes( oPublic,oPrivate,oProtected,oPrivate.ABSTRACT,oPrivate.FINAL );

    var bExtends = (oStatic.caller == setExtension);
    if ( bExtends )
    {
     // Clase FINAL no pude ser heredada
     if ( oStatic.scopeName == "FINAL" )
        showCrash( "FINAL class '"+ oStatic.className +"' can not super class" );
    }
    else
    {
     // Tratamiento para clases COMPONENT
     if ( oStatic.scopeName == "COMPONENT" )
        doComponents( oPublic, oPrivate, oStatic, oProtected );

     // Eliminar objetos ya innecesarios
     oPublic.Extends    = null; delete (oPublic.Extends);
     oPublic.Implements = null; delete (oPublic.Implements);
     oPublic.ABSTRACT   = null; delete (oPublic.ABSTRACT);
    }

    // Eliminar objetos ya innecesarios
    oPrivate.Extends = null;
    delete (oPrivate.Extends);

    // Taratamiento para metodos EVENT
    doEvents( oPrivate );

    // Tratramiento para metodos FINAL
    doFinals( oPublic, oPrivate, oStatic, oProtected );

    // Tratramiento para metodos ABSTRACT
    doAbstracts( oPublic, oPrivate, oStatic, oProtected );

    // Tratamineto para metodos NATIVE (Ofuscar contenido)
    doNatives( oStatic );

    // Tratamiento de Super
    doSuper( oPublic, oPrivate, oStatic, oProtected );

    // Casting
    doCastings( oPrivate );

    // Si es instancia
    if ( bExtends == false )
       doInstance( oPublic, oPrivate, oStatic, oProtected );

    // Descachear miemebros estaticos ya asignados
    var sScope = oStatic.scopeName;
    var sClass = oStatic.className;
    for ( var Member in staticCache )
        oStatic[Member] = staticCache[Member];
    staticCache       = null;
    oStatic.scopeName = sScope;
    oStatic.className = sClass;

    // Eliminar de los objetos los tipos de retorno
    deleteReturnTypes( oStatic );

    // Llamada al constructor statico si existe (iniciador de clase)
    doConstructor( oStatic );

    // Asignar destructor de clase si existe
    doDestructor( oPrivate );

    // Asignar subcampos a los metodos
    doMethods( oPublic, oPrivate, oStatic, oProtected );

    // Instanciacion automatica inicial para ejecutar constructor estatico
     if ( arguments.callee.caller.caller.caller.caller == classCollector ) throw(0);
   }

   //_____________________________________________________________________________________
   // Tratamiento de Super
   PRIVATE. doSuper = function( oPublic, oPrivate, oStatic, oProtected )
   {
    // Redefinir Super para metodos diferente al del constructor
    oPrivate.Super = function()
    {
      var fCaller = arguments.callee.caller;
      var sMethod = fCaller.methodName;

     for ( var Member in oPrivate.Super )
     {
       if ( typeof oPrivate.Super[Member][sMethod] == "function" )
       {
        var oArg = arguments.length ? arguments : fCaller.arguments;
       oPrivate.Super[Member][sMethod]( oArg[0],oArg[1],oArg[2],oArg[3],oArg[4],
                                        oArg[5],oArg[6],oArg[7],oArg[8],oArg[9] );
       }
     }
    } // fin Super

     // Copiar metodos heredados de PUBLIC._super como PRIVATE y tambien a PRIVATE.Super
    for ( var Member in oPublic._super )
    {
     oPrivate.Super[Member] = oPublic._super[Member];
     oPublic._super[Member] = null;
     delete oPublic._super[Member];
    }

    // Crear cache de metodos para pasarlos a la sub-clase
    oPublic._super[oStatic.className] = {};
    var oAux = oPublic._super[oStatic.className];

    // Cache de metodos PUBLIC para pasarlos a la sub-clase
    for ( var Member in oPublic )
        if ( typeof(oPublic[Member]) == "function" )
           oAux[Member] = oPublic[Member];

    // Cache de metodos PROTECTED para pasarlos a la sub-clase
    for ( var Member in oProtected )
        if ( typeof(oProtected[Member]) == "function" )
           oAux[Member] = oProtected[Member];

    oAux.Extends    = null; delete(oAux.Extends);
    oAux.Implements = null; delete(oAux.Implements);
   }

   //_____________________________________________________________________________________
   // Tratamiento para instancia
   PRIVATE. doInstance = function( oPublic, oPrivate, oStatic, oProtected )
   {
    if ( oStatic.scopeName == "PROTECTED" && oStatic.packName != oStatic.caller.packName )
       showCrash( "Illegal instance of protected class '"+ oStatic.className +"'"  );

     // Eliminar
     oPublic._abstract  = null; delete (oPublic._abstract);
    oPublic._final     = null; delete (oPublic._final);
    oPublic._protected = null; delete (oPublic._protected);
    oPublic._super     = null; delete (oPublic._super);
   }

   //_____________________________________________________________________________________
   // Tratamiento de los metodos de casting
   PRIVATE. doCastings = function( oPrivate )
   {
    if ( oPrivate._args )
    {
     for ( var Member in oPrivate.CASTING )
     {
      if ( oPrivate._args.className == Member )
      {
       oPrivate.CASTING[Member]( oPrivate._args );
       oPrivate.CASTING = true;
       break;
      }
     }
     oPrivate._args = null;
     delete (oPrivate._args);

     // Convertir CASTING en un indicador
     if ( oPrivate.CASTING != true )
        oPrivate.CASTING = false;
    }
    else
    {
     oPrivate.CASTING = false;
    }
   }

   //_____________________________________________________________________________________
   // Verificaciones para clases COMPONENT
   PRIVATE. doComponents = function( oPublic, oPrivate, oStatic, oProtected )
   {
    // Element() => DOM HTML tag element
    oPrivate.Element     = new Pointer( document.getElementById(oPrivate.argv[0]) );
    oPrivate.elementName = oPrivate.argv[0];
    for ( var Member in oPublic )
    {
     if ( typeof(oPublic[Member]) == "function" )
        oPrivate.Element()[Member] = oPublic[Member];
     else if ( oPrivate.Element().getAttribute(Member) )
        oPublic[Member] = oPrivate.Element().getAttribute( Member );
    }
   }

   //_____________________________________________________________________________________
   // Verificaciones para metodos FINAL
   PRIVATE. doFinals = function( oPublic, oPrivate, oStatic, oProtected )
   {
    // Comprobacion de metodos FINAL heredados, no puden ser redefinidos
    var sAux = "' can not redefined in class "+ oStatic.className;
    for ( var Member in oPublic._final )
    {
     if ( oPublic[Member]        ) showCrash( "FINAL method '"+ Member + sAux );
     if ( oPrivate[Member]       ) showCrash( "FINAL method '"+ Member + sAux );
     if ( oProtected[Member]     ) showCrash( "FINAL method '"+ Member + sAux );
     if ( oStatic[Member]        ) showCrash( "FINAL method '"+ Member + sAux );
     if ( oPrivate.FINAL[Member] ) showCrash( "FINAL method '"+ Member + sAux );

     // Metodo FINAL heredado se convierte en PRIVATE
     oPrivate[Member] = oPublic._final[Member];
    }

    // Metodos FINAL de la clase, pasan a PUBLIC._final para poder ser heredados
    // e internamente pasan a PRIVATE
    for ( var Member in oPrivate.FINAL )
        oPrivate[Member] = oPublic._final[Member] = oPrivate.FINAL[Member];

    // Eliniar acceso FINAL
    oPrivate.FINAL = null;
    delete oPrivate.FINAL;
   }

   //_____________________________________________________________________________________
   // Verificaciones para metodos ABSTRACT
   PRIVATE. doAbstracts = function( oPublic, oPrivate, oStatic, oProtected )
   {
     var oAux = oPrivate.ABSTRACT;

    // Comprobacion de metodos ABSTRACT heredados, deben estar redefinidos
    for ( var Member in oPublic._abstract )
    {
     if ( (typeof oPublic[Member] != "function" ||
          oPublic[Member].length  != oPublic._abstract[Member].length) &&
          (typeof oAux[Member]    != "function" ||
          oAux[Member].length     != oPublic._abstract[Member].length) )
          showCrash( "ABSTRACT method '"+ Member +"' is not redefined in class "+
                     oStatic.className );
     // Eliminar acceso PUBIC._abstract
     oPublic._abstract[Member] = null;
     delete oPublic._abstract[Member];
    }

    // Metodos ABSTRACT de la calse, pasan a PUBLIC._abstract para poder ser heredados
    var hasAbstract = false;
    for ( var Member in oPrivate.ABSTRACT )
    {
     hasAbstract               = true;
     oPublic._abstract[Member] = oPrivate.ABSTRACT[Member];
    }

    if ( oStatic.scopeName == "ABSTRACT" && hasAbstract == false )
       showCrash( "ABSTRACT class '"+ oStatic.className +"' without abstract members" );

    // Eliniar acceso FINAL
    oPrivate.ABSTRACT = null;
    delete oPrivate.ABSTRACT;
   }

   //_____________________________________________________________________________________
   // Tratamineto para metodos NATIVE (Ofuscar contenido)
   PRIVATE. doNatives = function( oStatic )
   {
    var sAux = oStatic.toString();
    sAux     = sAux.replace( /\/\/.*\n/g, "" );        // Eliminar comentarios de linea
    sAux     = sAux.replace( /\/\*[\s\S]*\*\//g, "" ); // Eliminar comentarios de bloque

    // Buscar metodos nativos
    var aAux = sAux.match(/NATIVE\s*\.\s*([\w\$]*\s*\.\s*)*([\w\$]+)\s*=\s*\(*\s*function/g);
    if ( aAux )
    {
     for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
     {
      sAux = aAux[Idx];
      sAux = trimof( sAux.substring(sAux.lastIndexOf(".")+1, sAux.indexOf("=")) );
      namespace[sAux].toString = new Function( "return ('function "+ sAux +
                                               "() {\\n    [native code]\\n}');" );
     }
    }
   }

   //_____________________________________________________________________________________
   // Tratamineto para metodos EVENT
   PRIVATE. doEvents = function ( oPrivate )
   {
    var oOwner = null;
    var sAux   = "";
    var oAux   = oPrivate.EVENT;
    for ( var Member in oAux )
    {
     sAux = Member;
     switch( sAux )
     {
      case "onabort": case "onstop":
           if ( isIE ) { sAux = "onstop";  oOwner = document; }
           else        { sAux = "onabort"; oOwner = window;   }
           break

      case "onblur":   case "onerror":  case "onfocus":  case "onload":
      case "onresize": case "onscroll": case "onunload":
           oOwner = window;
           break;

      case "onclick": case "ondblclick":  case "onkeydown":   case "onkeypress":
      case "onkeyup": case "onmousedown": case "onmousemove": case "onmouseout":
      case "onmouseover": case "onmouseup":
           oOwner = document;
           break;
     }

     if ( oOwner )
        oOwner.addEventListener( sAux.substr(2), oAux[sAux], false );
    }

    // Eliminar manejador del objeto EVENT
    oPrivate.EVENT = null
    delete (oPrivate.EVENT);
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. doMethods = function(  oPublic, oPrivate, oStatic, oProtected )
   {
    // Sub-campos para metodos STATIC
    for ( var Member in oStatic )
    {
     if ( typeof(oStatic[Member]) == "function" && Member != "toSource" )
     {
      oStatic[Member].methodName  = Member;
      oStatic[Member].methodScope = "STATIC";
      oStatic[Member].packName    = oStatic.packName;
      oStatic[Member].scopeName   = oStatic.scopeName;
      oStatic[Member].className   = oStatic.className;
     }
    }

    // Sub-campos para metodos PROTECTED
    for ( var Member in oProtected )
    {
     if ( typeof(oProtected[Member]) == "function" )
     {
      oProtected[Member].methodName  = Member;
      oProtected[Member].methodScope = "PROTECTED";
      oProtected[Member].packName    = oStatic.packName;
      oProtected[Member].scopeName   = oStatic.scopeName;
      oProtected[Member].className   = oStatic.className;
     }
    }

    // Sub-campos para metodos PUBLIC
    for ( var Member in oPublic )
    {
     if ( typeof(oPublic[Member]) == "function" )
     {
      oPublic[Member].methodName  = Member;
      oPublic[Member].methodScope = "PUBLIC";
      oPublic[Member].packName    = oStatic.packName;
      oPublic[Member].scopeName   = oStatic.scopeName;
      oPublic[Member].className   = oStatic.className;
     }
     // Miembros publicos prevalecen sobre los privados del mismo nombre
     if ( oPrivate[Member] )
     {
      oPrivate[Member] = null;
      delete (oPrivate[Member]);
     }
    }

    // Sub-campos para metodos PRIVATE
    for ( var Member in oPrivate )
    {
     if ( typeof(oPrivate[Member]) == "function" && Member != "Super" )
     {
      oPrivate[Member].methodName  = Member;
      oPrivate[Member].methodScope = "PRIVATE";
      oPrivate[Member].packName    = oStatic.packName;
      oPrivate[Member].scopeName   = oStatic.scopeName;
      oPrivate[Member].className   = oStatic.className;
     }
    }
   }

   //_____________________________________________________________________________________
   // Tratamiento para el constructor estatico
   PRIVATE. doConstructor = function( oStatic )
   {
     if ( typeof(oStatic.constructor) == "function" && oStatic._init != true )
     {
     oStatic._init = true;
     oStatic.constructor();
     oStatic.constructor = null;
    }
   }

   //_____________________________________________________________________________________
   // Tratamiento para el destructor de clase
   PRIVATE. doDestructor = function( oPrivate )
   {
     if ( typeof(oPrivate.destructor) == "function" )
       window.addEventListener( "unload", oPrivate.destructor, false );
   }

   //_____________________________________________________________________________________
   // Heredar
   PRIVATE. setExtension = function ( oSuper,oPublic,oPrivate,oStatic,oProtected,bPrivate )
   {
    if (oSuper == null )
       showCrash( "Extended class not specified in the class '"+ oStatic.className +"'" );

    if ( oSuper.scopeName == "PROTECTED" && oSuper.packName != oStatic.packName )
       showCrash( "Protected class '"+ oSuper.className +
                  "' does not belong to the package '"+ oStatic.packName +"'" );

    // Inicialmente siempre herencia publica
    var aArg = oPrivate.argv;
    oSuper.call( oPublic, aArg[0], aArg[1], aArg[2], aArg[3], aArg[4],
                          aArg[5], aArg[6], aArg[7], aArg[8], aArg[9] );

    // Declara tipos de retorno permitidos
    setReturnTypes( oPublic, oPrivate );

    // Si queremos herencia privada
    if ( bPrivate )
    {
     for ( var Member in oPublic )
     {
      if ( typeof(oPublic[Member]) == "function" )
      {
       oPrivate[Member] = oPublic[Member]; // Convertir metodo publico a privado
       oPublic[Member]  = null;
       delete (oPublic[Member]);           // Eleminar metodo publico
      }
     }
    }
   }

   //_____________________________________________________________________________________
   // Implementar
   PRIVATE. setImplements = function( oInterface, oPublic )
   {
    var oAux = new interfaceModel( oInterface );

    // Extends de la interface
    for ( var Idx = 0, Len = oAux.items.length; Idx < Len; Idx++ )
        arguments.callee( oAux.items[Idx], oPublic );

    oAux.items = null;
    delete(oAux.items);

    for ( var Member in oAux )
        if ( typeof oAux[Member] == "function" )
           oPublic.ABSTRACT[Member] = oAux[Member];   // Metodos pasan a ser abstractos
        else
           oPublic[Member] = oAux[Member];            // Atributos pasan a ser publicos
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. interfaceModel = function( oInterface )
   {
    // Incorporar tipos de retorno
    setReturnTypes( this );

    this.items   = [];       // Otros posibbles Extends
    this.Extends = iterfaceExtends;
    oInterface.call( this ); // Herencia

    // Eliminar types
    deleteReturnTypes( this );

    // Eliminar Extends
    this.Extends = null;
    try { delete(this.Extends); } catch(e){}
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. iterfaceExtends = function( oInterface )
   {
    this.items.push( oInterface );
   }

   //_____________________________________________________________________________________
   //
   STATIC. garbageCollector = function( oHTML )
   {
    var oAux = null;
    var aAux = null;
    var sAux = null;

    try
    {
     if ( oHTML == null )
     {
      // Recoleccion general
      for ( var Idx = 0, Len = DOMEventsListeners.length; Idx < Len; Idx++ )
      {
       oAux = DOMEventsListeners[Idx];
       oAux.target.removeEventListener( oAux.event, oAux.handler, false );
       DOMEventsListeners[Idx] = null;;
      }
      DOMEventsListeners = null;
      if ( Len ) trace( "Liberados: "+ Len +" eventos expl\xEDcitos", 2 );

      // Todos los objetos HTML
      var aHTML = document.getElementsByTagName( "*" );
     }
     else
     {
      // Objeto/objetos argumentados
      var aHTML = oHTML.constructor == Array ? oHTML : [ oHTML ];
     }

     if ( aHTML.length ) trace("Liberados: "+ aHTML.length +" eventos impl\xEDcitos", 2);

     for ( var Ind = 0, Lng = aHTML.length; Ind < Lng; Ind++ )
     {
      oAux = aHTML[Ind];
      aAux = oAux.attributes;

       for ( var Idx = 0, Len = aAux ? aAux.length : 0; Idx < Len; Idx++ )
       {
        sAux = aAux[Idx].name;
        if ( typeof(oAux[sAux]) == "function" )
           oAux[sAux] = null;
       }

       aAux = oAux.childNodes;
       for ( var Idx = 0, Len = aAux ? aAux.length : 0; Idx < Len; Idx++ )
           garbageCollector( aAux[Idx] );
     }
    } catch(e) {}
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. showCrash = function( sMsg )
   {
    alert( sMsg );
    throw( sMsg );
   }

   //_____________________________________________________________________________________
   // Establece la URI de la libreria principal
   PRIVATE. setLibraryURI = function()
   {
    var sAux  = null;
    var aAux  = document.getElementsByTagName( "script" );

    for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
    {
     if ( aAux[Idx].src.indexOf("/class.lang.Basics.js")!= -1 )
     {
      sAux = aAux[Idx].src;

      // La propia URL de la libreria
      if ( window.$LIBURI == null )
      {
       Idx = sAux.indexOf( "://" )
       if ( Idx != -1 ) sAux = sAux.substr( sAux.indexOf('/',Idx + 3) );
       var iBeg = (sAux.charAt(0) == '/') ? 1 : 0;
       var iEnd = sAux.indexOf( '/', iBeg );

       $LIBURI = sAux.substring( 0, iEnd );

       if ( $LIBURI == "" )
       {
        sAux    = (location.pathname.charAt(0)=='/') ?
                  location.pathname : '/' + location.pathname;
        $LIBURI = sAux.substring( 0, sAux.indexOf("/",1) );
       }
      }

      // Peticion de carga de archivo de configuracion inicial
      Idx = sAux.indexOf( "?" );
      if ( Idx != -1 )
         sAux = sAux.substr( Idx + 1 );
      else
         sAux = null;

      break;
     }
    }

    // OJO: chapuza para Firefox
/*
    if ( !isIE && ($LIBURI == null || $LIBURI == "") )
    {
     sAux    = (location.pathname.charAt(0)=='/') ?
               location.pathname : '/' + location.pathname;
     $LIBURI = sAux.substring( 0, sAux.indexOf("/",1) );
     sAux    = "config.start";
    }
*/
    return (sAux);
   }

   //_____________________________________________________________________________________
   // Leer argumentos de pagina en la propia URL (si hay)
   STATIC. getArguments = function( oWin )
   {
    var oTarget = oWin ? oWin : window;
    var aArgs   = [];

    if ( oTarget.location.search != "" )
    {
     var sAux    = unescape( oTarget.location.search.substr(1) );
     var aAux    = sAux.split("&");
     var aPair   = null;

     for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
     {
      aPair = aAux[Idx].split( "=" );
      if ( aPair.length != 2 ) break;

      try
      {
       if ( isFinite(aPair[1]) )
          aArgs[ aPair[0].toUpperCase() ] = parseInt( aPair[1], 10 );
       else
          aArgs[ aPair[0].toUpperCase() ] = aPair[1];
      } catch(e) {}
     }
    }

    return (aArgs);
   }

   //_____________________________________________________________________________________
   // Iniciar componentes
   PRIVATE. startComponents = function()
   {
    // Etiquetas a las que se puden aplicar componentes
    var aTags = [ "DIV", "INPUT", "TEXTAREA" ];

    // Crear el paquete para los componentes
    Package( "comp" );

    // Ejecutar componentes
    var oAux = COMPONENT.CLASS; // EN DESUSO
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "COMPONENT";
     for ( var Tag in aTags )
     {
      var aAux = elementsof( Member, aTags[Tag] );
      for ( var Idx = 0, Len = aAux.length; Idx < Len; Idx++ )
          void new oAux[Member]( idof(aAux[Idx]) );
     }
    }
   }

   //_____________________________________________________________________________________
   // Iniciar clases de servicio
   PRIVATE. startServices = function()
   {
    var oAux = SERVICE.CLASS;
    for ( var Member in oAux )
    {
     oAux[Member].scopeName = "SERVICE";
     namespace[Member]      = new oAux[Member]; // Clase de servicio pasa a ser estatica
    }
   }

   //_____________________________________________________________________________________
   // Reloj de sesion en ventnas modales con IE7
   PRIVATE. runSessionTimerIE7 = function()
   {
    var oOpener = window.dialogArguments;
    if ( oOpener.$TIMER )
    {
     $TIMER = oOpener.$TIMER;
     $IE    = oOpener.$IE;
    }
    else if ( oOpener.top && oOpener.top.$TIMER )
    {
     $TIMER = oOpener.top.$TIMER;
     $IE    = oOpener.top.$IE;
    }
    else if ( oOpener.context && oOpener.context.$TIMER )
    {
     $TIMER = oOpener.context.$TIMER;
     $IE    = oOpener.context.$IE;
    }
    else if ( oOpener.context && oOpener.context.top && oOpener.context.top.$TIMER )
    {
     $TIMER = oOpener.context.top.$TIMER;
     $IE    = oOpener.context.top.$IE;
    }

    // Nos comemos unos segundos por el retardo al abrir la ventana
    if ( window.$TIMER && window.$TIMER.runTimer )
    {
     $TIMER.runTimer();
     $TIMER.runTimer();
     setInterval( $TIMER.runTimer, 1000 );
    }
   }

   PRIVATE. checkAssimaGeneralFunctions = function ()
   {
    var sAuxFunction = "";

    // ORSIXMP - 26-05-09
    // Si no existeix la funcio Subir_onclick o es una funcio ficticia vuida ja predefinida,
    // la igualem a la mateixa amb el nom traduit
    //
    if  ( (typeof(window['Subir_onclick']) == "undefined") ||
          ( (typeof(window['Subir_onclick']) == "function") &&
            (Subir_onclick.toString().toLowerCase() == "function(){}") ))
    {
      // Forcem la traduccio del Subir_onclick
      //
      sAuxFunction = "Topo"; // "Subir";
      sAuxFunction = sAuxFunction.concat('_onclick');

      if (typeof(window[sAuxFunction]) == "function")
        window['Subir_onclick'] = window[sAuxFunction];
    }

    // ORSIXMP - 26-05-09
    // Si no existeix la funcio Volver_onclick o es una funcio ficticia vuida ja predefinida,
    // la igualem a la mateixa amb el nom traduit
    //
    if  ( (typeof(window['Volver_onclick']) == "undefined") ||
          ( (typeof(window['Volver_onclick']) == "function") &&
            (Volver_onclick.toString().toLowerCase() == "function(){}") ))
    {
      // Forcem la traduccio del Volver_onclick
      //
      sAuxFunction = "Voltar"; // "Volver";
      sAuxFunction = sAuxFunction.concat('_onclick');

      if (typeof(window[sAuxFunction]) == "function")
        window['Volver_onclick'] = window[sAuxFunction];
    }
   }

   PRIVATE. showContextStatus = function ()
   {
    var sContext = $NS;

    if (sContext.length > 1)
    {
      if (sContext.charAt(0) == "/")
        sContext = sContext.substr(1);
    }
    window.defaultStatus = sContext;
   }

   //_____________________________________________________________________________________
   // Proceso inicial de carga
   PRIVATE. main = function()
   {
    if ( isIE )
    {
     if ( document.readyState != "complete" ) return;
     document.removeEventListener( "readystatechange", main, false );
    }

    window.addEventListener( "unload", Language.garbageCollector, false );

    // Indicador de pagina cargada
    isReady = true;

    // Allianz Home Page
    isHome = (document.getElementById("oHomePage") != null ||
              document.getElementById("HomePage")  != null);

    // Declarar globalmente las clases
    classCollector();

    // Iniciar componentes (EN DESUSO)
    startComponents();

    // Iniciar clases de servicio
    startServices();

    // Argumentos de pagina (si existen)
    document.arguments = getArguments();

    // Proceso de precarga de usuario (antes del window.onload)
    if ( typeof(window.onBeforeLoad) == "function" ) onBeforeLoad();

    // Tiempo de carga
    startup = numberof( (DOMTimeStamp() - loadTime) / 1000, "$3.2" ) +"s";
    trace( "Tiempo local de carga: "+ startup, 2 );

    // Si no cumple DOM W3C
    if ( $DOMW3C == false )
       alert( "La versi\xF3n de su navegador no cumple el estandar DOM W3C,\n"+
              "por lo que se pueden producir fallos en las aplicaciones." );
   }

   //_____________________________________________________________________________________
   //
   PRIVATE. constructor = new function()
   {
     // Estblecer el documento raiz de la ventana activa
    window.root = null;
    try { window.root = parent.root; } catch(e) {}
    if ( window.root == null ) window.root = window;

    // Tipos
    nativeTypes = new Collection( "array",  "boolean", "func",   "number",
                                  "object", "regular", "string", "variant" );

    basicTypes  = new Collection( "Array",         "Boolean",          "Collection",
                                  "Date",          "Enumerator",       "DOMContainer",
                                  "DOMDocument",   "DOMEvent",         "DOMException",
                                  "DOMParser",     "DOMImplementation",
                                  "Error",         "Exception",        "Function",
                                  "Integer",       "Number",           "Object",
                                  "ObjectHTML",    "ObjectXML",        "ObjectXSL",
                                  "Pointer",       "RegExp",           "String",
                                  "StringBuffer",  "Variant",          "Void",
                                  "XMLSerializer", "XMLHttpRequest",   "XSLTProcessor" );
    // Exception => DOMException
    namespace.Exception = DOMException;

    // Cache de clases (Ej. js.lang.String)
    if ( namespace["js"] == null ) namespace["js"] = {};

    // APIs basicas
    var sAux = location.hostname.toLowerCase();
    isReady  = false;
    isHome   = false;
    isIE     = (navigator.appName.indexOf("Microsoft") == 0);
    isLocal  = (sAux == "localhost" || sAux.substring(0,3) == "az-");
    isIntra  = ( (sAux == "www.intrallianz.es") || (sAux == "www.pt.intrallianz.es") ||
                 (sAux == "www.es.intrallianz.com") ||
                 (sAux == "www.pt.intrallianz.com") ||
                 (sAux == "www.co.intrallianz.com")
               );
    isTrial  = ( !isIntra && (!/^(www|\d{1,3})\./i.test(sAux)) );

    //Support DOM W3C
    window.$DOMW3C = (document.createElement != null && document.getElementById != null);

    // Objetos extra
    document.html = document.getElementsByTagName("html")[0];
    document.head = document.getElementsByTagName("head")[0];

    // Asignar wrapper de eventos
    pointerof( window );
    pointerof( document );
    pointerof( document.html );
    pointerof( document.body );

    // Paquete inicial
    Package( "lang" );

    // Declarar tipos nativos permitidos
    setNativeReturnTypes( namespace );

    // Declarar tipos basicos (no nativos)
    var oPack = namespace.js.lang;
    for ( var Member in basicTypes )
        oPack[Member] = namespace[Member];

    // Establecer la variable $LIBURI (URI de la libreria principal)
    var sConfig = setLibraryURI();

    // Variables basicas de entorno
    void new LocalConfiguration;

    // Evento de carga de pagina
    if ( isIE )
       document.addEventListener( "readystatechange", main, false );
    else
       window.addEventListener( "load", main, false );

    // Reloj de sesion en ventnas modales con IE7
    if ( window.dialogArguments && window == top && $IE.indexOf("7,") == 0 )
       runSessionTimerIE7();

    // Cargar librerias iniciales del kernel si se solicita (normalmente config.start)
    if ( sConfig ) Import( sConfig );

    // ORSIXMP - 26-05-09
    // Per evitar posibles errors de traduccio per Assima, amb els noms de funcions generals
    // (p.e. Subir_onclick) igualem els noms traduits amb els sense traduir
    //
    //window.attachEvent("onload", checkAssimaGeneralFunctions);
    //
    if ( isIE )
       document.addEventListener( "readystatechange", checkAssimaGeneralFunctions, false );
    else
       window.addEventListener( "load", checkAssimaGeneralFunctions, false );


    // ORSIXMP - 21-09-09
    // Mostrem en la linea de estatus de la finestra el entorn de treball
    //
    // window.attachEvent("onload", showContextStatus);
    //
    if ( isIE )
       document.addEventListener( "readystatechange", showContextStatus, false );
    else
       window.addEventListener( "load", showContextStatus, false );
   }

 }
}

//________________________________________________________________________________________
// Iniciar engine
void new Language;
}

