//               _       _         
// ___  ___ _ __(_)_ __ | |_       
/// __|/ __| '__| | '_ \| __|      
//\__ \ (__| |  | | |_) | |_       
//|___/\___|_|  |_| .__/ \__|      
//                |_|           
//                 _       _     _                   _       _           _                
//__   ____ _ _ __(_) __ _| |__ | | ___ ___     __ _| | ___ | |__   __ _| | ___ ___       
//\ \ / / _` | '__| |/ _` | '_ \| |/ _ \ __|   / _` | |/ _ \| '_ \ / _` | |/ _ \ __|      
// \ V / (_| | |  | | (_| | |_) | |  __/__ \  | (_| | | (_) | |_) | (_| | |  __/__ \      
//  \_/ \__,_|_|  |_|\__,_|_.__/|_|\___|___/   \__, |_|\___/|_.__/ \__,_|_|\___|___/      
//                                             |___/                                      
opcion=2;  //0espaciado, 4apretado
comentario=0; //0sin, 1linea,2bloque
comentariolinea='//';
comentariobloquebeg='/*';
comentariobloqueend='*/';

alfaspacio="s";
alfacontor="3"; //este es eliminado
alfacontoravance='4'; //este y el siguiente caracter es eliminado
alfacontorretro='2'; //este y el anterior caracter es eliminado
alfacontor2="$";
alfaancho=12;
//relación entre los caracteres y su posición ascii en alfabase: cada carácter separado por 12
alfaindex=' abcdefghijklmnopqrstuvwxyz0123456789áéíóúñü;.,:+-!¡?¿[]()*=%&$@#"`/\\><^{}_|ç~';
//matriz donde se almacena todo
alfamatriz=new Array()
//altura en caracteres de la fuente, para no tener que calcularla cada vez
alfaaltura=0;
//si se ve la regla o no
regla=false;


//                 _                  
// _ __ ___   ___ | |_ ___  _ __      
//| '_ ` _ \ / _ \| __| _ \| '__|     
//| | | | | | (_) | |_ (_) | |        
//|_| |_| |_|\___/ \__|___/|_|        
//                                    
function trim(str){return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');}


function iniciamatriz()
{
//estética del explorer
if(document.all) 
	{
	document.getElementById("contentrada").style.height=79;
	document.getElementById("selectlineacomen").style.height="19px";
	document.getElementById("selectlineabloque").style.height="19px";
	}

ltexto=document.getElementById("alfabase").value;
lmatriz=ltexto.split("\n");
for(i=0;i<lmatriz.length;i++)
	if(trim(lmatriz[i]+"")!="")
	 alfamatriz.push(lmatriz[i]+"");
alfaaltura=alfamatriz.length;

//completamos con espacios los finales de las frases para evitar extraños
longmax=0;
for(j=0;j<alfaaltura;j++)
	if(longmax<alfamatriz[j].length) longmax=alfamatriz[j].length;

for(j=0;j<alfaaltura;j++)
	{
	cap=longmax-alfamatriz[j].length;
	for(i=0;i<cap;i++)
		alfamatriz[j]+=" ";
	}

document.getElementById("selectlineacomen").value=comentariolinea;
document.getElementById("selectlineabloque").value="c";

pintaopcion();
pintacomentario();

refranero();
}

function refranero()
{
ref=new Array();
ran=new Array();
ref.push("no por mucho madrugar");
ran.push("amanece más temprano");

ref.push("quien a buen árbol se arrima");
ran.push("buena sombra le cobija");

ref.push("dime de qué presumes");
ran.push("y te diré de lo que careces");

ref.push("quien con niños se acuesta");
ran.push("meado se levanta");

ref.push("lo bueno, si breve,");
ran.push("dos veces bueno");

ref.push("contra el vicio de pedir");
ran.push("la virtud de no dar");

ref.push("cría cuervos");
ran.push("y te sacarán los ojos");

ref.push("el muerto al hoyo");
ran.push("y el vivo al bollo");

ref.push("en boca cerrada");
ran.push("no entran moscas");

ref.push("en el país de los ciegos");
ran.push("el tuerto es el rey");

opref=Math.floor(Math.random()*ref.length);
opran=Math.floor(Math.random()*ran.length);
document.getElementById("entrada").value=ref[opref]+"\n"+ran[opran];
botongenerar();
}

function replacepuntual(original,posicion,cambio)
{
original=original.substr(0,posicion)+cambio+original.substring(posicion+1);
return original;
}

function devuelveletra(letra)
{
retorno=new Array();
for(j=0;j<alfaaltura;j++) retorno[j]="";

if(letra=="'") letra="`";

lindex=alfaindex.indexOf(letra);

if(!isNaN(lindex))
	{
	//buscamos la letra en el reservorio, de ancho 12
	for(i=0;i<alfaaltura;i++)
		retorno[i]=alfamatriz[i].substr(lindex*alfaancho,alfaancho);

	//añadimos contorno al final
	for(i=0;i<alfaaltura;i++)
		for(j=alfaancho-1;j>=0;j--)
			{
			if(retorno[i].substr(j,1)!=" ") 
				{
				retorno[i]=replacepuntual(retorno[i],j+1,alfacontor);
				break;
				}
			if(j==0)
				retorno[i]=replacepuntual(retorno[i],j+2,alfacontor);
			}
	}
return retorno;
}

function generafrase(frase)
{
linea=new Array();
for(j=0;j<alfaaltura;j++) linea[j]="";

frase=frase.toLowerCase();

longfrase=frase.length;
for(n=0;n<longfrase;n++)
	{
	//recuperamos cada caracter de modo individual
	letraactual=frase.substr(n,1);
	caracter=devuelveletra(letraactual);

	if(n==0)
		{
		linc="";
		if(comentario==1) //es decir, comentario de línea
			linc=comentariolinea;

		for(j=0;j<alfaaltura;j++)
			linea[j]=linc+caracter[j];
		continue;
		} //si es la primera letra de la línea

	//y ahora toca casarlo con lo que ya tenemos; para ello comprobamos cuánto hemos de quitar de uno y de otro
	//hallando 1) la última posición de alfacontor en linea y 2) la primera ausencia de espacio en el caracter a añadir
	//tomaremos entonces la diferencia mínima
	poscontorno=new Array();
	precaracter=new Array();
	diferencia=new Array();
	for(j=0;j<alfaaltura;j++)
		{
		poscontorno[j]=linea[j].length-linea[j].lastIndexOf(alfacontor);
		for(i=0;i<alfaancho;i++)
			if(caracter[j].substr(i,1)!=" ") {precaracter[j]=i;break;}
		diferencia[j]=poscontorno[j]+precaracter[j];
		}

	minimadif=9999;
	for(j=0;j<alfaaltura;j++)
		if(minimadif>diferencia[j]) minimadif=diferencia[j];

	lopcion=opcion
	//en la opción 3 los caracteres se solaparán de 1en1 o de 2en2 según el número de diferencias iguales a la mínima
	//si la separación mínima es una ocurrencia escasa, se apretarán de 2en2: si es extendida, de 1en1
	if(opcion==3) 
		{
		ocurmin=0;
		for(j=0;j<alfaaltura;j++)
			if(minimadif==diferencia[j]) ocurmin++;
		if(ocurmin<=2) lopcion=4;
				else lopcion=2;
		}

	for(j=0;j<alfaaltura;j++)
			linea[j]=linea[j]+"            "; //para evitar extraños con letras muy anchas

	for(j=0;j<alfaaltura;j++)
		{ //aquí nos curramos el kerning según la opción elegida
			switch(lopcion)
			{
			case 0: //con un espacio intermedio
			linea[j]=linea[j].substring(0,linea[j].length-minimadif+1+precaracter[j]-12)+" "+caracter[j].substring(precaracter[j]);
			break;
			
			case 1: //sin espacios intermedios
			linea[j]=linea[j].substring(0,linea[j].length-minimadif+1+precaracter[j]-12)+caracter[j].substring(precaracter[j]);
			break;

			case 2: //solapando de 1 en 1
			linea[j]=linea[j].substring(0,linea[j].length-minimadif+1+precaracter[j]-12)+caracter[j].substring(precaracter[j]);
					lineacortada=linea[j].substring(0,linea[j].lastIndexOf(alfacontor));
					posi=lineacortada.lastIndexOf(alfacontor);
					if(lineacortada.substr(posi-1,1)!=alfaspacio)
						linea[j]=replacepuntual(linea[j],posi+1,alfacontor);
						else
						linea[j]=replacepuntual(linea[j],posi-1,alfacontor);
			break;
	
			case 3: //no existe: cuando se da, opción sólo puede valer 2 ó 4.
			break;

			case 4: //solapando, pero de 2 en 2
			linea[j]=linea[j].substring(0,linea[j].length-minimadif+1+precaracter[j]-12)+caracter[j].substring(precaracter[j]);
					lineacortada=linea[j].substring(0,linea[j].lastIndexOf(alfacontor));
					posi=lineacortada.lastIndexOf(alfacontor);
					if(lineacortada.substr(posi-1,1)!=alfaspacio)
						linea[j]=replacepuntual(linea[j],posi+1,alfacontor)
						else
						linea[j]=replacepuntual(linea[j],posi-1,alfacontor);

					if(lineacortada.substr(posi-2,1)!=alfaspacio)
						linea[j]=replacepuntual(linea[j],posi+1,alfacontoravance)
						else
						linea[j]=replacepuntual(linea[j],posi-1,alfacontorretro);

			break;
			}
		}
	}

linea=removecontor(linea)
linea=removeespacios(linea);
return linea;
}


function removecontor(matriz)
{
//eliminamos los contornos
for(i=0;i<alfaaltura;i++) 
	while(matriz[i].indexOf(alfacontor)!=-1)
		matriz[i]=matriz[i].replace(alfacontor,"");
//eliminamos los contornos de avance (el caracter y el siguiente)
for(i=0;i<alfaaltura;i++) 
	{
	posi=matriz[i].lastIndexOf(alfacontoravance);
	while(posi!=-1)
		{
		matriz[i]=matriz[i].substr(0,posi)+matriz[i].substring(posi+2);
		posi=matriz[i].lastIndexOf(alfacontoravance);
		}
	}
//eliminamos los contornos de retroceso (el caracter y el anterior)
for(i=0;i<alfaaltura;i++) 
	{
	posi=matriz[i].indexOf(alfacontorretro);
	while(posi!=-1)
		{
		matriz[i]=matriz[i].substr(0,posi-1)+matriz[i].substring(posi+1);
		posi=matriz[i].indexOf(alfacontorretro);
		}
	}
return matriz;
}

function removeespacios(matriz)
{
for(i=0;i<alfaaltura;i++) while(matriz[i].indexOf(alfaspacio)!=-1){matriz[i]=matriz[i].replace(alfaspacio," ")}
return matriz;
}

function imprimefrase(matriz)
{
contenido="";
for(i=0;i<alfaaltura;i++)
	contenido+=matriz[i]+"\n";
return contenido;
}

function generar(texto)
{
conten="";
lineas=texto.split("\n");
anchopix=0;

for(m=0;m<lineas.length;m++)
	{
	cadalinea=imprimefrase(generafrase(lineas[m]));
	lanchopix=cadalinea.length*5; //píxeles de ancho
		if(lanchopix>anchopix) anchopix=lanchopix;
	conten+=cadalinea;
	}

//el textarea debe redefinirse pues cada caracter son 5 píxeles de ancho
if(anchopix<976) anchopix=976;
document.getElementById("resultado").style.width=anchopix+100;
finalmente=(comentario==2?comentariobloquebeg+"\n":"")+conten+(comentario==2?"\n"+comentariobloqueend:"");
if(comentario==2){while(finalmente.indexOf("\n\n")!=-1) finalmente=finalmente.replace("\n\n","\n")}
document.getElementById("resultado").value=finalmente;
}

//                 _             _                
//  ___ ___  _ __ | |_ _ __ ___ | | ___ ___       
// / __| _ \| '_ \| __| '__| _ \| |/ _ \ __|      
//| (__ (_) | | | | |_| | | (_) | |  __/__ \      
// \___|___/|_| |_|\__|_|  \___/|_|\___|___/      
//                                                

function pintaopcion()
{
for(i=0;i<5;i++)
	{
	document.getElementById("op"+i).style.backgroundColor="#CFDACB"
	document.getElementById("op"+i).blur();
	}
document.getElementById("op"+opcion).style.backgroundColor="#84DA65";
}

function pintacomentario()
{
for(i=0;i<3;i++)
	{
	document.getElementById("co"+i).style.backgroundColor="#CCCBDA";
	document.getElementById("co"+i).blur();
	}
document.getElementById("co"+comentario).style.backgroundColor="#ACABFF";
}


function opciongenerar(valor)
{
opcion=valor;
pintaopcion();
botongenerar();
}

function comengenerar(valor)
{
comentario=valor;
pintacomentario();
botongenerar();
}

function comengenerarlinea()
{
comentariolinea=document.getElementById("selectlineacomen").value;
comengenerar(1);
}

function comengenerarbloque()
{
switch(document.getElementById("selectlineabloque").value)
	{
    case "c": 
			comentariobloquebeg="/*";
			comentariobloqueend="*/";
			break;
    case "html": 
			comentariobloquebeg="<!--";
			comentariobloqueend="-->";
			break;
    case "comillasdobles": 
			comentariobloquebeg='"'+'"'+'"';
			comentariobloqueend='"'+'"'+'"';
			break;
    case "comillastriples": 
			comentariobloquebeg="'"+"'"+"'";
			comentariobloqueend="'"+"'"+"'";
			break;
    case "beginend": 
			comentariobloquebeg="=begin";
			comentariobloqueend="=end";
			break;
    case "chino": 
			comentariobloquebeg="{-";
			comentariobloqueend="-}";
			break;
    case "lsd": 
			comentariobloquebeg="{*";
			comentariobloqueend="*}";
			break;
    case "llaves": 
			comentariobloquebeg="{";
			comentariobloqueend="}";
			break;
	}
comengenerar(2);
}	

function toggleregla()
{
if(regla)
	{
	document.getElementById("resultado").style.background="#ffffff";
	document.getElementById("botonregla").style.background="#E0DCB3";
	}
	else
	{
	document.getElementById("resultado").style.background="url(asciifondo.gif)";
	document.getElementById("botonregla").style.background="#F3E970";
	}
	document.getElementById("botonregla").blur()
regla=!regla;
}

function limpiaresultado()
{document.getElementById("resultado").value=""}

function limpiaentrada()
{document.getElementById("entrada").value="";}

function botongenerar()
{generar(document.getElementById("entrada").value);}

function portapapeles()
{
todo=document.getElementById("resultado").value;
while(todo.indexOf("\n")!=-1) todo=todo.replace("\n","fnarcteov");
while(todo.indexOf("fnarcteov")!=-1) todo=todo.replace("fnarcteov","\r\n");
copy_clip(todo);
}

function efectoespecialdecopia()
{

t="fedcba9876543210";
for(i=0;i<16;i++)
	{p=t.substr(i,1);
	setTimeout("document.getElementById('conteresultado').style.borderColor='#"+p+p+p+p+p+p+"';",25*i+100);
	}
}


function copy_clip(meintext) //genial función copiada de http://www.krikkit.net/howto_javascript_copy_clipboard.html
{
 if (window.clipboardData)   // the IE-manier
   {window.clipboardData.setData("Text", meintext);}
   else if (window.netscape) 
   { 
   // you have to sign the code to enable this, or see notes below 
	try{netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');}
	catch(e)
	{
	alert("la configuración de navegación del navegador\nNO permite realizar copias al portapapeles:\n\npara modificarla escriba about:config en la barra de URL\ny active a 1 ó true el valor\n\nsigned.applets.codebase_principal_support\n\nen caso de que no deseé o no pueda cambiar este valor,\nseleccione el texto generado y cópielo con ctrl+c");
	}

   // maak een interface naar het clipboard
   var clip = Components.classes['@mozilla.org/widget/clipboard;1']
                 .createInstance(Components.interfaces.nsIClipboard);
   if (!clip) return;
   
   // maak een transferable
   var trans = Components.classes['@mozilla.org/widget/transferable;1']
                  .createInstance(Components.interfaces.nsITransferable);
   if (!trans) return;
   
   // specificeer wat voor soort data we op willen halen; text in dit geval
   trans.addDataFlavor('text/unicode');
   
   // om de data uit de transferable te halen hebben we 2 nieuwe objecten 
   // nodig om het in op te slaan
   var str = new Object();
   var len = new Object();
   var str = Components.classes["@mozilla.org/supports-string;1"]
                .createInstance(Components.interfaces.nsISupportsString);
   var copytext=meintext;
   str.data=copytext;
   trans.setTransferData("text/unicode",str,copytext.length*2);
   var clipid=Components.interfaces.nsIClipboard;
   if (!clip) return false;
   clip.setData(trans,null,clipid.kGlobalClipboard);
   }
efectoespecialdecopia();
   return false;
}

function mailea()
{location.href="mailto:voe"+"t@cra"+"nf.net";}