﻿//**********************************************************************
//*     FUNCIONES JAVASCRIPT PARA FONÉTICA DE LA PALABRA               *
//*                                                                    *
//*     Jesús Quílez Bielsa. Grupo Palladium 2005 MECD                 *
//**********************************************************************

var lcifrado1=false
var cidioma="latín"
var cgrupos=""
var cgrulat1=";ph;th;ch;"
var cgrulat0=";ff;zz;jj;"
var cgruesp1=";ll;ch;"
var cgruesp0=";çç;$$;"
var cvocales1="aeiouáéíóúàèìòùâêîôûv"
var cvocales0="aeiouaeiouaeiouaeiouu"
var cconsonantes1="bcdfghjklmnñpqrstxyz"
var cconsonantes0="bkdfg jklmnñpkrstxyz"
var coclusivas="ptcqkbvdgmnñ"
var cfricativas="fjz"
var cdiplat=";ae;oe;au;"
var cdipesp=";;"
var cdiptongos=""
var ncontador=0
var cnasales="mnñ"
var cafricadas="çñy"
var cletsil=new Array()

function leer(){
   cidioma="latín"
   lcifrado1=true
   ctexto=document.pregunta.T1.value.toUpperCase()
   nuevapal=creapalabra(ctexto)
   cdts=""
   nacento=acentualatin(nuevapal)
   for (nlet=1;nlet<=nuevapal.numsil;++nlet){
    if (nlet>1){cdts=cdts+"-"}
    if (nlet==nacento){cdts=cdts+nuevapal.silabas[nlet].forma.toUpperCase()}
    else {cdts=cdts+nuevapal.silabas[nlet].forma}
    }
document.pregunta.T2.value=cdts
if (nuevapal.numsil>1){
   cexp="Es "+nuevapal.acento
   if (nuevapal.razonacento>""){
      cexp=cexp+" por "+nuevapal.razonacento
      }
   }
else {
     cexp="Los monosílabos no se acentúan normalmente"
     }

   numfon=nuevapal.numfon
   cexp=cexp+"\r\nSonido : /"
   for (nfon=1;nfon<=numfon;++nfon){
       cexp=cexp + nuevapal.fonemas[nfon].fonema
    }
    cexp=cexp+"/"

document.pregunta.ta00.value=cexp
}



function deletrea(grafia){
   letra=new oletra()
   mgrafia=grafia.toLowerCase()
   if (mgrafia != grafia){letra.mayus=true}
   letra.forma=mgrafia
   nposfon=estaen(cvocales1+cconsonantes1,mgrafia)
   if (nposfon>-1){letra.esletra=true}
   return letra
}

function hazvocal(palabra,grafia){
   nposfon=estaen(cvocales1,grafia)
   if (nposfon>-1){
     fonema = new ofonema()
     if (lcifrado1){
        if (nposfon>14){fonema.cantidad="larga"}
        if (nposfon>9 && nposfon<14){fonema.tonica=true}
        if (nposfon>4 && nposfon<9){fonema.tonica=true;fonema.cantidad="larga"}
        }
     fonema.vocal=true
     fonema.grafia=grafia
     fonema.fonema=cvocales0.substring(nposfon,nposfon+1)
     if (fonema.fonema=="a"){fonema.grado="abierta";fonema.posicion="central"}
     if (fonema.fonema=="e"){fonema.grado="media";fonema.posicion="anterior"}
     if (fonema.fonema=="i"){fonema.grado="cerrada";fonema.posicion="anterior"}
     if (fonema.fonema=="o"){fonema.grado="media";fonema.posicion="posterior"}
     if (fonema.fonema=="u"){fonema.grado="cerrada";fonema.posicion="posterior"}
     nfonact=palabra.numfon+1
     palabra.fonemas[nfonact]=fonema
     palabra.numfon=nfonact
     }
}

function hazconsonante(palabra,grafia){
   fonema = new ofonema()
   fonema.grafia=grafia
   nposfon=estaen(cconsonantes1,grafia)
   if (nposfon>-1){
      cfonema=cconsonantes0.substring(nposfon,nposfon+1)
      fonema.fonema=cfonema
      fonema.cons=true
      nposfon=estaen(coclusivas,cfonema)
      if (nposfon>-1){
         fonema.modo="oclusiva"
         if (nposfon>4){
             fonema.sonora=true
         }
      }
      if (estaen(cfricativas,cfonema)>-1){fonema.modo="fricativa"}
      if (estaen(cafricadas,cfonema)>-1){fonema.modo="africada"}
      if (estaen(cnasales,cfonema)>-1){fonema.nasal=true}
      if (cfonema=="l"){fonema.modo="liquida";fonema.sonora=true;fonema.apoya=true}
      if (cfonema=="r"){fonema.modo="vibrante";fonema.sonora=true;fonema.apoya=true}
      if (cfonema=="s"){fonema.modo="silbante";fonema.sonora=true}
   }
   else {
        nposfon=estaen(cgrulat1,grafia)
        if (nposfon>-1){
          fonema.grafia=grafia
          cfonema=cgrulat0.substring(nposfon,nposfon+1)
          fonema.fonema=cfonema
          fonema.cons=true
          fonema.modo="fricativa"
        }
   }
  nfonact=palabra.numfon+1
  palabra.fonemas[nfonact]=fonema
  palabra.numfon=nfonact
}

function hazfon(palabra,grafia){
if (esvocal(grafia)){hazvocal(palabra,grafia)}
else {hazconsonante(palabra,grafia)}
}

function hazfons(palabra){
   nlettot=palabra.numlet
   ngrupo=0
   cgrafia=""
   nposini=1
   nposact=1
   nposfin=nlettot

   while (nposact<nposfin){
         cgrupia=palabra.letras[nposact].forma+palabra.letras[nposact+1].forma
         cgrafia=palabra.letras[nposact].forma
         if (esgrupo(cgrupia)){hazfon(palabra,cgrupia);nposact=nposact+2}
         else {hazfon(palabra,cgrafia);nposact=nposact+1}
   }
   cgrafia=palabra.letras[nposact].forma
   hazfon(palabra,cgrafia)
   //nlettot=palabra.numfon
   //for (nletact=1;nletact<=nlettot;++nletact){
   //    alert(palabra.letras[nletact].forma+" "+palabra.fonemas[nletact].fonema)
   //}
}

function separasilabas(palabra,nposicion){
   silaba=new osilaba()
   npossil=palabra.numsil
   nfonemas=palabra.numfon
   nposfon=0
   cforma=""
   cfonema=""
   ccontexto=""
   ncontexto=0
   nfonsil=0
   ninisil=0
   nfinsil=0
   nnvapos=0
   ccar6=""
   for (nfonact=nposicion;nfonact<=nfonemas;++nfonact){
       ncontexto++
       if (palabra.fonemas[nfonact].cons){
          if (palabra.fonemas[nfonact].apoya){
             if (ncontexto<6){ccontexto=ccontexto+"r"}
             if (ncontexto==6){ccar6="r"}
          }
          else {
                if (ncontexto==6){ccar6="c"}
                else {
                     if (palabra.fonemas[nfonact].fonema=="s"){
               	        ccontexto=ccontexto+"s"
               	     }
                     else {
                        if (palabra.fonemas[nfonact].fonema=="n"){
               	           ccontexto=ccontexto+"n"
               	        }
                        else {
                            if (palabra.fonemas[nfonact].grafia=="q"){
                   	           ccontexto=ccontexto+"q"
                   	        }
                            else {
                                 ccontexto=ccontexto+"c"
                                 }
                             }
                     }
                }
        }
       }
       else {
            if (ncontexto<6){ccontexto=ccontexto+palabra.fonemas[nfonact].fonema}
            if (ncontexto==6){ccar6="a"}
            }
       if (ncontexto==6){break}
   }
   cprivoc=primeravocal(ccontexto)
   ccontexto1=ccontexto

   ccontexto=cambiacadena(ccontexto,"ae","a")
   ccontexto=cambiacadena(ccontexto,"oe","a")
   ccontexto=cambiacadena(ccontexto,"au","a")

   if (ccontexto < ccontexto1){ccontexto=ccontexto+ccar6}

   ccontexto=cambiacadena(ccontexto,"e","a")
   ccontexto=cambiacadena(ccontexto,"o","a")

   if (estaen(ccontexto,"ia")==0){ccontexto=cambiacadena(ccontexto,"ia","ca")}
   if (estaen(ccontexto,"aia")>0){ccontexto=cambiacadena(ccontexto,"aia","aca")}
   if (estaen(ccontexto,"ua")==0){ccontexto=cambiacadena(ccontexto,"ua","ca")}
   if (estaen(ccontexto,"iu")==0){ccontexto=cambiacadena(ccontexto,"iu","ca")}
   if (estaen(ccontexto,"aua")>0){ccontexto=cambiacadena(ccontexto,"aua","aca")}
   if (estaen(ccontexto,"qua")>-1){ccontexto=cambiacadena(ccontexto,"qua","qra")}

   ccontexto=cambiacadena(ccontexto,"i","a")
   ccontexto=cambiacadena(ccontexto,"u","a")

   nposdob=estaen(ccontexto,"aa")
   if (nposdob>-1){
      ccontexto=cambiacadena(ccontexto,"aa","a")
      ccontexto=ccontexto+ccar6
   }

   //alert(ccontexto)

   if (estaen(ccontexto,"sca")==0){ccontexto=cambiacadena(ccontexto,"sca","cra")}
   if (estaen(ccontexto,"csa")>-1){ccontexto=cambiacadena(ccontexto,"csa","cra")}
   if (estaen(ccontexto,"acs")>-1){ccontexto=cambiacadena(ccontexto,"acs","arc")}
   if (estaen(ccontexto,"csc")>-1){ccontexto=cambiacadena(ccontexto,"csc","rcc")}
   if (estaen(ccontexto,"ansc")>-1){ccontexto=cambiacadena(ccontexto,"ansc","arcc")}
   if (estaen(ccontexto+";","anc;")>-1){ccontexto=cambiacadena(ccontexto,"anc","arc")}
   if (estaen(ccontexto+";","cs;")>-1){ccontexto=cambiacadena(ccontexto,"cs","rc")}

   ccontexto=cambiacadena(ccontexto,"s","c")
   ccontexto=cambiacadena(ccontexto,"n","c")
   ccontexto=cambiacadena(ccontexto,"q","c")

   //alert(ccontexto)

   sillat122=";accac;accar;carac;carar;rarac;rarar;cacac;cacar;carac;arrac;carar;racac;racar;racra;cacra;cara;rara;caca;cara;raca;acca;arra;"
   sillat133=";caccr;cacca;carra;crara;craca;crarac;cracar;carca;carcr;arcca;racca;caccc;arcc;"
   sillat144=";crarc;crarr;cracc;cracr;carcc;"
   sillat140=";crar;crac;carc;arrc;"
   sillat130=";rac;cra;car;cac;arc;"
   sillat120=";ar;ac;ca;ra;"
   sillat111=";acrac;acrar;acaca;arara;acarr;acacc;acara;acac;acar;arac;aca;ara;"
   sillat110=";a;"

   if (estaen(sillat122,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=2;nnvapos=nposicion+2}
   if (estaen(sillat133,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=3;nnvapos=nposicion+3}
   if (estaen(sillat144,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=4;nnvapos=nposicion+4}
   if (estaen(sillat140,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=4;nnvapos=0}
   if (estaen(sillat130,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=3;nnvapos=0}
   if (estaen(sillat120,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=2;nnvapos=0}
   if (estaen(sillat111,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=1;nnvapos=nposicion+1}
   if (estaen(sillat110,";"+ccontexto+";")>-1){
      ninisil=1;nfinsil=1;nnvapos=0}

   //alert(ccontexto)

   if (nposdob>-1){
      if (nposdob==0){
         nfinsil=1;nnvapos=2
      }
      else{
           if (nposdob<nfinsil){
              nfinsil=nposdob+1
              nnvapos=nposicion+nfinsil
           }
      }
   }

   if (esdiptongo(cprivoc)){
      nfinsil++
      if (nnvapos !=0){nnvapos++}
   }

   //alert(ninisil+" "+nfinsil+" "+nnvapos)
   if (ninisil>0){
     for (nfonsil=ninisil;nfonsil<=nfinsil;++nfonsil){
         ++nposfon
         nfonemapalabra=(nfonsil-1)+nposicion
         palabra.fonemas[nfonemapalabra]
         silaba.fonemas[nposfon]=nfonemapalabra
         if (esdiptongo(cprivoc)){silaba.diptongo=cprivoc}
         cforma=cforma+palabra.fonemas[nfonemapalabra].grafia
         cfonema=cfonema+palabra.fonemas[nfonemapalabra].fonema
     }
     //alert("Forma :"+cforma+" Fonema: "+cfonema+" Empezar en: "+ nnvapos)
     silaba.forma=cforma
     silaba.numfon=nfinsil
     if (esconsonante(palabra.fonemas[nfonemapalabra].grafia)){silaba.trabada=true}
     if (esconsonante(cforma.substring(0,1))){
        silaba.consonante=cforma.substring(0,1)
        }
     nsilact=palabra.numsil+1
     palabra.silabas[nsilact]=silaba
     palabra.numsil=nsilact
     //alert(palabra.silabas[nsilact].fonemas+" "+palabra.silabas[nsilact].numfon)
   }

   return nnvapos
}

function creapalabra(cadena){
   if (cidioma=="latín"){cdiptongos=cdiplat}
   nuevo=new opalabra()
   nlettot=cadena.length
   nuevo.numlet=nlettot
   nletras=0
   for (nletact=1;nletact<=nlettot;++nletact){
       cletra=cadena.substring(nletact-1,nletact)
       letra=deletrea(cletra)
       if (letra.esletra){
          nletras++
          nuevo.letras[nletact]=letra
          nuevo.numlet=nletras
       }
   }
   hazfons(nuevo)
   nsilabanueva=separasilabas(nuevo,1)
   ncontador=0
   while (nsilabanueva>0 && ncontador<10){
         nsilabanueva=separasilabas(nuevo,nsilabanueva)
         ncontador++
   }
   return nuevo
}

function infosilaba(silaba){
   cinfo=silaba.forma+": "
   if (silaba.trabada){cinfo=cinfo+"Sílaba trabada"}
   if (silaba.consonante !=""){cinfo=cinfo+". Empieza por "+silaba.consonante}
   cinfo=cinfo+" Contiene "+silaba.numfon+" foenema(s)"
   return cinfo
}

function essilabalarga(palabra,nsilaba){
   nlarga=0
   if (largaensilaba(palabra,nsilaba)>0){nlarga=1;palabra.razonacento="tener una vocal larga por naturaleza"}
   if (palabra.silabas[nsilaba].diptongo>""){nlarga=2;palabra.razonacento="contener un diptongo"}
   if (palabra.silabas[nsilaba].trabada){nlarga=3;palabra.razonacento="ser sílaba trabada"}
   return nlarga
}

function acentualatin(palabra){
   nsilac=0
   nsiltot=palabra.numsil
   if (nsiltot==1){nsilac=0}
   if (nsiltot==2){nsilac=1;palabra.razonacento="tener sólo dos sílabas"}
   if (nsiltot>2){
      if (essilabalarga(palabra,nsiltot-1)>0){
         nsilac=nsiltot-1
         }
      else {nsilac=nsiltot-2}
   }
   if (nsilac>0){
      palabra.silabas[nsilac].tonica=true
      if (nsilac==palabra.numsil){palabra.acento="aguda"}
      if (nsilac==palabra.numsil-1){palabra.acento="llana"}
      if (nsilac==palabra.numsil-2){palabra.acento="esdrújula"}
      }
   return nsilac
}

function largaensilaba(palabra,nsilaba){
   nlargaensilaba=0
   nfontot=palabra.silabas[nsilaba].numfon
   for (nfonact=1;nfonact<=nfontot;nfonact++){
       if (palabra.fonemas[palabra.silabas[nsilaba].fonemas[nfonact]].cantidad=="larga"){
          nlargaensilaba=nfonact
          break
       }
   }
   return nlargaensilaba
}

function finsilaba(palabra,nsilaba){
   nfontot=palabra.silabas[nsilaba].numfon
   cfinal=palabra.fonemas[palabra.silabas[nsilaba].fonemas[nfontot]].grafia
   return cfinal
}

function verpalabra(palabra){
   nsiltot=palabra.numsil
   cpalabra=""
   for (nsilact=1;nsilact<=nsiltot;++nsilact){
        cpalabra=cpalabra+palabra.silabas[nsilact].forma
   }
   return cpalabra
}

function actualizasilaba(palabra,nsilaba){
   nfontot=palabra.silabas[nsilaba].numfon
   cforma=""
   for (nfonact=1;nfonact<=nfontot;++nfonact){
       cforma=cforma+palabra.fonemas[palabra.silabas[nsilaba].fonemas[nfonact]].grafia
   }
   palabra.silabas[nsilact].forma=cforma
}

//Funciones Simples

function esgrupo(grafia,idioma){
  if (cidioma=="latín"){cgrupos=cgrulat1}
  if (cidioma=="castellano"){cgrupos=cgrulat1}
  if (estaen(cgrupos,";"+grafia+";")>-1){return true}
  else {return false}
}

function esvocal(grafia){
   if (estaen(cvocales1,grafia)>-1){return true}
   else {return false}
}

function esdiptongo(grafia){
   if (estaen(cdiptongos,";"+grafia+";")>-1){return true}
   else {return false}
}


function esconsonante(grafia){
   if (estaen(cconsonantes1,grafia)>-1){return true}
   else {return false}
}

function esoclusiva(fonema){
   if (estaen(coclusivas,fonema)>-1){return true}
   else {return false}
}

function primeravocal(cadena){
   nletras=cadena.length
   nprimera=-1
   cprimera=""
   csegunda=""
   for (nletact=0;nletact<nletras;nletact++){
       cletra=cadena.substring(nletact,nletact+1)
       if (cprimera>"" && nletact==nprimera+1){
          if (estaen(cdiptongos,";"+cprimera+cletra+";")>-1){csegunda=cletra;break}
       }
       else {
         if (nprimera==-1){
            if (estaen(cvocales1,cletra)>-1){cprimera=cletra;nprimera=nletact}
            }
       }
   }
   return (cprimera+csegunda)
}

//Objetos y Clases

function oletra(){
   this.mayus=false
   this.forma=""
   this.esletra=false
}

function ofonema(){
   this.mayus=false
   this.vocal=false
   this.cons=false
   this.cantidad=""
   this.tonica=false
   this.grado=""
   this.posicion=""
   this.modo=""
   this.sonora=false
   this.nasal=false
   this.semivocal=false
   this.apoya=false
   this.grafia=""
   this.fonema=""
}

function osilaba(){
   this.fonemas=new Array()
   this.numfon=0
   this.tonica=false
   this.trabada=false
   this.consonante=""
   this.diptongo=""
   this.forma=""
   this.cantidad=""
}

function opalabra(){
   this.letras=new Array()
   this.fonemas=new Array()
   this.silabas=new Array()
   this.acento=""
   this.razonacento=""
   this.numlet=0
   this.numfon=0
   this.numsil=0
   this.silact=0
   this.estado=0
}



