////////////////////////////////////////////////////////////////
//  Esta función, recorre TODOS los campos de un formulario
// recibido como argumento y sustitye todas las ocurrencias de
// Los caracteres "<" y "&" por sus correspondientes códigos de
// ESCAPE para que el XML del cual ellos van a formar parte (teóricamente se asume que se van ameter en un XML!),
// sea válido.
////////////////////////////////////////////////////////////////

function doEscapeFormFields(formulario){

// OJO, este boolean permite mostrar los parámetros que serán enviados al enviar los datos del formulario!
mostrarAlertConParametrosDelFormulario = false;


  //  recorro todos los elementos que tiene el formulario recibido para hacer la sustitución de los caracteres "<" y "&" !
   for (i = 0; i < formulario.length; i++){


      if (!(formulario.elements[i].value == null) ){

      //   formulario.elements[i].value = getReplacedString ("&", "&#38;", formulario.elements[i].value);
      //   formulario.elements[i].value = getReplacedString ("<", "&#60;", formulario.elements[i].value);


     }

   }

// ------------------Esto es solo para mostrar un alert con los datos del formulario
// Esta parte se ejecutará en dependencia del valor que tenga el boolean mostrarAlertConParametrosDelFormulario !!
if (mostrarAlertConParametrosDelFormulario){
   str = "";
   for (i = 0; i < formulario.length; i++){
      str = str + formulario.elements[i].name + " = " + formulario.elements[i].value +"\n";
    }
      alert("Datos del formulario que serán enviados:\n\n" + str);
   }
// ---------------hasta aqui llega lo de mostrar los datos del formulario cuando mostrarAlertConParametrosDelFormulario sea true!!


}





function getFileNameOnly(inputFileItem) {
// Receives an Input of File type and will get the fileName Only and will return it !

//si se recibe "D:\files\Fotos\Mary Jose\P3080019.JPG"
//me retorno solo "P3080019.JPG"

// Busco de atras hacia adelante el primer caracter "\"  y tomo el valor de ahi en adelante solamente!

  for (var i=inputFileItem.value.length-1; i>=0; i--) {

     if (inputFileItem.value.substring(i,i+1) == "\\") {
        return inputFileItem.value.substring(i+1,inputFileItem.value.length);
      }

   }

   

    // OJO, si se llega aqui al final es que NO SE ENCONTRÓ NINGUN caracter "\", así que retorno el mismo valor...
    if (inputFileItem.value.length > 0){
    
      return inputFileItem.value;
      
    }else{
      return "";
    }

}




function getFileExtensionOnly(inputFileItem) {
// Receives an Input of File type and will get the EXTENSION of the fileName Only and will return it !

//si se recibe "D:\files\Fotos\Mary Jose\P3080019.JPG"
//me retorno solo "JPG"

// Busco de atras hacia adelante el primer caracter "."  y tomo el valor de ahi en adelante solamente!

  for (var i=inputFileItem.value.length-1; i>=0; i--) {

     if (inputFileItem.value.substring(i,i+1) == ".") {
        return inputFileItem.value.substring(i+1,inputFileItem.value.length);
      }

   }

    // OJO, si se llega al final retorno cadena vacia !
   return "";

}








////////////////////////////////////////////////////////////////////////
// Esta es una implementación de un replace porque la String de JavaScript NO tiene una
// se llama asi:  replaceString("World","Web","Brave New World")
// tomado de http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/ref_s-s.htm
////////////////////////////////////////////////////////////////////////
function getReplacedString(oldS,newS,fullS) {
// Replaces oldS with newS in the string fullS
  for (var i=0; i<fullS.length; i++) {
     if (fullS.substring(i,i+oldS.length) == oldS) {
        fullS = fullS.substring(0,i)+newS+fullS.substring(i+oldS.length,fullS.length)
      }
   }
 return fullS;
}




// ********************  Validación de un campo TEXTO que debe contener un EMAIL recibiendo además una cadena descriptiva!
//
// Recibe:   Permite validar campos INPUT TEXT de Textos en formularios
// inputField     --el objeto Input Text del formulario que contendrá el email
// emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
// TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

// Retorna:  boolean correspondiente a si ha sido validado correctamente el EMAIL en el campo recibido!



function validateTextInputFieldWithEmail (
                          inputField,
                          emptyAllowed,
                          textIdentifier){




    // Tomo la cadena que contiene el texto con el email del Input recibido!
    inputStringValue = trim(inputField.value);


    if ( (!emptyAllowed) & (inputStringValue == "")){
         // Si NO se permite que el campo sea vacío y el campo es vacio,
         // entonces HAY PROBLEMAS, por lo que saco una ventana de error y retorno false!
         inputField.focus();
         alert ("Debe suministrar " + textIdentifier + ".");
         return false;
       }


    if ( (emptyAllowed) & (inputStringValue == "")){
         // Ok, Si SI se permite que el campo sea vacío y el campo es vacio,
         // entonces retorno TRUE porque se permite que sea vacio y lo es!!
         return true;
       }



    posOfComillaSimple = inputStringValue.indexOf("'");
   // Verifico que el email NO tenga la comilla simple
   if (posOfComillaSimple > -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo se permiten comillas simples.");
     inputField.focus();
     return false;
   }


    posOfComa = inputStringValue.indexOf(",");
   // Verifico que el email NO tenga COMAS
   if (posOfComa > -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo se permiten comas.");
     inputField.focus();
     return false;
   }


    posOfPuntoYComa = inputStringValue.indexOf(";");
   // Verifico que el email NO tenga COMAS
   if (posOfPuntoYComa > -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo se permiten los caracteres 'punto y coma'.");
     inputField.focus();
     return false;
   }

    posOfSpace = inputStringValue.indexOf(" ");
   // Verifico que el email NO tenga espacios en blanco!
   if (posOfSpace > -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo se permiten espacios en blanco en las direcciones de correo electrónico.");
     inputField.focus();
     return false;
   }

   // Ahora paso a validar el email que supuestamente debe haber en el campo input recibido

   posOfArrobaChar = inputStringValue.indexOf('@');
   // Verifico que el email tenga el @
   if (posOfArrobaChar == -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nLe falta el carácter '@'");
     inputField.focus();
     return false;
   }


   // Verifico que el email tenga un nombre de usuario delante de la @
   if (posOfArrobaChar == 0){
     alert ("El valor de " + textIdentifier + " no es válido.\nLe falta el nombre de usuario delante de la '@'");
     inputField.focus();
     return false;
   }



   stringAfterArroba = trim(inputStringValue.substring(posOfArrobaChar + 1,inputStringValue.length));


   posOfArrobaCharAfterPrimeraArroba = stringAfterArroba.indexOf('@');
   // Verifico que el email NO tenga un @ después de la primera @, es decir, más de una @
   if (posOfArrobaCharAfterPrimeraArroba > -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo puede tener más de un carácter '@'");
     inputField.focus();
     return false;
   }



   posOfPointAfterArrobaChar = stringAfterArroba.indexOf('.');
   // Verifico que el email tenga al menos un punto despues de la @
   if (posOfPointAfterArrobaChar == -1){
     alert ("El valor de " + textIdentifier + " no es válido.\nDebe tener al menos un punto ('.') después de la '@'");
     inputField.focus();
     return false;
   }

   // Verifico que el email tenga al menos algun texto entre el punto despues de la @ y la @ misma
   if (posOfPointAfterArrobaChar == 0){
     alert ("El valor de " + textIdentifier + " no es válido.\nLe falta el nombre del servidor de correo entre el '@' y el punto ('.') ");
     inputField.focus();
     return false;
   }


   lastCharOfStringAfterArroba = stringAfterArroba.substring(stringAfterArroba.length-1,stringAfterArroba.length);

   // Verifico que el último caracter del email NO SEA UN PUNTO
   if (lastCharOfStringAfterArroba == "."){
     alert ("El valor de " + textIdentifier + " no es válido.\nNo puede terminar en un punto ('.') ");
     inputField.focus();
     return false;
   }


 return true;



}




// ********************  Validación de un campo TEXTO recibiendo además una cadena descriptiva!
//
// Recibe:   Permite validar campos INPUT TEXT de Textos en formularios
// inputField     --el objeto Input Text del formulario
// emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
// TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

// Retorna:  boolean correspondiente a si ha sido validado correctamente el campo recibido!

function validateTextInputField (inputField,
                                    emptyAllowed,
                                    textIdentifier ){


    // Tomo la cadena que contiene el texto del Input recibido!
    inputStringValue = trim(inputField.value);


     posOfComillaSimple = inputStringValue.indexOf("'");
    // Verifico que el campo recibido NO tenga la comilla simple
    if (posOfComillaSimple > -1){
      alert ("El valor de " + textIdentifier + " no es válido.\nNo se permiten comillas simples.");
      inputField.focus();
      return false;
    }


    if ( (!emptyAllowed) & (inputStringValue == "")){
         // Si NO se permite que el campo sea vacío y el campo es vacio,
         // entonces HAY PROBLEMAS, por lo que saco una ventana de error y retorno false!
         alert ("Debe suministrar " + textIdentifier + ".");
         inputField.focus();
         return false;
       }

   return true;

}


// ********************  Validación de un campo TEXTO recibiendo además una cadena descriptiva!
//
// Recibe:   Permite validar campos INPUT TEXT de Textos en formularios
// inputField     --el objeto Input Text del formulario
// emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
// TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

// Retorna:  boolean correspondiente a si ha sido validado correctamente el campo recibido!

function validateTextInputFieldEnglish (inputField,
                                    emptyAllowed,
                                    textIdentifier ){

    // Tomo la cadena que contiene el texto del Input recibido!
    inputStringValue = trim(inputField.value);


    if ( (!emptyAllowed) & (inputStringValue == "")){
         // Si NO se permite que el campo sea vacío y el campo es vacio,
         // entonces HAY PROBLEMAS, por lo que saco una ventana de error y retorno false!
         alert ("The value for " + textIdentifier + " cannot be empty.");
         inputField.focus();
         return false;
       }

   return true;

}



// ********************  Validación de un campo numérico DECIMAL solamente recibiendo además una cadena descriptiva!
//
// Recibe:   Permite validar INPUT TEXT de formularios solo para valores ENTEROS dado un rango de valores!
// inputField     --el objeto Input Text del formulario
// emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
// zeroAllowed    --un boolean indicando true si se permite que en el campo se introduzca el valor CERO, y false si el campo NO Puede ser cero!
// minAllowed     --valor numérico mínimo que se le permite tomar a este campo!
// maxAllowed     --valor numérico mínimo que se le permite tomar a este campo!
// TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

// Retorna:  boolean correspondiente a si ha sido validado correctamente el campo recibido!

function validateNumericDecimalInputField  (inputField,
                                    emptyAllowed,
                                    zeroAllowed,
                                    minAllowed,
                                    maxAllowed,
                                    textIdentifier ){

    var numDecimalPattern = /^[.1234567890]+$/g;


    // Tomo la cadena que contiene el texto del Input recibido!
    inputStringValue = trim(inputField.value);




      if ( (emptyAllowed) & (inputStringValue == "")){
         // Si se permite que el campo sea vacío y el campo es vacio,
         // entonces OK, no hay problema, retorno TRUE y ademas...

         // OJO; si además se permite que tome valor CERO, LE ASIGNO CERO al INPUT !!!!!
         if (zeroAllowed){

             inputField.value = "0";
          }

        return true;

      }


      if ( (!emptyAllowed) & (inputStringValue == "")){
           // Si no se permite que el campo sea vacio y ES vacio entonces ERROR!
           alert("Debe introducir " + textIdentifier + ".");
           inputField.focus();
           return false;
      }



        // Validar si tiene un formato numérico valido!


      if( !inputStringValue.match (numDecimalPattern)){
           alert ("El valor de " + textIdentifier + ", no tiene un formato numérico válido.");
           inputField.focus();
           return false;
      }


    // Tomo el valor de tipo Entero de lo que se ha introducido en el Input
    integerValue = parseInt(inputField.value);


        if ((!zeroAllowed) & (integerValue == 0)) {
           alert ("El valor de " + textIdentifier + " no puede ser cero.");
           inputField.focus();
           return false;
         }

        if (integerValue < minAllowed) {
           alert ("El valor de " + textIdentifier + " no puede ser menor que " + minAllowed);
           inputField.focus();
           return false;
         }

        if (integerValue > maxAllowed) {
           alert ("El valor de " + textIdentifier + " no puede ser mayor que " + maxAllowed);
           inputField.focus();
           return false;
         }

    // si se llega al final quiere decir que se ha validado correctamente!
    // entonces le asigno al valor del INPUT, su valor sin LOS ESPACIOS EN BLANCO delante y detras !

    inputField.value = inputStringValue;  // Notese que al inicio de aqui, se hizo: inputStringValue = trim(inputField.value);
    return true;

 }







// ********************  Validación de un campo numérico ENTERO solamente recibiendo además una cadena descriptiva!
//
// Recibe:   Permite validar INPUT TEXT de formularios solo para valores ENTEROS dado un rango de valores!
// inputField     --el objeto Input Text del formulario
// emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
// zeroAllowed    --un boolean indicando true si se permite que en el campo se introduzca el valor CERO, y false si el campo NO Puede ser cero!
// minAllowed     --valor numérico mínimo que se le permite tomar a este campo!
// maxAllowed     --valor numérico mínimo que se le permite tomar a este campo!
// TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

// Retorna:  boolean correspondiente a si ha sido validado correctamente el campo recibido!

function validateNumericIntegerInputField  (inputField,
                                    emptyAllowed,
                                    zeroAllowed,
                                    minAllowed,
                                    maxAllowed,
                                    textIdentifier ){


    var numIntegerPattern = /^[1234567890]+$/g;


    // Tomo la cadena que contiene el texto del Input recibido!
    inputStringValue = trim(inputField.value);




      if ( (emptyAllowed) & (inputStringValue == "")){
         // Si se permite que el campo sea vacío y el campo es vacio,
         // entonces OK, no hay problema, retorno TRUE y ademas...

         // OJO; si además se permite que tome valor CERO, LE ASIGNO CERO al INPUT !!!!!
         if (zeroAllowed){

             inputField.value = "0";
          }

        return true;

      }


      if ( (!emptyAllowed) & (inputStringValue == "")){
           // Si no se permite que el campo sea vacio y ES vacio entonces ERROR!
           alert("Debe introducir " + textIdentifier + ".");
           inputField.focus();
           return false;
      }



        // Validar si tiene un formato numérico valido!

      if( !inputStringValue.match (numIntegerPattern)){
           alert ("El valor de " + textIdentifier + ", no tiene un formato numérico correcto.\nSólo se permite incluir números. No se permiten letras, espacios en blanco, puntos, comas, etc....");
           inputField.focus();
           return false;
      }


    // Tomo el valor de tipo Entero de lo que se ha introducido en el Input
    integerValue = parseInt(inputField.value);


        if ((!zeroAllowed) & (integerValue == 0)) {
           alert ("El valor de " + textIdentifier + " no puede ser cero.");
           inputField.focus();
           return false;
         }

        if (integerValue < minAllowed) {
           alert ("El valor de " + textIdentifier + " no puede ser menor que " + minAllowed);
           inputField.focus();
           return false;
         }

        if (integerValue > maxAllowed) {
           alert ("El valor de " + textIdentifier + " no puede ser mayor que " + maxAllowed);
           inputField.focus();
           return false;
         }

    // si se llega al final quiere decir que se ha validado correctamente!
    // entonces le asigno al valor del INPUT, su valor sin LOS ESPACIOS EN BLANCO delante y detras !

    inputField.value = inputStringValue;  // Notese que al inicio de aqui, se hizo: inputStringValue = trim(inputField.value);
    return true;

 }




 // ********************  Validación de un campo numérico ENTERO solamente recibiendo además una cadena descriptiva!
 //
 // Recibe:   Permite validar INPUT TEXT de formularios solo para valores ENTEROS dado un rango de valores!
 // inputField     --el objeto Input Text del formulario
 // emptyAllowed   --un boolean indicando true si se permite que el campo sea VACIO, false si el campo tiene que tomar valores!
 // zeroAllowed    --un boolean indicando true si se permite que en el campo se introduzca el valor CERO, y false si el campo NO Puede ser cero!
 // minAllowed     --valor numérico mínimo que se le permite tomar a este campo!
 // maxAllowed     --valor numérico mínimo que se le permite tomar a este campo!
 // TextIdentifier --Cadena con el texto que describe este campo INPUT. Se toma para emitir los mensajes de errores por tanto debe ser algo como "la cantidad de personas que viven en la casa" para el INPUT correspondiente!

 // Retorna:  boolean correspondiente a si ha sido validado correctamente el campo recibido!

 function validateNumericIntegerInputFieldInEnglish  (inputField,
                                     emptyAllowed,
                                     zeroAllowed,
                                     minAllowed,
                                     maxAllowed,
                                     textIdentifier ){


     var numIntegerPattern = /^[1234567890]+$/g;


     // Tomo la cadena que contiene el texto del Input recibido!
     inputStringValue = trim(inputField.value);




       if ( (emptyAllowed) & (inputStringValue == "")){
          // Si se permite que el campo sea vacío y el campo es vacio,
          // entonces OK, no hay problema, retorno TRUE y ademas...

          // OJO; si además se permite que tome valor CERO, LE ASIGNO CERO al INPUT !!!!!
          if (zeroAllowed){

              inputField.value = "0";
           }

         return true;

       }


       if ( (!emptyAllowed) & (inputStringValue == "")){
           // Si no se permite que el campo sea vacio y ES vacio entonces ERROR!
           alert(textIdentifier + "cannot be empty.");
           inputField.focus();
           return false;
       }



        // Validar si tiene un formato numérico valido!


       if( !inputStringValue.match (numIntegerPattern)){
           alert ( textIdentifier + ", does not have a valid numeric format.");
           inputField.focus();
           return false;
       }


     // Tomo el valor de tipo Entero de lo que se ha introducido en el Input
     integerValue = parseInt(inputField.value);


        if ((!zeroAllowed) & (integerValue == 0)) {
           alert ( textIdentifier + " cannot be zero.");
           inputField.focus();
           return false;
         }

        if (integerValue < minAllowed) {
           alert ( textIdentifier + " cannot be lower than " + minAllowed);
           inputField.focus();
           return false;
         }

        if (integerValue > maxAllowed) {
           alert ( textIdentifier + " cannot be higher than " + maxAllowed);
           inputField.focus();
           return false;
         }

     // si se llega al final quiere decir que se ha validado correctamente!
     // entonces le asigno al valor del INPUT, su valor sin LOS ESPACIOS EN BLANCO delante y detras !

     inputField.value = inputStringValue;  // Notese que al inicio de aqui, se hizo: inputStringValue = trim(inputField.value);
     return true;

  }



 //////////////////////////////////////////////////////////////////////
 //
 // Esta función elimina los espacios en blanco al principio y al final
 // de la cadena de caracteres pasada como parámetros. By Sergio!
 //
 //////////////////////////////////////////////////////////////////////

 function trim (cadena) {
        // Quitamos los espacios en blanco de delante y detrás de la cadena.
        cadena = cadena.replace (/^\s+/, '');
        cadena = cadena.replace (/\s+$/, '');

        return cadena;
 }





//////////////////////////////////////////////////////////////////////
//
// Esta función recibe un valor numerico y devuelve una cadena
// con el valor numerico redondeado a dos decimales!
//
//////////////////////////////////////////////////////////////////////

  function getRoundedString (n) {
    n = Math.round(n * 100) / 100;
    n = (n + 0.001) + '';
    return n.substring(0, n.indexOf('.') + 3);
  }


  ////////////////////////////////////////////////////////////////////
  //
  // Parametros:
  // selectObject:  elemento de tipo SELECT de un formulario
  // matchString:   Cadena que con el texto a buscar en el selectObject
  //
  // Esta función recibe un elemento SELECT de un formulario, y una CADENA
  // y realiza una búsqueda en LAS OPTIONS DEL SELECT y marca como
  // SELECTED= true a la OPTION cuyo VALUE sea igual a la cadena recibida
  //
  ////////////////////////////////////////////////////////////////////
  function doMatchSelectWithString(selectObject, matchString){

    // Tomo de una vez, la cadena sin espacios para no tener que quitarle los espacios en cada pregunta del "if" en el ciclo a continuación!
    trimmedMatchString = trim(matchString);

    for (i = 0; i < selectObject.options.length; i++){
     if (trim(selectObject.options[i].value) == trimmedMatchString){
      selectObject.options[i].selected = true;
      //Aqui en el primero que me encuentre, salgo!
      return true;
     }

    }


    selectObject.options[0].selected = true;
    return false;

  }




// /////////////////////////////////////////////////*
//    VALIDAR UNA FECHA!!


function fechaEsValida (diaInput, mesInput, anioInput, textoNombreFormularioParaMensaje){

        var dia  = trim(diaInput.value);
        var mes  = trim(mesInput.value);
        var anio = trim(anioInput.value);

// ********************   DIA

        if (dia == ""){
                alert("Debe introducir el dia de " + textoNombreFormularioParaMensaje);
                diaInput.focus();
                return false;
        }else {

                  dia = parseInt(dia);

                  if ( (dia <= 0) || (dia > 31)){
                         alert ("El dia de la fecha de "+ textoNombreFormularioParaMensaje + " debe estar entre 1 y 31.");
                         diaInput.focus();
                         return false;
                      }


           }

// ********************   MES

        if (mes ==""){
                alert("Debe introducir el mes de " + textoNombreFormularioParaMensaje);
                mesInput.focus();
                return false;
        }else {

                  mes = parseInt(mes);
                  if ( (mes <= 0) || (mes > 12)){
                         alert ("El mes de la fecha de "+ textoNombreFormularioParaMensaje +"  debe estar entre 1 y 12. ");
                         mesInput.focus();
                         return false;
                      }


           }

// ********************   AÑO
        if (anio ==""){
                alert("Debe introducir el año de " + textoNombreFormularioParaMensaje);
                anioInput.focus();
                return false;
        }else {

                   anio = parseInt(anio);

                  if (anio <= 0) {
                         alert ("El año de "+ textoNombreFormularioParaMensaje + " debe ser al menos un valor positivo.");
                         anioInput.focus();
                         return false;
                      }


           }


       // *********** OJO, ahora valido que los dias no sean mayores que la cantidad
       // de dias que admite el mes seleccionado!
       // Valido que Febrero no tenga mas de 29 dias y que ademas si el dia es 31,
       // entonces el mes no puede ser [4,6,9,11] !!
       if ( ((dia > 29) && (mes == 2))        ||
            ((dia == 31) && (  (mes==4 || mes==6 || mes==9 || mes==11 ) ))    ){

          alert ("En la fecha de " + textoNombreFormularioParaMensaje + ", el mes "+ mes + " no es valido que tenga "+ dia + " dias. ");
          diaInput.focus();
          return false;

       }


// Si se llega al final, es que la fecha recibida es válida asi que se devuelve true!!!
return true;

}





//////////////////////////////////////////////////////////////////////
//
// Esta función recibe una CADENA con un valor (supuestamente) numérico
// y devuelve una cadena  con el valor numerico redondeado
// a dos decimales!
//
//////////////////////////////////////////////////////////////////////

  function getRoundedStringFromString (stringContainingANumber) {

   // Calculo el valor numérico que tiene la cadena recibida!
    var numericValue = parseFloat(trim(stringContainingANumber));

    numericValue = Math.round(numericValue * 100) / 100;
    numericValue = (numericValue + 0.001) + '';

    return numericValue.substring(0, numericValue.indexOf('.') + 3);

  }



//////////////////////////////////////////////////////////////////////
//
// Esta función Añade a favoritos la pagina inicial de esta web!
//
//////////////////////////////////////////////////////////////////////
function addToFavorites_english() {

  if (document.all){
     window.external.AddFavorite("http://www.SePermuta.com", "SePermuta.com");
   }
   else{

    alert("Sorry. Netscape users must bookmark the pages manually by hitting <Ctrl- D>.");

    }

 }

function addToFavorites_espanol() {
  if (document.all){
     window.external.AddFavorite("http://www.SePermuta.com", "SePermuta.com");
   }
   else{

    alert("Perdone, con el navegador Netscape debe añadir la pagina manualmente tecleando <Ctrl- D>.");

    }

 }




function getSelectedValueOfRadio(radioElement) {
  if (radioElement[0]){
     for (i = 0; i <  radioElement.length; i++){

       if (radioElement[i].checked){

         valueSelected = radioElement[i].value;

       }

     }
   }
   else{

    valueSelected = radioElement.value;

    }

    return valueSelected;

 }






/////////////////////
function deleteOptionsFromSelectStartingAt(selectObject, startingIndexToErase){
// VSU 11 sept 2003. Esta funcion recibe un objeto SELECT y elimina del mismo todos sus OPTIONS a partir del indice que se reciba como argumento

   if ((selectObject != null) && (selectObject.options != null)) {
      while (selectObject.options.length > startingIndexToErase) {
        selectObject.options[startingIndexToErase] = null;
      }
    }
}


 // VSU 30 dic 2002. Esta funcion recibe un objeto SELECT y elimina del mismo todos sus OPTIONS
 function deleteAllOptionsInSelect(selectItem){

   if ((selectItem != null) && (selectItem.options != null)) {
      while (selectItem.options.length) {
        selectItem.options[0] = null;
      }
    }
}



// cloneSelectItem recibe dos elementos SELECT de un formulario y lo que hace es clonar uno de ellos, es decir, le crea al select Destino, un OPTION exactamente igual por cada OPTION que está presente en el SELECT Source!
// NOTA, solo se está asumiendo que cada OPTION tiene los atributos: value, name y text.
function cloneSelectItem(selectSource, selectDest){

    // Elimino todos los OPTIONS que tiene el selectDest para crearle los nuevos OPTIONS que son copia de los options del selectSource
    deleteAllOptionsInSelect(selectDest);

    if ((selectSource != null) && (selectSource.options != null)) {
       for (i = 0; i < selectSource.options.length; i++){

             // creo el option [i] en el select destino!
            selectDest.options[selectDest.options.length ] = new Option();

            //Se asignan los siguientes atributos al option que se ha creado en el select destino.
            selectDest[i].value = selectSource[i].value;
            selectDest[i].name = selectSource[i].name;
            selectDest[i].text = selectSource[i].text;

            selectDest[i].selected = selectSource[i].selected;
         }// for
    } //if

}





  function getIndexOfMatchingOptionInSelectWithStringByName(selectObject, matchString){


    // Tomo de una vez, la cadena sin espacios y la llevo a mayusculas para no tener que quitarle los espacios en cada pregunta del "if" en el ciclo a continuación!
    trimmedUpCaseMatchString = (trim(matchString)).toUpperCase();

    for (i = 0; i < selectObject.options.length; i++){

      if ((trim(selectObject.options[i].name)).toUpperCase() == trimmedUpCaseMatchString){
       return i;
      }
    }
    return -1;
  }




  // Recibe dos elementos SELECT de un formulario y una cadena para que sea el VALUE del OPTION que se le va a añadir a este SELECT !
  function addElementToSelectItem(selectObject, valueAttribute, nameAttribute){

      newOptionToAdd = new Option(valueAttribute);
      newOptionToAdd.value = valueAttribute;
      newOptionToAdd.text  = valueAttribute;
      newOptionToAdd.name  = nameAttribute

      selectObject.options[selectObject.options.length ] = newOptionToAdd;

}




// Abre la ventana con el URl recibido como argumento y el ancho y el alto de la ventana a mostrar
function abrirVentana(url, windowName, ancho, alto){

   parameters = "width="+ ancho + ",height="+alto+", left=200, top=200, location=0, menubar=0,status=0,scrollbars=1";

   wnd = window.open(url, windowName, parameters);
   wnd.opener = self;


}




// Va a devolver el indice del primer OPTION que esté seleccionado en el SELECT que se ha recibido como argumento. Si no hay ningun OPTION seleccionado se devuelve -1
  function getIndexOfFirstSelectedOptionInSelect(selectObject){

    for (i = 0; i < selectObject.options.length; i++){

      if (selectObject.options[i].selected){
       //Aqui en el primero que me encuentre seleccionado, lo retorno y salgo!
       return i;
       } //if

    } //for


    // Si llego al final quiere decir que no se ha encontrado NINGUN option seleccionado asi que devuelvo -1
    return -1;

  }



// Va a devolver la cantidad de OPTIONS que estén seleccionado
  function cantOfSelectedOptionsInSelect(selectObject){

    cant = 0;
    for (i = 0; i < selectObject.options.length; i++){

      if (selectObject.options[i].selected){
         cant++;
       } //if

    } //for

    return cant;

 }



// OJO, esta función va a recibir una cadena y va a quitarle ciertos caracteres que no me interesan como las comillas dobles, las comillas simples...etc...
function getStringWithoutGarbage(stringToClean) {

    stringToClean = getReplacedString("\"","",stringToClean);
    stringToClean = getReplacedString("'","",stringToClean);

    return stringToClean;

}




// *******  Abre la ventana de la informacion pasándole como argumento el texto a mostrar y el ancho y el alto de la ventana a mostrar
function abrirVentanaInformacionPopUp(ancho, alto, mensajeID){

   url = "informacion_pop_up_e.asp?mensajeID=" + mensajeID;
   windowName = "informacionPopUp";
   abrirVentana(url, windowName, ancho, alto);
}









// *******  Validar un select Multiple teniendo en cuenta que se debe seleccionar al menos una option!
function myValidateMultipleSelect(selectObject, campoName, finalTextForError){

  if (selectObject == null){
    return false;
  }

  indexOfFirstSelectedOption = getIndexOfFirstSelectedOptionInSelect(selectObject);

  if (indexOfFirstSelectedOption == -1){
    selectObject.focus();
    alert("Debe seleccionar al menos la primera opción del campo '" + campoName + "'\n " + finalTextForError +  ".");
    return false;
  }


  cantOfSelectedOptions = cantOfSelectedOptionsInSelect(selectObject);

  //Pregunto si el primer option seleccionado es el PRIEMRO, y si además hay otros Options seleccionados, entonces es error porque se debe seleccionar el primero unicamente o cualquier otro sin seleccionar el primero!
  if ((indexOfFirstSelectedOption == 0) && (cantOfSelectedOptions > 1)){
      selectObject.focus();
      alert("Si desea especificar un valor en el campo '" + campoName + "' no será posible seleccionar la primera opción '--cualquiera--'.\nDeberá seleccionar esta primera opción únicamente para indicar que este campo en cuestión le es indiferente. En caso contrario, podrá seleccionar cualquier otra opción, o varias de ellas.");
      return false;
  }

  //Si llego al final ok!
  return true;

}



// Recibe una cadena y devuelve los dos ultimos caracteres de esta cadena
function getLastTwoCharsOfString(stringObject, filler){

  stringObject = "" + stringObject;

  if ((stringObject == null) || (stringObject.length == 0)){
   return "";
  }

  //Le añado dos caracteres fillers recibidos
  stringObject = "" + filler + filler + stringObject;


    return stringObject.charAt(stringObject.length-2) + stringObject.charAt(stringObject.length-1);

}






function getStringPrefijoYearMonthDayHourMinuteSeconds(){

  var today = new Date();

  // Tomo en variables el dia mes y año de la fecha actual!
  var year  = today.getYear() + "";
  var month = (today.getMonth() + 1) + "";
  var day   = today.getDate() + "";

  var hours   = today.getHours() + "";
  var minutes = today.getMinutes() + "";
  var seconds = today.getSeconds() + "";


  //Tomar los dos ultimos caracteres de cada campo...
  year  = getLastTwoCharsOfString(year, "0");
  month = getLastTwoCharsOfString(month, "0");
  day   = getLastTwoCharsOfString(day, "0");

  hours = getLastTwoCharsOfString(hours, "0");
  minutes = getLastTwoCharsOfString(minutes, "0");
  seconds = getLastTwoCharsOfString(seconds, "0");


  return year + month + day + "_" + hours + minutes + seconds;

}



function isValidBrowserForMe(){

browserName = navigator.appName;
shortBrowserName = browserName.substring(0, 9);

//ANTES USABA ESTO..navigator.javaEnabled()

  //De Momento solo garantizo que todo salga bien con Opera o IE !
  if ( (shortBrowserName == "Microsoft") || (shortBrowserName == "Opera") || (shortBrowserName == "Netscape")) {

      return true;

  }else{

    return false;

  }

}


//Lo que hace es DESmarcar todos los options del select recibido!
function deselectAllOptionsInSelect(selectObject){

    for (i = 0; i < selectObject.options.length; i++){
      selectObject.options[i].selected = false;
    } //for

}



// Returns true if the string stringToFind is found in the given Array.
function stringIsFoundInArray(stringToFind, arrayObject){



  if (arrayObject != null){

    // I do a Trim of the String to search only once out here...
    trimmedStringToFind = trim(stringToFind);

    for (iA = 0; iA < arrayObject.length; iA++){

      if (trimmedStringToFind == trim(arrayObject[iA])) {
        return true;
      }

    }// end for

  }// end if

  // If I reach the end of the function, it means teh string was not found in the given Array!
  return false;
}



// This function receives two Select Objects and intends to Switch their selected values
function doSwitchSelectedValuesInSelect(firstSelectObject, secondSelectObject){

   initialFirstSelectedIndex = firstSelectObject.options.selectedIndex;
   initialSecondSelectedIndex = secondSelectObject.options.selectedIndex;

   doMatchSelectWithString(firstSelectObject,  secondSelectObject.options[initialSecondSelectedIndex].value);
   doMatchSelectWithString(secondSelectObject, firstSelectObject.options[initialFirstSelectedIndex].value);


}