/*ORIGINAL EN : WWW/EDITMAKER/TRATA_ESPECIALES.JS*/
function trataEspeciales(texto,comillas) {
    window.status = "...Tratando caracteres especiales"
    resul = ""
    for (i=0; i<texto.length; i++)
        switch(texto.charCodeAt(i)) {
            case 96:
            case 8218:
            case 39: if(comillas){resul += "&#39;"} else {resul += "\""}; break;   //'
            case 8222:
            case 34: if(comillas){resul += "&#34;"} else {resul += "\""}; break;   //"
            case 8216:   //estilo simple abiertas
            case 8217:   //estilo simple cerradas
            case 8220:   //estilo doble abiertas
            case 8221:   //estilo doble cerradas
            case 225 :    //á
            case 233 :    //é
            case 237 :    //í
            case 243 :    //ó
            case 250 :    //ú
            case 252 :    //ü
            case 241 :    //ñ
            case 193 :    //Á
            case 201 :    //É
            case 205 :    //Í
            case 211 :    //Ó
            case 218 :    //Ú
            case 220 :    //Ü
            case 209 :    //Ñ
            case 191 :    //¿
            case 161 :    //¡
            case 8364 : resul += "&#" + texto.charCodeAt(i) + ";"; break; //€
            default  : resul += texto.charAt(i); break;
        }
    return(resul)
}

/*Revisa que los parámetros pasados a la búsqueda sean correctos.
Parámetros:
- cad_area: Objeto que contiene la cadena
- modo: 1 == por palabras
        2 == por frase completa
- tam_vec: Parámetro de salida: número de palabras en cad_area*/
function protege_busqueda1(cad_area,modo,tam_vec) {
   //Mira que la cadena tenga por lo menos 4 caracteres
   if(cad_area.value.length<4) {
      alert("Cadena no válida. Tamaño mínimo: 4 caracteres.")
      return false
   }
   //Mira que, en caso de haber seleccionado búsqueda por fechas, las fechas sean válidas.
   if(document.opbus.q_edicion[1].checked) {
      if (!fechaOk(document.opbus.fecha1.value)) return false;
      if (!fechaOk(document.opbus.fecha2.value)) return false;
   }
   ok = true
   //Quita palabras comunes si la búsqueda es por palabras
   if(modo[0].checked) //la búsqueda es por palabras
      ok = filtra_palabras0(cad_area)
   else if(modo[1].checked) //la búsqueda es completa
      ok = filtra_palabras1(cad_area)
   if (ok) {
      //Cambia letras con tilde, eñes, ues con diéresis, etc. por su correspondiente código.
      cad_area.value = trataEspeciales(cad_area.value,true)
      //Cuenta cuántos bloques debe procesar.
      cuenta_palabras(cad_area,tam_vec)
   }
   return ok
}

/*Revisa que los parámetros pasados a la búsqueda pequeña sean
correctos. Es una sobrecarga de la función anterior.
Parámetros:
- cad_area: Objeto que contiene la cadena
- tam_vec: Parámetro de salida: número de palabras en cad_area*/
function protege_busqueda2(cad_area,tam_vec) {
   //Mira que la cadena tenga por lo menos 4 caracteres
   if(cad_area.value.length<4) {
      alert("Cadena no válida. Tamaño mínimo: 4 caracteres.")
      return false
   }
   ok = true
   //Quita palabras comunes si la búsqueda es por palabras
   ok = filtra_palabras0(cad_area)
   if (ok) {
      cad_area.value = trataEspeciales(cad_area.value,true)
      cuenta_palabras(cad_area,tam_vec)
   }
   return ok
}

/*Cuenta número de palabras en una cadena , y lo guarda en el objeto
oculto pasado como parámetro.*/
function cuenta_palabras(obj_cadena,obj_hidden) {
   cad = obj_cadena.value
   tam=0
   if (cad.length>0) {
      for (i=0; i<cad.length; i++)
         if (cad.charAt(i) == ' ') tam++
      tam++
   }
   obj_hidden.value = tam
}

/*Elimina palabras comunes de una cadena*/
function elimina_palabras_comunes(cad) {
   //Paso todo a minúsculas
   cad = cad.toLowerCase();
   //Quito signos de puntuación
   cad = cad.replace(/,{1,}/g, " ")       //,
   cad = cad.replace(/\.{1,}/g, " ")      //.
   cad = cad.replace(/;{1,}/g, " ")       //;
   cad = cad.replace(/¿{1,}/g, " ")       //¿
   cad = cad.replace(/\?{1,}/g, " ")      //?
   cad = cad.replace(/\*{1,}/g, " ")      //asterisco
   cad = cad.replace(/\+{1,}/g, " ")      //+
   cad = cad.replace(/\/{1,}/g, " ")      //barra

   //Quito espacios blancos innecesarios, usando una expresión regular
   cad = cad.replace(/\s{2,}/g, " ") //Adaptado de: http://www.devguru.com/Technologies/ecmascript/quickref/regexp_special_characters.html
   cad = cad.replace(/^\s/,"") //quito primer espacio blanco si lo hay
   cad = cad.replace(/\s$/,"") //quito último espacio blanco si lo hay

   cad = " " + cad + " "
   //Quito palabras comunes
   cad = cad.replace(/\sa\s{1,}/g, " ")       //a
   cad = cad.replace(/\sal\s{1,}/g, " ")      //al
   cad = cad.replace(/\sante\s{1,}/g, " ")    //ante
   cad = cad.replace(/\sademas\s{1,}/g, " ")  //ademas
   cad = cad.replace(/\sademás\s{1,}/g, " ")  //además
   cad = cad.replace(/\saun\s{1,}/g, " ")     //aun
   cad = cad.replace(/\saún\s{1,}/g, " ")     //aún
   cad = cad.replace(/\scabe\s{1,}/g, " ")    //cabe
   cad = cad.replace(/\scada\s{1,}/g, " ")    //cada
   cad = cad.replace(/\scomo\s{1,}/g, " ")    //como
   cad = cad.replace(/\scómo\s{1,}/g, " ")    //cómo
   cad = cad.replace(/\scon\s{1,}/g, " ")     //con
   cad = cad.replace(/\scual\s{1,}/g, " ")    //cual
   cad = cad.replace(/\scuando\s{1,}/g, " ")  //cuando
   cad = cad.replace(/\scuándo\s{1,}/g, " ")  //cuándo
   cad = cad.replace(/\sde\s{1,}/g, " ")      //de
   cad = cad.replace(/\sdel\s{1,}/g, " ")     //del
   cad = cad.replace(/\sdesde\s{1,}/g, " ")   //desde
   cad = cad.replace(/\sdonde\s{1,}/g, " ")   //donde
   cad = cad.replace(/\sdónde\s{1,}/g, " ")   //dónde
   cad = cad.replace(/\se\s{1,}/g, " ")       //e
   cad = cad.replace(/\sel\s{1,}/g, " ")      //el
   cad = cad.replace(/\sella\s{1,}/g, " ")    //ella
   cad = cad.replace(/\sellos\s{1,}/g, " ")   //ellos
   cad = cad.replace(/\sél\s{1,}/g, " ")      //él
   cad = cad.replace(/\sen\s{1,}/g, " ")      //en
   cad = cad.replace(/\ses\s{1,}/g, " ")      //es
   cad = cad.replace(/\sesa\s{1,}/g, " ")     //esa
   cad = cad.replace(/\sese\s{1,}/g, " ")     //ese
   cad = cad.replace(/\sesta\s{1,}/g, " ")    //esta
   cad = cad.replace(/\sestá\s{1,}/g, " ")    //está
   cad = cad.replace(/\sestas\s{1,}/g, " ")   //estas
   cad = cad.replace(/\sestás\s{1,}/g, " ")   //estás
   cad = cad.replace(/\seste\s{1,}/g, " ")    //este
   cad = cad.replace(/\sestés\s{1,}/g, " ")   //estés
   cad = cad.replace(/\sesto\s{1,}/g, " ")    //esto
   cad = cad.replace(/\sestos\s{1,}/g, " ")   //estos
   cad = cad.replace(/\sfue\s{1,}/g, " ")     //fue
   cad = cad.replace(/\sfué\s{1,}/g, " ")     //fué
   cad = cad.replace(/\sha\s{1,}/g, " ")      //ha
   cad = cad.replace(/\shan\s{1,}/g, " ")     //han
   cad = cad.replace(/\shas\s{1,}/g, " ")     //has
   cad = cad.replace(/\shay\s{1,}/g, " ")     //hay
   cad = cad.replace(/\she\s{1,}/g, " ")      //he
   cad = cad.replace(/\shemos\s{1,}/g, " ")   //hemos
   cad = cad.replace(/\sir\s{1,}/g, " ")      //ir
   cad = cad.replace(/\sla\s{1,}/g, " ")      //la
   cad = cad.replace(/\slas\s{1,}/g, " ")     //las
   cad = cad.replace(/\sle\s{1,}/g, " ")      //le
   cad = cad.replace(/\slo\s{1,}/g, " ")      //lo
   cad = cad.replace(/\slos\s{1,}/g, " ")     //los
   cad = cad.replace(/\smas\s{1,}/g, " ")     //mas
   cad = cad.replace(/\smás\s{1,}/g, " ")     //más
   cad = cad.replace(/\sme\s{1,}/g, " ")      //me
   cad = cad.replace(/\smi\s{1,}/g, " ")      //mi
   cad = cad.replace(/\smí\s{1,}/g, " ")      //mí
   cad = cad.replace(/\sni\s{1,}/g, " ")      //ni
   cad = cad.replace(/\sno\s{1,}/g, " ")      //no
   cad = cad.replace(/\spara\s{1,}/g, " ")    //para
   cad = cad.replace(/\spero\s{1,}/g, " ")    //pero
   cad = cad.replace(/\spon\s{1,}/g, " ")     //pon
   cad = cad.replace(/\spor\s{1,}/g, " ")     //por
   cad = cad.replace(/\sporque\s{1,}/g, " ")  //porque
   cad = cad.replace(/\sque\s{1,}/g, " ")     //que
   cad = cad.replace(/\squé\s{1,}/g, " ")     //qué
   cad = cad.replace(/\squien\s{1,}/g, " ")   //quien
   cad = cad.replace(/\squién\s{1,}/g, " ")   //quién
   cad = cad.replace(/\sse\s{1,}/g, " ")      //se
   cad = cad.replace(/\ssé\s{1,}/g, " ")      //sé
   cad = cad.replace(/\sser\s{1,}/g, " ")     //ser
   cad = cad.replace(/\ssi\s{1,}/g, " ")      //si
   cad = cad.replace(/\ssí\s{1,}/g, " ")      //sí
   cad = cad.replace(/\ssu\s{1,}/g, " ")      //su
   cad = cad.replace(/\ssus\s{1,}/g, " ")     //sus
   cad = cad.replace(/\sun\s{1,}/g, " ")      //un
   cad = cad.replace(/\sson\s{1,}/g, " ")     //son
   cad = cad.replace(/\stanto\s{1,}/g, " ")   //tanto
   cad = cad.replace(/\sten\s{1,}/g, " ")     //ten
   cad = cad.replace(/\stu\s{1,}/g, " ")      //tu
   cad = cad.replace(/\stú\s{1,}/g, " ")      //tú
   cad = cad.replace(/\sun\s{1,}/g, " ")      //un
   cad = cad.replace(/\suna\s{1,}/g, " ")     //una
   cad = cad.replace(/\sva\s{1,}/g, " ")      //va
   cad = cad.replace(/\sy\s{1,}/g, " ")       //y
   cad = cad.replace(/\syo\s{1,}/g, " ")      //yo
   cad = cad.substr(1,cad.length-2) //quito los dos espacios puestos al principio y al final
   return cad
}


/*Filtra búsquedas demasiado costosas y/o maliciosas.
El parámetro txtarea es el objeto "input type=text" que contiene
la cadena de búsqueda.*/
function filtra_palabras0(txtarea) {
   cad = elimina_palabras_comunes(txtarea.value)
   txtarea.value=cad
   //mira si después del filtrado queda alguna palabra
   if (cad.length=0) {
      alert("El filtrado de palabras comunes eliminó todas las palabras.")
      return false
   }
   //cuenta el número de palabras que quedan
   trozos = cad.split(" ")
   if (trozos.length > 5) {
      alert("Demasiadas palabras. Intenta acotar tu búsqueda")
      return false
   }
   return true
}

/*Filtra búsquedas demasiado costosas y/o maliciosas si la búsqueda
es completa.
El parámetro txtarea es el objeto "input type=text" que contiene
la cadena de búsqueda.*/
function filtra_palabras1(txtarea) {
   cad = txtarea.value
   //Paso todo a minúsculas
   //Quito signos de puntuación
   cad = cad.replace(/,{1,}/g, " ")       //,
   cad = cad.replace(/\.{1,}/g, " ")      //.
   cad = cad.replace(/;{1,}/g, " ")       //;
   cad = cad.replace(/¿{1,}/g, " ")       //¿
   cad = cad.replace(/\?{1,}/g, " ")      //?
   cad = cad.replace(/\*{1,}/g, " ")      //asterisco
   cad = cad.replace(/\+{1,}/g, " ")      //+
   cad = cad.replace(/-{1,}/g, " ")       //-
   cad = cad.replace(/\/{1,}/g, " ")      //barra
   cad = cad.replace(/\"{1,}/g, " ")      //"
   cad = cad.replace(/\'{1,}/g, " ")      //'

   //Quito espacios blancos innecesarios, usando una expresión regular
   cad = cad.replace(/\s{2,}/g, " ") //Adaptado de: http://www.devguru.com/Technologies/ecmascript/quickref/regexp_special_characters.html
   cad = cad.replace(/^\s/,"") //quito primer espacio blanco si lo hay
   cad = cad.replace(/\s$/,"") //quito último espacio blanco si lo hay

   //mira si después del filtrado queda alguna palabra
   if (cad.length<1) {
      alert("El filtrado eliminó todas las palabras.")
      return false
   }

   txtarea.value = cad
   return true
}

function fechaOk(f){
   if(f.length<8 || f.length>10) { alert("La fecha no tiene una longitud correcta");return false; }
   //Expresión regular que reconoce cualquier caracter que no sea un dígito o "/"
   rexp = /[^\d\/]/gi
   if(rexp.test(f)) { alert("La fecha contiene caracteres extraños");return false; }
   partes = f.split("/")
   dia = parseInt(partes[0],10);
   mes = parseInt(partes[1],10);
   ano = parseInt(partes[2],10);
   if (dia<1 || dia>31) { alert("Día inválido (" + dia + ")"); return false; }
   if (mes<1 || mes>12) { alert("Mes inválido (" + mes + ")"); return false; }
   if (ano<1700 || ano>2100) { alert("Año inválido (" + ano + ")"); return false; }
   return true;
}

