String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };

function LTrim(str) {
 for (var i=0; ((str.charAt(i)<=" ")&&(str.charAt(i)!="")); i++);
 return str.substring(i,str.length);
}

function RTrim(str) {
 for (var i=str.length-1; ((str.charAt(i)<=" ")&&(str.charAt(i)!="")); i--);
 return str.substring(0,i+1);
}

function Trim(str) {
 return LTrim(RTrim(str));
}

// -----------------------

function dameVar( a_var )
{
  var pos = String(window.location.href).indexOf('?');
  var argumentos = (pos >= 0) ? String(window.location.href).substr(pos + 1) : String('');
  if( argumentos.charAt(argumentos.length - 1) != '&' )  { argumentos = argumentos.concat('&'); }

  while( true ) {
    pos = argumentos.indexOf('&');  // Busca el final de la variable.
    if( pos < 0 )  { break; }

    var varActual = argumentos.substring(0, pos);   // Guardamos la variable encontrada junto con su valor.
    argumentos = argumentos.substr(pos + 1);        // Eliminamos la variable actual para no volver a encontrarla.

    pos = varActual.indexOf('=');  if( pos < 0 )  { continue; }
    var nombreVar = varActual.substring(0, pos);    // Extraemos el nombre de la variable.
    if( nombreVar == a_var )
    { // Encontrada!!
      return varActual.substr(pos + 1);
    }
  }

  return -1;
}

/*
// ------------------------------------------------------------------
// Funciones para mostrar filtros por rangos de letras.
// ------------------------------------------------------------------
function MostrarFiltroAZ( pagina ) {
  var d = document;
  var rangoI = dameVar( "rangoI" );  if( -1 == rangoI )  { rangoI = ''; }
  var rangoF = dameVar( "rangoF" );  if( -1 == rangoF )  { rangoF = ''; }
  var bNegrita = false;

  // Si no se está filtrando por un rango de letras, mostraremos el enlace 'Todos' en negrita.
  if( rangoI == ''  &&  rangoF == '' )  { bNegrita = true; }

  d.writeln( '<table>' );
  d.writeln( '<tr>' );
  d.writeln( '<td nowrap>' );

  MostrarFiltroAZ_linea( d, pagina, 'A', 'C', '',  'D', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'D', 'F', 'D', 'G', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'G', 'I', 'G', 'J', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'J', 'L', 'J', 'M', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'M', 'O', 'M', 'P', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'P', 'R', 'P', 'S', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'S', 'U', 'S', 'V', rangoI, rangoF );
  MostrarFiltroAZ_linea( d, pagina, 'V', 'Z', 'V', '',  rangoI, rangoF );

  d.writeln( '&nbsp;&nbsp;' );
  if( bNegrita )  { d.writeln( '<b>' ); }
  d.writeln( '<a href="' + pagina + '">[Todos]</a>&nbsp;' );
  if( bNegrita )  { d.writeln( '</b>' ); }
  d.writeln( '</td>' );
  d.writeln( '</tr>' );
  d.writeln( '</table>' );
}

function MostrarFiltroAZ_linea( d, pagina, letraI, letraF, rangoI2, rangoF2, rangoI, rangoF ) {

  var bNegrita = false;

  // Si el rango de la línea a mostrar (rangoI2 / rangoF2) coincide con el rango filtrado
  // mostramos éste en negrita.
  if( rangoI == rangoI2  &&  rangoF == rangoF2 )  { bNegrita = true; }

  // Si la página ya tiene un símbolo ? iniciamos los parámetros con & en lugar de otro ?.
  if( -1 != pagina.indexOf("?") )  { concatenador = "&"; }
  else                             { concatenador = "?"; }

  if( bNegrita )  { d.writeln( '<b>' ); }
  d.writeln( '<a href="' + pagina + concatenador + 'rangoI=' + rangoI2 + '&rangoF=' + rangoF2 +'">[' + letraI + '-' + letraF + ']</a>&nbsp;' );
  if( bNegrita )  { d.writeln( '</b>' ); }
}
// ------------------------------------------------------------------
// FIN - Funciones para mostrar filtros por rangos de letras.
// ------------------------------------------------------------------
*/


// ------------------------------------------------------------------
// Funciones para permitir cambiar los checks por imágenes propias.
// ------------------------------------------------------------------
var controles_hidden = new Array();

function control_hiddenRecord( dentroDeGrid, idx, nombreForm, nombreControlOrigen, textoAltValor0, textoAltValor1, soloLectura, unico, numReg ) {
  this.dentroDeGrid        = dentroDeGrid;
  this.idx                 = idx;
  this.id                  = "Img_" + idx;
  this.nombreForm          = nombreForm;
  this.nombreControlOrigen = nombreControlOrigen;
  this.textoAltValor0      = textoAltValor0;
  this.textoAltValor1      = textoAltValor1;
  this.soloLectura         = soloLectura;
  this.unico               = unico;
  this.numReg              = numReg;
}

function NuevoHidden( dentroDeGrid, idx, nombreForm, nombreControlOrigen, textoAltValor0, textoAltValor1, soloLectura, unico, numReg ) {
  controles_hidden[ idx ] = new control_hiddenRecord( dentroDeGrid, idx, nombreForm, nombreControlOrigen, textoAltValor0, textoAltValor1, soloLectura, unico, numReg );
}

function IconoActivoParaHidden()    { return "img/activo.gif"; }
function IconoInactivoParaHidden()  { return "img/inactivo.gif"; }

function ActivarHidden( objOrigen, objDestino, txt ) {
	objOrigen.value = 1;
    objDestino.src = IconoActivoParaHidden();
    objDestino.alt = txt;
}

function DesactivarHidden( objOrigen, objDestino, txt ) {
	objOrigen.value = 0;
    objDestino.src = IconoInactivoParaHidden();
    objDestino.alt = txt;
}

function AlternarValorHidden( objDestino ) {
  var idx = Number( objDestino.id.substr(4) );  // Obtenemos el índice a partir del ID del objeto IMG.
//alert( "idx = " + idx );
  var elem = controles_hidden[ idx ];
//alert( "elem.idx = " + elem.idx );
  var objOrigen;
  if( elem.dentroDeGrid ) {
  	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen + "_" + elem.numReg ];
  } else {
  	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen ];
  }
//alert( "document.forms[ '" + elem.nombreForm + "' ].name = " + document.forms[ elem.nombreForm ].name );

  // Alternamos los valores 0/1.
//alert( "objOrigen = " + objOrigen + ", objDestino = " + objDestino );
  if( objOrigen.value == 0 ) {
  	ActivarHidden( objOrigen, objDestino, elem.textoAltValor1 );
  } else {
    DesactivarHidden( objOrigen, objDestino, elem.textoAltValor0 );
  }
}

function AlternarValorHiddenUnico( objDestino ) {
  var idx = Number( objDestino.id.substr(4) );  // Obtenemos el índice a partir del ID del objeto IMG.
//alert( "idx = " + idx );
  var elem = controles_hidden[ idx ];
//alert( "elem.idx = " + elem.idx );
  var objOrigen;

  if( elem.dentroDeGrid ) {
  	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen + "_" + elem.numReg ];
  } else {
  	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen ];
  }

  // En caso de que vayamos a activarlo, recorremos todos los elementos del array 'controles_hidden'. Los 
  // que estén en el mismo formulario y se llamen igual habrá que desactivarlos previamente para evitar 
  // conflictos.
  // Si vamos a desactivarlo, simplemente le cambiamos el valor y dejamos los demás intactos.
  if( objOrigen.value == 0 ) {  // Si tiene valor 0 lo vamos a activar, si no, lo vamos a desactivar.
    var elemAux;
    var frm = document.forms[ elem.nombreForm ];
    for( var n = 0; n < controles_hidden.length; n++ ) {
      elemAux = controles_hidden[ n ];
      
      if( elemAux.nombreForm == elem.nombreForm  &&  elemAux.nombreControlOrigen == elem.nombreControlOrigen  &&  !elemAux.soloLectura ) {
        if( elemAux.dentroDeGrid ) {
          DesactivarHidden( frm.elements[ elemAux.nombreControlOrigen + "_" + elemAux.numReg ], document.getElementById( elemAux.id ), elemAux.textoAltValor0 );
        } else {
          DesactivarHidden( frm.elements[ elemAux.nombreControlOrigen ], document.getElementById( elemAux.id ), elemAux.textoAltValor0 );
        }
      }
    }
  }

  // Alternamos los valores 0/1.
//alert( "objOrigen = " + objOrigen + ", objDestino = " + objDestino );
  if( objOrigen.value == 0 ) {
  	ActivarHidden( objOrigen, objDestino, elem.textoAltValor1 );
  } else {
    DesactivarHidden( objOrigen, objDestino, elem.textoAltValor0 );
  }
}

function ReflejarValorHiddenTodos() {
  var elem;
  var objOrigen;
  var objDestino;

  for( var n = 0; n < controles_hidden.length; n++ ) {
//alert( "controles_hidden[ " + n + " ] = " + controles_hidden[ n ] );
    elem = controles_hidden[ n ];
//alert( "elem.nombreForm = " + elem.nombreForm );
//alert( "elem.nombreControlOrigen = " + elem.nombreControlOrigen );
//alert( "elem.dentroDeGrid = " + (elem.dentroDeGrid ? "1" : "0") );
	if( elem.dentroDeGrid ) {
//alert( "document.forms[ '" + elem.nombreForm + "' ].elements[ '" + elem.nombreControlOrigen + "_" + elem.numReg + "' ] = " + document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen + "_" + elem.numReg ] );
    	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen + "_" + elem.numReg ];
	} else {
//alert( "document.forms[ '" + elem.nombreForm + "' ].elements[ '" + elem.nombreControlOrigen + "' ] = " + document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen ] );
    	objOrigen = document.forms[ elem.nombreForm ].elements[ elem.nombreControlOrigen ];
	}
//alert( "objOrigen = " + objOrigen );
//alert( "elem.id = " + elem.id );
    objDestino = document.getElementById( elem.id );
//alert( "objDestino = " + objDestino );

    // Actualizamos en pantalla el icono que refleja el estado.
    if( objOrigen.value == 0 ) {
      objDestino.src = IconoInactivoParaHidden();
      objDestino.alt = elem.textoAltValor0;
    } else {
      objDestino.src = IconoActivoParaHidden();
      objDestino.alt = elem.textoAltValor1;
    }
  }
}
// ------------------------------------------------------------------
// FIN - Funciones para permitir cambiar los checks por imágenes propias.
// ------------------------------------------------------------------


function FechaASerie( fecha ) {
	var dias_desde_1970_01_01 = Date.UTC( fecha.getFullYear(), fecha.getMonth(), fecha.getDate(), 0, 0, 0 ) / 1000 / 60 / 60 / 24;
	var dias_entre_1899_12_31_y_1970_01_01 = 25569;
	return dias_entre_1899_12_31_y_1970_01_01 + dias_desde_1970_01_01;
}

function getDateTime(fecha){
	System.out.println("FUNCION GET DATE TIME ####################");
	var date = new Date (	fecha.getFullyear(),
							fecha.getMonth(),
							fecha.getDate(),0,0,0);
	System.out.println ("FUNCION GETDATETIME, DATE.GETTIME =" + date.getTime());
	return date.getTime();
}

// Comprueba si fx1 es mayor que fx2.
function isFechaMayor(fx1,fx2){

      //Si la segunda fecha es vac?a,se devuelve un false

      if (fx2.value == "" || fx2.value == " ") 

            return false;

      //Se separan las fechas en d?a, mes y a?o

      var datos1 = fx1.value.split("/");

      var datos2 = fx2.value.split("/");


      //Comparaci?n del a?o

      var intfx1 = new Number(datos1[2]);

      var intfx2 = new Number(datos2[2]);

      if(intfx1 > intfx2) 

            return true;

      //Comparaci?n del mes

      intfx1 = new Number(datos1[1]);

      intfx2 = new Number(datos2[1]);

      if(intfx1 > intfx2){

            //Si el mes es menor puede que el a?o sea igual o menor por eso comparamos el a?o

            var intfx1 = new Number(datos1[2]);

            var intfx2 = new Number(datos2[2]);

            if(intfx1 >= intfx2) 

                  return true;

      } 


      //Comparaci?n del d?a

      intfx1 = new Number(datos1[0]);

      intfx2 = new Number(datos2[0]);

      if(intfx1 > intfx2){

            // Si el d?a es menor puede que pertenezca a un mes superirio o a un mes inferior pero de una a?o superior

            // asi que volvemos a la Comparaci?n del mes

            intfx1 = new Number(datos1[1]);

            intfx2 = new Number(datos2[1]);

            if(intfx1 >= intfx2){

                  //Comparaci?n del a?o

                  var intfx1 = new Number(datos1[2]);

                  var intfx2 = new Number(datos2[2]);

                  if(intfx1 >= intfx2) 

                        return true;

            } 

    }

            

    return false;
}

function sonFechasIguales (fx1,fx2){
	//Se separan las fechas en d?a, mes y a?o

      var datos1 = fx1.value.split("/");
      var datos2 = fx2.value.split("/");
      var ok = false;
      
      if (datos1[0] == datos2[0] && datos1[1] == datos2[1] && datos1[2] == datos2[2])
      	ok = true;
      	
      return ok;
      
}

// Funci?n que valida si la hora introducida tiene el formato correcto.

      function validar_hora(dato_hora) {

            if(dato_hora.length==0)

                  return true;

            // si mete hora, tiene que tener cinco caracteres (HH:MM)

            if(dato_hora.length > 0 && dato_hora.length != 5)

                  return false;

            // Detectamos ':'

            if (dato_hora.lastIndexOf(":") != 2)

                  return false;

            var horas = new Number(dato_hora.substring(0,2));

            // Comprobamos q HH -> 00..23

            if (isNaN(horas) || horas > 23)

                  return false;

            // Comprobamos q MM -> 00..59

            var minutos = new Number(dato_hora.substring(3,5));  

            if (isNaN(minutos) || minutos > 59)

                  return false;

            return true;      

      }
      

      // funcion que compara dos horas y nos dice si la primera es mayor que la segunda
	
      function esHoraMayor(hora1,hora2) {
						var ok = false;
						var h1 = hora1.split(':');
            var h2 = hora2.split(':');
            
            if( (h1[0] == h2[0] && h1[1] == h2[1]) || (h2[0] == '00' && h2[1] == '00' ) ) {
                  ok = true;
            }

            if((h1[0] > h2[0]) || ((h1[0] == h2[0]) && (h1[1] > h2[1]))) {
                  ok = true;
            }
        
            return ok;
      }


function ComprobarLongitudMaxima( obj ) {
	var mlength = obj.getAttribute ? parseInt( obj.getAttribute("maxlength") ) : "";
	if( obj.getAttribute && obj.value.length > mlength )  { obj.value = obj.value.substring( 0, mlength ); }
}

function emailValido( str )
{
  var at   = "@";
  var dot  = ".";
  var lat  = str.indexOf( at );
  var lstr = str.length;
  var ldot = str.indexOf( dot );

	if( (str == null) || (str == "") )  { return false; }
  if( str.indexOf( at ) == -1 )  { return false; }
  if( str.indexOf( at  ) == -1 || str.indexOf( at  ) == 0 || str.indexOf( at  ) == lstr )  { return false; }
  if( str.indexOf( dot ) == -1 || str.indexOf( dot ) == 0 || str.indexOf( dot ) == lstr )  { return false; }
  if( str.indexOf( at, (lat + 1) ) != -1 )  { return false; }
  if( str.substring( lat - 1, lat ) == dot || str.substring( lat + 1, lat + 2 ) == dot )  { return false; }
  if( str.indexOf( dot, (lat + 2) ) == -1 )  { return false; }
  if( str.indexOf( " " ) != -1 )  { return false; }
  
  return true;
}

function Vacio( obj )
{
	if( (obj.value == null) || (obj.value == "") )  { return true; }
	if( Trim( obj.value ).length == 0 )  { return true; }
	return false;
}

// Función para abrir popup
var ven;
function popup(url, title) {
 if (ven!=null){ven.close();ven=null;}
 ven = window.open(url,title,"scrollbars=0,channelmode=0,resizable=0,fullscreen=0,location=0,directories=0,menubar=0,toolbar=0,statusbar=0, width=750, left=200, top=200, height=519, dependent=1");
 ven.focus();
}

function newWindow (accion,titulo,w,h,propiedades) {
  var winl = (screen.width-w)/2;
  var wint = (screen.height-h)/2;
  if (winl < 0) winl = 0;
  if (wint < 0) wint = 0;
  var settings = 'height=' + h + ','; 
  settings += 'width=' + w + ',';
  settings += 'top=' + wint + ',';
  settings += 'left=' + winl + ',';
  settings += propiedades;
  ven = window.open(accion,titulo,settings); 
  ven.focus();
  return ven;
} 

function cerrarWindow(){
	window.close();
}