/*****************************************************************************
** LIBRERIA GENERAL DE JS
******************************************************************************
** Tipo           : Libreria desarrollada en JS
** Fichero Fuente : genlib.js
** Fichero Ayuda  :
** Descripcion    : Libreria general de JS
******************************************************************************
** Autor  : Marbore business solutions
** Fecha  : 15/06/2001
** Version: v1.0
*****************************************************************************/

/*****************************************************************************
 * Variables globales
 ****************************************************************************/
//Estoy ejecutandome en un IE
var bExplorer4=(document.all && !document.getElementById)?true:false;
var bExplorer5=(document.all && document.getElementById)?true:false;
var bExplorer=(bExplorer4 || bExplorer5);
//Estoy ejecutandome en un Netscape
var bNetscape4=(document.layers)?true:false;
var bNetscape6=(!document.all && document.getElementById)?true:false;
var bNetscape=(bNetscape4 || bNetscape6);
if (bNetscape4) document.write(""); //Evita la consola JS (en Netscape)
//Estoy ejecutandome en un entorno Windows
var bWindows=(navigator.appName.toUpperCase().indexOf("WINDOWS")>=0 || navigator.appVersion.toUpperCase().indexOf("WINDOWS")>=0)?true:false;
//Manejador (o referencia) de las ventanas flotantes abiertas
var hndFlotante=null;
var hndFlotante2=null;
//Flag de confirmacion antes de someter formularios
var bConfirmar=false;
//El objeto input con el foco actual (para calendarios y selectores de color)
var oInput=null;
var cInputJS="";
//Las imagenes de iconos calendario y lupa
var imgCalendario=new Image();
var imgColorPicker=new Image();
var imgDot=new Image();
var imgLupa=new Image();
imgCalendario.src="img/calendario.gif";
imgColorPicker.src="img/colorpicker.gif";
imgDot.src="img/dot.gif";
imgLupa.src="img/lupa.gif";

/*****************************************************************************
 * Cargar otros javascripts
 ****************************************************************************/
document.write('<script language="javascript" type="text/javascript" src="jslib/rollover.js"></script>');

/*****************************************************************************
 * Cargar la hoja de estilos correspondientes a IE o Netscape
 * No funciona en Netscape
 ****************************************************************************/
if (bExplorer) document.write('<link rel="stylesheet" href="css/ie.css" type="text/css">');
else if (bNetscape6) document.write('<link rel="stylesheet" href="css/ns6.css" type="text/css">');
else if (bNetscape) document.write('<link rel="stylesheet" href="css/ns.css" type="text/css">');

/*****************************************************************************
 * Abrir el calendario
 *****************************************************************************
 * Parametros: oParamInput (objeto) El input que recibira el campo fecha
 ****************************************************************************/
function abrirCalendario(oParamInput) {
  oInput=oParamInput;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante("calendario.jsp",175,210,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante("phplib/calendario.php",175,210,0);
  else abrirFlotante("asplib/calendario.asp",175,210,0);
}

function abrirCalendarioJS(oParamInput,cParamInputJS) {
  oInput=oParamInput;
  cInputJS=cParamInputJS;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante("calendario.jsp",175,210,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante("phplib/calendario.php",175,210,0);
  else abrirFlotante("asplib/calendario.asp",175,210,0);
}

/*****************************************************************************
 * Abrir el selector de color
 *****************************************************************************
 * Parametros: oParamInput (objeto) El input que recibira el campo color
 ****************************************************************************/
function abrirColorPicker(oParamInput) {
  oInput=oParamInput;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante("colorpicker.jsp",310,190,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante("phplib/colorpicker.php",310,190,0);
  else abrirFlotante("asplib/colorpicker.asp",310,190,0);
}

function abrirColorPicker(oParamInput,cParamInputJS) {
  oInput=oParamInput;
  cInputJS=cParamInputJS;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante("colorpicker.jsp",310,190,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante("phplib/colorpicker.php",310,190,0);
  else abrirFlotante("asplib/colorpicker.asp",310,190,0);
}

/*****************************************************************************
 * Abrir el editor HTML
 *****************************************************************************
 * Parametros: oParamInput (objeto) El input que recibira el campo fecha
 ****************************************************************************/
function abrirEditarHTML(oParamInput) {
  oInput=oParamInput;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante("editarhtml.jsp",675,425,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante("phplib/editarhtml.php",675,425,0);
  else abrirFlotante("asplib/editarhtml.asp",675,425,0);
}

function abrirEditarHTML2(oParamInput) {
  oInput=oParamInput;
  if (existeVariable("cGenLibScript") && cGenLibScript=="JSP") abrirFlotante2("editarhtml.jsp",675,425,0);
  else if (existeVariable("cGenLibScript") && cGenLibScript=="PHP") abrirFlotante2("phplib/editarhtml.php",675,425,0);
  else abrirFlotante2("asplib/editarhtml.asp",675,425,0);
}

/*****************************************************************************
 * Activa la imagen apagada para efecto roll-over
 *****************************************************************************
 * Parametros: cParamImagen (string) El identificador de la imagen a apagar
 *           : nParamImagen (int) La posicion de la imagen del array de imagenes
 ****************************************************************************/
function activarOff(cParamImagen,nParamImagen) {
  if (document.images) document.images[cParamImagen].src=imgOff[parseInt(nParamImagen)].src;
}

/*****************************************************************************
 * Activa la imagen encendida para efecto roll-over
 *****************************************************************************
 * Parametros: cParamImagen (string) El identificador de la imagen a enceder
 *           : nParamImagen (int) La posicion de la imagen del array de imagenes
 ****************************************************************************/
function activarOver(cParamImagen,nParamImagen) {
  if (document.images) document.images[cParamImagen].src=imgOver[parseInt(nParamImagen)].src;
}

/*****************************************************************************
 * Abrir una ventana flotante con una URL pasada como parametro
 *****************************************************************************
 * Parametros: cParamURL  (string) La URL que se abrira en la ventana
 *           : nParamAnchura (int) La anchura en pixeles de la ventana
 *           : nParamAltura  (int) La altura en pixeles de la ventana
 *           : nParamTimeout (int) El numero de segundos que estara abierta
 ****************************************************************************/
function abrirFlotante(cParamURL,nParamAnchura,nParamAltura,nParamTimeout) {
  var nX;
  var nY;
  cerrarFlotante();
  nX=Math.round((screen.width-nParamAnchura)/2,0);
  nY=Math.round((screen.height-nParamAltura)/2,0);
  hndFlotante=window.open(cParamURL,"hndFlotante","width="+nParamAnchura+",height="+nParamAltura+",top="+nY+",left="+nX+",directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,status=no");
  //if (bExplorer || bNetscape6) hndFlotante.moveTo(nX,nY);
  if (nParamTimeout>0) window.setTimeout("cerrarFlotante()",nParamTimeout*1000);
}

function abrirFlotante2(cParamURL,nParamAnchura,nParamAltura,nParamTimeout) {
  var nX;
  var nY;
  cerrarFlotante2();
  nX=Math.round((screen.width-nParamAnchura)/2,0);
  nY=Math.round((screen.height-nParamAltura)/2,0);
  hndFlotante2=window.open(cParamURL,"hndFlotante2","width="+nParamAnchura+",height="+nParamAltura+",top="+nY+",left="+nX+",directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,status=no");
  //if (bExplorer || bNetscape6) hndFlotante2.moveTo(nX,nY);
  if (nParamTimeout>0) window.setTimeout("cerrarFlotante2()",nParamTimeout*1000);
}

/*****************************************************************************
 * Abrir una ventana flotante con una URL pasada como parametro (375x275)
 * sin timeout
 *****************************************************************************
 * Parametros: cParamURL  (string) La URL que se abrira en la ventana
 ****************************************************************************/
function abrirVentana(cParamURL) {
  abrirFlotante(cParamURL,375,275,0);
}

function abrirVentanaXY(cParamURL,nParamX,nParamY,nParamAnchura,nParamAltura) {
  cerrarFlotante();
  hndFlotante=window.open(cParamURL,"hndFlotante","width="+nParamAnchura+",height="+nParamAltura+",top="+nParamY+",left="+nParamX+",directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,status=no");
}

function abrirVentanaXY2(cParamURL,nParamX,nParamY,nParamAnchura,nParamAltura) {
  cerrarFlotante2();
  hndFlotante2=window.open(cParamURL,"hndFlotante2","width="+nParamAnchura+",height="+nParamAltura+",top="+nParamY+",left="+nParamX+",directories=no,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,status=no");
}

function abrirVentanax(cParamURL,cParamFeatures) {
  cerrarFlotante();
  hndFlotante=window.open(cParamURL,"hndFlotante",cParamFeatures);
}

function abrirVentanax2(cParamURL,cParamFeatures) {
  cerrarFlotante2();
  hndFlotante2=window.open(cParamURL,"hndFlotante2",cParamFeatures);
}

/*****************************************************************************
 * Devuelve si es an/o parametro es bisiesto
 *****************************************************************************
 * Parametros: nParamAnno (int) El an/o parametro
 *    Retorno: (boolean) Devuelve verdadero (true) o falso (false)
 ****************************************************************************/
function bisiesto(nParamAnno) {
  return (((nParamAnno%4==0) && !(nParamAnno%100==0)) || ((nParamAnno%4==0) && (nParamAnno%400==0)));
}

/*****************************************************************************
 * Cargar imagenes para efecto roll-over
 *****************************************************************************
 * Parametros: acParamImagenes (array de string) Array con las URL de las imagenes
 ****************************************************************************/
function cargarImagenes(acParamImagenes) {
  if (document.images) {
    for (var n=0;n<acParamImagenes.length;n+=2) {
      if (acParamImagenes[n]!="") {
        imgOff[n/2]=new Image();
        imgOff[n/2].src=acParamImagenes[n];
      }
      if (acParamImagenes[n+1]!="") {
        imgOver[n/2]=new Image();
        imgOver[n/2].src=acParamImagenes[n+1];
      }
    }
  }
}

/*****************************************************************************
 * Cerrar el calendario
 *****************************************************************************
 * Parametros: cParamFecha (string) La fecha recibida del calendario
 ****************************************************************************/
function cerrarCalendario(cParamFecha) {
  cerrarFlotante();
  oInput.value=cParamFecha;
  if (cInputJS!="") eval(cInputJS);
}

/*****************************************************************************
 * Cerrar el selector de color
 *****************************************************************************
 * Parametros: cParamColor (string) El color recibido del selector de color
 ****************************************************************************/
function cerrarColorPicker(cParamColor) {
  cerrarFlotante();
  oInput.value=cParamColor;
  if (cInputJS!="") eval(cInputJS);
}

/*****************************************************************************
 * Cerrar la ventana flotante abierta
 ****************************************************************************/
function cerrarFlotante() {
  if (hndFlotante!=null) hndFlotante.close();
}

function cerrarFlotante2() {
  if (hndFlotante2!=null) hndFlotante2.close();
}

/*****************************************************************************
 * Cerrar la ventana actual
 ****************************************************************************/
function cerrarVentana() {
  window.close();
}

/*************************************
** Conversores de cadenas a numeros **
*************************************/

function chr(cCadena) {
  if (cCadena!=null) {
    return cCadena.charAt(0);
  } else return "".charAt(0);
}

function cint(cCadena) {
  if (cCadena!=null) {
    return parseInt(trimcero(trim(cCadena)));
  } else return 0;
}

function clng(cCadena) {
  if (cCadena!=null) {
    return cint(cCadena);
  } else return 0;
}

function cdbl(cCadena) {
  if (cCadena!=null) {
    return parseFloat(trimcero(trim(cCadena)));
  } else return 0;
}

function cstr(cCadena) {
  if (cCadena!=null) {
    return cCadena;
  } else return "";
}

/*********************************************
** Corta una cadena a una longitud indicada **
*********************************************/
function cortarCadena(cCadena,nCorte) {
  if (len(cCadena)>nCorte) {
    nCorte=nCorte-3;
    return trim(left(cCadena,nCorte/2))+"..."+trim(right(cCadena,nCorte-(nCorte/2)));
  } else return cCadena;
}

/***********************************************************************
** Devuelve una cadena con la fecha argumento, segun el formato local **
***********************************************************************/
function ddmmyyyy(cFecha) {
  var anFecha=ddmmyyyy2Array(cFecha);
  if (anFecha!=null) return lpadcero(anFecha[0],2)+"/"+lpadcero(anFecha[1],2)+"/"+lpadcero(anFecha[2],4);
  else return "";
}

/******************************************************************************************
** Devuelve un array (dd,mm,yyyy,weekday) con la fecha argumento, segun el formato local **
******************************************************************************************/
function ddmmyyyy2Array(cFecha) {
  var nAnno=0;
  var anDias=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  var anFecha=new Array(8);
  var anHora=new Array(4);
  var cHora="";
  var acFecha=null;
  var acHora=null;
  anFecha[7]=0;
  if (!estaVacio(cFecha)) {
    if (instr(cFecha," ")>0) {cHora=mid(cFecha,instr(cFecha," ")+1);cFecha=mid(cFecha,1,instr(cFecha," ")-1);}
    if (instr(cFecha,"/")>0) acFecha=split(cFecha,"/");
    else if (instr(cFecha,"-")>0) acFecha=split(cFecha,"-");
    else if (instr(cFecha,".")>0) acFecha=split(cFecha,".");
    else if (instr(cFecha,":")>0 && estaVacio(cHora)) cHora=cFecha;
    if (acFecha!=null) {
      if (acFecha.length>2 && clng(acFecha[2])>0) {
        nAnno=Math.abs(clng(acFecha[2]));
        if (nAnno<100) {
          if (nAnno<30) nAnno=nAnno+2000;
          else nAnno=nAnno+1900;
        }
      } else nAnno=1900;
      if (bisiesto(nAnno)) anDias[1]=anDias[1]+1;
      if (acFecha.length>1 && clng(acFecha[1])>0) {
        anFecha[1]=Math.abs(clng(acFecha[1]));
        if (anFecha[1]<=0) {anFecha[7]=1;anFecha[1]=1;}
        if (anFecha[1]>12) {anFecha[7]=1;anFecha[1]=12;}
      } else anFecha[1]=0;
      if (acFecha.length>0 && clng(acFecha[0])>0) {
        anFecha[0]=Math.abs(clng(acFecha[0]));
        if (anFecha[0]<=0) {anFecha[7]=1;anFecha[0]=1;}
        if (anFecha[0]>anDias[anFecha[1]-1]) {anFecha[7]=1;anFecha[0]=anDias[anFecha[1]-1];}
      } else anFecha[0]=0;
      anFecha[2]=nAnno;
      anFecha[3]=new Date(anFecha[2],anFecha[1]-1,anFecha[0]).getDay();
      anFecha[3]=(anFecha[3]==0?6:anFecha[3]-1);
    } else {anFecha[0]=anFecha[1]=anFecha[2]=anFecha[3]=0;anFecha[7]=1;}
    if (!estaVacio(cHora)) {
      anHora=hhmmss2Array(cHora);
      if (anHora[3]>0) anFecha[7]=1;
      if (anHora[0]>23) anFecha[7]=1;
      anHora[0]=anHora[0] % 24;
      anFecha[4]=anHora[0];
      anFecha[5]=anHora[1];
      anFecha[6]=anHora[2];
    } else anFecha[4]=anFecha[5]=anFecha[6]=0;
  } else {anFecha[0]=anFecha[1]=anFecha[2]=anFecha[3]=anFecha[4]=anFecha[5]=anFecha[6]=0;anFecha[7]=1;}
  return anFecha;
}

/******************************************************************************************************
** Devuelve una fecha con la fecha argumento (pasado como cadena dd/mm/yyyy), segun el formato local **
******************************************************************************************************/
function ddmmyyyy2Date(cFecha) {
  var anFecha=ddmmyyyy2Array(cFecha);
  if (anFecha!=null) return new Date(anFecha[2],anFecha[1]-1,anFecha[0]);
  else return null;
}

/*****************************************************************************
 * No hace nada
 ****************************************************************************/
function doNothing() {
}

/**************************
** Es una fecha correcta **
**************************/
function esFecha(cFecha) {
  var anFecha=ddmmyyyy2Array(cFecha);
  return (anFecha[7]==0);
}

/*************************
** Es una hora correcta **
*************************/
function esHora(cHora) {
  var anHora=hhmmss2Array(cHora);
  return (anHora[3]==0);
}

/*****************************************************************************
 * Es el argumento es un numero
 *****************************************************************************
 * Parametros: nParamNumero (string) El numero a consultar
 *    Retorno: (boolean) Devuelve verdadero (true) o falso (false)
 ****************************************************************************/
function esNumero(nParamNumero) {
  return (!isNaN(parseInt(nParamNumero)));
}

/*****************************************************************************
 * Es la ventana actual una ventana flotante o es la principal del navegador?
 *****************************************************************************
 * Retorno: (boolean) Devuelve verdadero (true) o falso (false)
 ****************************************************************************/
function esVentanaFlotante() {
  return (typeof(window.opener)!='undefined');
}

/********************************
** Si un campo es nulo o vacio **
********************************/
function estaVacio(cCampo) {
  var bEstaVacio=false;
  if (!bEstaVacio && cCampo==null) bEstaVacio=true;
  if (!bEstaVacio && trim(cCampo)=="") bEstaVacio=true;
  return bEstaVacio;
}

/*****************************************************************************
 * Si existe una variable o no definida en el JS
 ****************************************************************************/
function existeVariable(cParam) {
  return (eval("typeof "+cParam)!="undefined");
}

/********************************
** Porcion entera de un numero **
********************************/
function fix(nNumero) {
  if (nNumero<0) return -(Math.abs(nNumero));
  else return Math.abs(nNumero);
}

/****************************************************************
** Devuelve una cadena con la hora argumento en formato hhh:mm **
****************************************************************/
function hhhmm(cHora) {
  var anHora=hhmmss2Array(cHora);
  return anHora[0]+":"+lpadcero(anHora[1],2);
}

/************************************************************************
** Devuelve el valor en minutos de la hora argumento en formato hhh:mm **
************************************************************************/
function hhhmm2mm(cHora) {
  var anHora=hhmmss2Array(cHora);
  return anHora[0]*60+anHora[1];
}

/****************************************************************
** Devuelve un array con la hora argumento en formato hh:mm:ss **
****************************************************************/
function hhmmss2Array(cHora) {
  var anHora=new Array(4);
  var acHora=null;
  anHora[3]=0;
  if (!estaVacio(cHora)) {
    if (instr(cHora,"/")>0) acHora=split(cHora,"/");
    else if (instr(cHora,"-")>0) acHora=split(cHora,"-");
    else if (instr(cHora,".")>0) acHora=split(cHora,".");
    else if (instr(cHora,":")>0) acHora=split(cHora,":");
    else acHora=split(cHora," ");
    if (acHora!=null) {
      if (acHora.length>0 && clng(acHora[0])>0) anHora[0]=Math.abs(clng(acHora[0])); else anHora[0]=0;
      if (acHora.length>1 && clng(acHora[1])>0) anHora[1]=Math.abs(clng(acHora[1])); else anHora[1]=0;
      if (acHora.length>2 && clng(acHora[2])>0) anHora[2]=Math.abs(clng(acHora[2])); else anHora[2]=0;
    } else {anHora[0]=anHora[1]=anHora[2]=0;anHora[3]=1;}
  } else {anHora[0]=anHora[1]=anHora[2]=0;anHora[3]=1;}
  if (anHora[2]>59) {anHora[3]=1;anHora[1]=anHora[1]+(anHora[2]/60);anHora[2]=anHora[2]-(60*(anHora[2]/60));}
  if (anHora[1]>59) {anHora[3]=1;anHora[0]=anHora[0]+(anHora[1]/60);anHora[1]=anHora[1]-(60*(anHora[1]/60));}
  if (anHora[0]>23) anHora[3]=1;
  return anHora;
}

/***************************************************************
** Devuelve una cadena con la hora argumento en formato hh:mm **
***************************************************************/
function hhmm(cHora) {
  var anHora=hhmmss2Array(cHora);
  anHora[0]=anHora[0] % 24;
  return lpadcero(anHora[0],2)+":"+lpadcero(anHora[1],2);
}

function hhmmss(cHora) {
  var anHora=hhmmss2Array(cHora);
  anHora[0]=anHora[0] % 24;
  return lpadcero(anHora[0],2)+":"+lpadcero(anHora[1],2)+":"+lpadcero(anHora[2],2);
}

/*****************************************************************************
 * La hora actual del sistema en formato hh24:mi:ss
 *****************************************************************************
 * Retorno: (string) La hora actual del sistema
 ****************************************************************************/
function horaEs() {
  var nMinutos=0;
  var nSegundos=0;
  var fAhora=new Date();
  nMinutos=fAhora.getMinutes();
  nSegundos=fAhora.getSeconds();
  return fAhora.getHours()+":"+(nMinutos<10?"0"+nMinutos:nMinutos)+":"+(nSegundos<10?"0"+nSegundos:nSegundos);
}

/*****************************************************************************
 * La fecha actual del sistema en el formato deseado
 *****************************************************************************
 * Parametros: nParamFormato (int) 1=Largo, 2=General y 3=Corto
 *    Retorno: (string) La hora actual del sistema en el formato deseado
 ****************************************************************************/
function hoyEs(nParamFormato) {
  var nDia=0;
  var nMes=0;
  var nAnno=0;
  var fHoy=new Date();
  var acDias=new Array("Domingo","Lunes","Martes","Mi&eacute;rcoles","Jueves","Viernes","S&aacute;bado");
  var acMeses=new Array("enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre");
  nDia=fHoy.getDate();
  nMes=fHoy.getMonth()+1;
  nAnno=fHoy.getFullYear();
  if (nParamFormato==1) return acDias[fHoy.getDay()]+", "+nDia+" de "+acMeses[nMes-1]+" de "+nAnno;
  else if (nParamFormato==3) return (nDia<10?"0"+nDia:nDia)+"/"+(nMes<10?"0"+nMes:nMes)+"/"+nAnno;
  else return nDia+" de "+acMeses[nMes-1]+" de "+nAnno;
}

/***************************************
** Localiza una cadena dentro de otra **
***************************************/
function instr(cCadena1,cCadena2) {
  return cCadena1.indexOf(cCadena2)+1;
}

function instrC(nComienzo,cCadena1,cCadena2) {
  if (nComienzo<=0) nComienzo=1;
  return cCadena1.indexOf(cCadena2,nComienzo-1)+1;
}

/*****************
** A minusculas **
*****************/
function lcase(cCadena) {
  return cCadena.toLowerCase();
}

/*************************************
** Los n-caracteres de la izquierda **
*************************************/
function left(cCadena,nLongitud) {
  if (nLongitud<=0) return "";
  else if (nLongitud>=len(cCadena)) return cCadena;
  else return cCadena.substring(0,nLongitud);
}

/***************************
** Longitud de una cadena **
***************************/
function len(cCadena) {
  if (cCadena!=null) return cCadena.length;
  else return 0;
}

/************************************************
** An/ade ceros por la izquierda de una cadena **
************************************************/
function lpadcero(cCadena,nCeros) {
  if (nCeros<=len(cCadena)) return cCadena;
  else return right(string(nCeros,"0")+cCadena,nCeros);
}

/*****************************
** Maximo de dos parametros **
*****************************/
function maximo(nParam1,nParam2) {
  return (nParam1>nParam2?nParam1:nParam2);
}

/***********************************
** Cortar una cadena por longitud **
***********************************/
function mid(cCadena,nInicio) {
  if (nInicio<1) return cCadena;
  else if (nInicio-1>len(cCadena)) return "";
  else return cCadena.substring(nInicio-1);
}

function midL(cCadena,nInicio,nLongitud) {
  if (nInicio<1) return cCadena;
  else if (nInicio>len(cCadena)) return "";
  else if (nLongitud<=0) return "";
  else if (nLongitud+nInicio-1>=len(cCadena)) return mid(cCadena,nInicio);
  else return cCadena.substring(nInicio-1,nLongitud+nInicio-1);
}

/*****************************
** Minimo de dos parametros **
*****************************/
function minimo(nParam1,nParam2) {
  return (nParam1<nParam2?nParam1:nParam2);
}

/*****************************************************************************
 * Imprimir desde JS simulando el boton del navegador
 ****************************************************************************/
function miWindowPrint() {
  window.print();
  //if (bNetscape || bExplorer5) window.print();
  //else if (bExplorer && bWindows) WB.ExecWB(6,2);
}

/*********************************************************
** Devuelve una cadena con la hora argumento en minutos **
*********************************************************/
function mm2hhhmm(nMinutos) {
  return clng(nMinutos/60)+":"+lpadcero(nMinutos-(60*clng(nMinutos/60)),2);
}

/*****************************************************************************
 * Devuelve el valor de una parametro de la URL actual
 ****************************************************************************/
function parametro(variable) {
  var url=unescape(window.location.href).replace("/\+/gi"," ");
  var pos=url.indexOf(variable);
  if (pos!=-1) {
    var sep=url.indexOf("&",pos);
    if (sep!=-1) return url.substring(pos+variable.length+1,sep);
    else return url.substring(pos+variable.length+1,url.length);
  } else return "";
}

/******************************************************************************
** El valor de un atributo de un comando
******************************************************************************/
function parserAtributo(cParse,cComando,cAtributo) {
  var nInicioAtributo=0;
  var nFinalAtributo=0;
  var nInicioMarca=0;
  var nFinalMarca=0;
  var cMarca="";
  var cValor="";
  nInicioMarca=instr(lcase(cParse),"<"+lcase(cComando));
  nFinalMarca=instrC(nInicioMarca,lcase(cParse),">");
  if (nInicioMarca>0 && nFinalMarca>0) {
    cMarca=midL(cParse,nInicioMarca,nFinalMarca-nInicioMarca+1);
    nInicioAtributo=instr(lcase(cMarca),lcase(cAtributo)+"='");
    nFinalAtributo=instrC(nInicioAtributo+len(cAtributo)+2,lcase(cMarca),"'");
    if (nInicioAtributo>0 && nFinalAtributo>0) cValor=midL(cMarca,nInicioAtributo+len(cAtributo)+2,nFinalAtributo-nInicioAtributo-len(cAtributo)-2);
  }
  return cValor;
}

/******************************************************************************
** Contar argumentos de un comando
******************************************************************************/
function parserContar(cParse,cComando) {
  return split(cParse,"</"+cComando+">").length;
}

/******************************************************************************
** El contenido de un comando
******************************************************************************/
function parserContenido(cParse,cComando) {
  var nInicioContenido=0;
  var nFinalContenido=0;
  var nInicioMarca=0;
  var nFinalMarca=0;
  var cContenido="";
  nInicioMarca=instr(lcase(cParse),"<"+lcase(cComando));
  nFinalMarca=instrC(nInicioMarca,lcase(cParse),">");
  if (nInicioMarca>0 && nFinalMarca>0) {
    nInicioContenido=nFinalMarca+1;
    nFinalContenido=instrC(nInicioMarca,lcase(cParse),"</"+lcase(cComando)+">");
    if (nInicioContenido>0 && nFinalContenido>0) cContenido=midL(cParse,nInicioContenido,nFinalContenido-nInicioContenido);
  }
  return cContenido;
}

/******************************************************************************
** El tag completo de un atributo de un comando con valor dado
******************************************************************************/
function parserPorAtributo(cParse,cComando,cAtributo,cValor) {
  var cRetorno="";
  var acParse=split(cParse,"</"+cComando+">");
  for(var i=0;i<acParse.length;i++) {
    if (parserAtributo(acParse[i]+"</"+cComando+">",cComando,cAtributo)==cValor) {
      cRetorno=acParse[i]+"</"+cComando+">";
      break;
    }
  }
  return cRetorno;
}

/*****************************************************************************
 * Carga las imagenes de un array de nombre imagenesCache en la cache del navegador
 ****************************************************************************/
function preloadImages() {
  var imgCache=new Array();
  if (document.images) {
    for (var n=0;n<imagenesCache.length;n++) {
      if (imagenesCache[n]!="") {
        imgCache[n]=new Image();
        imgCache[n].src=imagenesCache[n];
      }
    }
  }
}

/********************************
** Genera una cadena aleatoria **
********************************/
function randomi() {
  var dHoy=new Date();
  return lpadcero(dHoy.getHours(),2)+lpadcero(dHoy.getMinutes(),2)+lpadcero(dHoy.getSeconds(),2)+lpadcero(parseInt(Math.floor(100000*Math.random()+1)),6);
}

/*****************************************************************************
 * Recarga la pagina actual sin pasar por la cache
 ****************************************************************************/
function reload() {
  var cURL=document.location.href;
  var nocache=randomi();
  if (cURL.indexOf("nocache=")==-1) {
    if (cURL.indexOf("?")==-1) cURL=cURL+"?nocache="+nocache;
    else cURL=cURL+"&nocache="+nocache;
    document.location.href=cURL;
  }
}

/*****************************************************************************
 * Poner un reloj que se actualiza cada decima de segundo
 * La pagina con el reloj tiene que tener una capa de nombre "idreloj"
 ****************************************************************************/
function reloj() {
  //La referencia a la capa del reloj
  var lyReloj=null;
  if (bExplorer) lyReloj=document.all("idreloj").style;
  else if (bNetscape4) lyReloj=document.layers["idreloj"];
  else if (bNetscape6) lyReloj=document.getElementById("idreloj").style;
  //Variables
  var cHTML="<font face=Verdana,Arial,Helvetica,Geneva size=1 color=#000000>"+horaEs()+"</font>";
  //Comenzar con el manejador del reloj
  if (bExplorer) {
    document.all("idreloj").innerHTML=cHTML;
    self.setTimeout("reloj()",100);
  } else if (bNetscape4) {
    //lyReloj.document.write(cHTML);
    //lyReloj.document.close();
  } else if (bNetscape6) {
    //document.getElementById("idreloj").innerHTML=cHTML;
    //self.setTimeout("reloj()",100);
  }
}

function relojinput() {
  document.frmReloj.txtReloj.value=horaEs();
  self.setTimeout("relojinput()",100);
}

/***********************************
** Reemplazar una cadena por otra **
***********************************/
function replace(cCadena1,cCadena2,cCadena3) {
  var nPosicion=instr(cCadena1,cCadena2);
  var nPosicionAux=1;
  var cReplace="";
  if (nPosicion>0) {
    while (nPosicion>0) {
      cReplace=cReplace+cCadena1.substring(nPosicionAux-1,nPosicion-1)+cCadena3;
      nPosicion=instrC(nPosicionAux=nPosicion+len(cCadena2),cCadena1,cCadena2);
    }
    if (nPosicionAux-1<len(cCadena1)) cReplace=cReplace+cCadena1.substring(nPosicionAux-1);
  } else cReplace=cCadena1;
  return cReplace;
}

/***********************************
** Los n-caracteres de la derecha **
***********************************/
function right(cCadena,nLongitud) {
  if (nLongitud<=0) return "";
  else if (nLongitud>=len(cCadena)) return cCadena;
  else return cCadena.substring(len(cCadena)-nLongitud);
}

/**************************************************************
** Convierte una cadena delimitada en un array de sus tokens **
**************************************************************/
function split(cCadena,cDelim) {
  return cCadena.split(cDelim);
}

/*****************************************
** Repite una cadena un numero de veces **
*****************************************/
function string(nRepetir,cCadena) {
  var cString="";
  for(var i=0;i<nRepetir;i++) cString=cString+cCadena;
  return cString;
}

/********************************************************
** Devuelve una cadena con las horas argumento sumadas **
********************************************************/
function sumahhhmm(cHHHMM1,cHHHMM2) {
  var nMin1=hhhmm2mm(cHHHMM1);
  var nMin2=hhhmm2mm(cHHHMM2);
  return mm2hhhmm(nMin1+nMin2);
}

/*********************
** Eliminar blancos **
*********************/
function trim(cCadena) {
  var i=0;
  var j=0;
  for(i=0;i<len(cCadena);i++) if (cCadena.charAt(i)!=" ") break;
  for(j=len(cCadena)-1;j>=0;j--) if (cCadena.charAt(j)!=" ") break;
  return cCadena.substring(i,j+1);
}

/**********************************
** Eliminar ceros a la izquierda **
**********************************/
function trimcero(cCadena) {
  var i=0;
  for(i=0;i<len(cCadena);i++) if (cCadena.charAt(i)!="0") break;
  return mid(cCadena,i+1);
}

/*****************
** A mayusculas **
*****************/
function ucase(cCadena) {
  return cCadena.toUpperCase();
}

/*****************************************************************
** Vacia los elementos de tipo comando del formulario argumento **
*****************************************************************/
function vaciarComandos(formulario) {
  for(var i=0;i<formulario.elements.length;i++) {
    if (mid(formulario.elements[i].name,len(formulario.elements[i].name)-1)==".x" && midL(formulario.elements[i].name,1,4)=="cmd_") formulario.elements[i].value="";
  }
}
