var asteriscarcursor=false;
var eliminarcursor=true;
var transferirokcode=false;
var standalone=true;
var macropuesta=false;

var codigomacrosinclude="** BI compactor at http://bic.cranf.net ********************************\ndefine bd. PERFORM bdc_dynpro USING &1 &2. end-of-definition.\n*\ndefine bf. PERFORM bdc_field USING &1 &2. end-of-definition.\n************************************************************************\n";

var codigomacros="** BI compactor at http://bic.cranf.net ********************************\ndefine bprepare.\n data bdcdata like table of bdcdata with header line.\n data messtab like table of bdcmsgcoll with header line.\n refresh bdcdata. refresh messtab.\nend-of-definition.\n*\ndefine bd.\n clear bdcdata. bdcdata-program  = &1. bdcdata-dynpro   = &2.\n bdcdata-dynbegin = 'X'. append bdcdata.\nend-of-definition.\n*\ndefine bf.\n clear bdcdata. bdcdata-fnam = &1. bdcdata-fval = &2.\n append bdcdata.\nend-of-definition.\n************************************************************************\n";

var espacio = "                                                                                                                                                         ";

function actualizabotonera()
{
q="<table cellspacing=0><tr>";
if(standalone)
	{q+="<td class='par2 pab2'><input class=botonon type=button value='stand-alone macros' onclick='standalone=false;compacta();actualizabotonera()' title='active: the macros do not need to include bdcrecx1'></td>";}
	else
	{q+="<td class='par2 pab2'><input class=botonoff type=button value='stand-alone macros' onclick='standalone=true;compacta();actualizabotonera()' title='inactive: the current macros code needs bdcrecx1'></td>";}
if(transferirokcode)
	{q+="<td class='par2 pab2'><input class=botonon type=button value='okcode shifting' onclick='transferirokcode=false;compacta();actualizabotonera()' title='active: the OK_CODE is located at the beginning of the next dynpro block'></td>";}
	else
	{q+="<td class='par2 pab2'><input class=botonoff type=button value='okcode shifting' onclick='transferirokcode=true;compacta();actualizabotonera()' title='inactive: the OK_CODE is located at the end of its current dynpro'></td>";}

q+="<td class='pab2' rowspan=2><input class=boton style='height:35px;font-size:16px;font-weight:bolder;' type=button value='compact!' onclick='compacta()' title='(re)generates the compacted code'></td>";
q+='</tr><tr>';

if(asteriscarcursor)
	{q+="<td class='par2 pab2'><input class=botonon type=button value='comment cursor' onclick='asteriscarcursor=false;compacta();actualizabotonera()' title='active: BDC_CURSOR sentences are commented'></td>";}
	else
	{q+="<td class='par2 pab2'><input class=botonoff  type=button value='comment cursor' onclick='asteriscarcursor=true;if(eliminarcursor==true)eliminarcursor=false;compacta();actualizabotonera()' title='inactive: BDC_CURSOR sentences are uncommented'></td>";}
if(eliminarcursor)
	{q+="<td class='par2 pab2'><input class=botonon  type=button value='remove cursor' onclick='eliminarcursor=false;compacta();actualizabotonera()'  title='active: BDC_CURSOR sentences are removed'></td>";}
	else
	{q+="<td class='par2 pab2'><input class=botonoff  type=button value='remove cursor' onclick='eliminarcursor=true;asteriscarcursor=false;compacta();actualizabotonera()' title='inactive: BDC_CURSOR sentences are not removed'></td>";}

q+="</tr></table>";
document.getElementById("botonera").innerHTML=q;
}

function multireplace(base,uno,otro){while(base.indexOf(uno)!=-1) base=base.replace(uno,otro);return base;}

var bloques=new Array();
function bloque(contenido,indice)
{
//construcción
this.contenido=contenido;
this.indice=indice;
//otros
this.dynpro=false;
this.bdctrans=false;
this.fields=null;
this.okcode=null;

//método: ver el contenido de cada bloque
this.trace=function(){alert(this.contenido);}

//método: desglosar bloques de llamada de dynpro en componentes
this.desglosa=function()
	{
	if(this.contenido.substring(0,3)=='bd ') //si es un bloque de dynpro
		{
		this.dynpro=true;
		this.fields=this.contenido.split(".\n");

		//transformamos datos individuales
		for(j=0;j<this.fields.length;j++)
			{
			//añadimos un punto
			this.fields[j]+=".";
			//cambiamos el perform por la macro
			this.fields[j]=this.fields[j].replace(/perform bdc_field using/gi,"bf");
			//eliminamos saltos de línea internos
			this.fields[j]=multireplace(this.fields[j],"\n","");

			//asteriscamos la posición de cursor
			if(asteriscarcursor && this.fields[j].indexOf('BDC_CURSOR')!=-1)
				{this.fields[j]="** "+this.fields[j];}
			//asteriscamos las subscreens
			if(asteriscarcursor && this.fields[j].indexOf('BDC_SUBSCR')!=-1)
				{this.fields[j]="* "+this.fields[j];}

			//eliminamos la posición de cursor
			if(eliminarcursor && this.fields[j].indexOf('BDC_CURSOR')!=-1)
				{this.fields[j]="VCBIC___ELIMINAR";}
			//eliminamos las subscreens
			if(eliminarcursor && this.fields[j].indexOf('BDC_SUBSCR')!=-1)
				{this.fields[j]="VCBIC___ELIMINAR";}

			//detectamos el OKCODE
			if(this.fields[j].indexOf('BDC_OKCODE')!=-1)
				{
				this.okcode=this.fields[j];
				this.fields[j]="VCBIC___ELIMINAR";
				}
			}

		//eliminamos los sobrantes que hayan
		for(j=0;j<this.fields.length;j++) if(this.fields[j]=="VCBIC___ELIMINAR") {this.fields.splice(j,1);j--;}
		for(j=0;j<this.fields.length;j++) if(this.fields[j]==".") {this.fields.splice(j,1);j--;}

		//retabulamos!!!
		this.maxlong=0;
		for(j=0;j<this.fields.length;j++)
			if(this.fields[j].substring(0,3)=='bd ' || this.fields[j].substring(0,3)=='bf ')
				if(this.fields[j].lastIndexOf("' ")>this.maxlong) this.maxlong = this.fields[j].lastIndexOf("' ");

		for(j=0;j<this.fields.length;j++)
			if(this.fields[j].substring(0,3)=='bd ' || this.fields[j].substring(0,3)=='bf ')
				{
				this.fldlong=this.fields[j].length;
				this.corte=this.fields[j].lastIndexOf("' ");
				this.espacios=this.maxlong-this.corte;
				this.fields[j]=this.fields[j].substring(0,this.corte+1)+espacio.substring(0,this.espacios+1)+this.fields[j].substring(this.corte+2,this.fldlong);
				}

		}

	if(this.contenido.toLowerCase().indexOf("bdc_transaction")!=-1) //si es el call transaction
		{
		this.bdctrans=true;
		if(standalone) // cambiamos el perform por un call
			{
			this.i1=this.contenido.indexOf("'")+1;
		    this.i2=this.contenido.lastIndexOf("'");
			this.transaction=this.contenido.substring(this.i1,this.i2);
			this.postbdctransaction=this.contenido.substring(this.i2+1);
			this.contenido="CALL TRANSACTION '"+this.transaction+"'\n  USING bdcdata MODE 'A' UPDATE 'L' MESSAGES INTO messtab"+this.postbdctransaction;
			}
		}
	}

this.recompone=function()
	{
	if(this.fields!=null)
		{
		this.contenido="";
		if(macropuesta==false)
			{
			macropuesta=true;
			this.contenido+=(standalone?"bprepare.\n":"");
			}

		this.contenido+="\n*** DYNPRO **********************\n";
		if(transferirokcode)
			if(this.okcode!=null) 
				{this.contenido+=this.okcode+"\n";}
		for(k=0;k<this.fields.length;k++)
			this.contenido+=this.fields[k]+"\n";
		if(!transferirokcode)
			if(this.okcode!=null) 
				{this.contenido+=this.okcode+"\n";}

		}
	if(this.bdctrans==true)
		{
		this.contenido="\n*** CALL TRANSACTION **********************\n"+(this.okcode!=null?this.okcode+"\n":"")+this.contenido;
		}
	}

}

function compacta()
{
//cargamos el original
codigooriginal=document.getElementById("original").value;
bloques=new Array();
//eliminamos los espacios sobrantes duplicados y al principio, así como saltos r
codigooriginal=multireplace(codigooriginal,"\r","");
codigooriginal=multireplace(codigooriginal,"  "," ");
while(codigooriginal.charAt(0)==" ") codigooriginal=codigooriginal.substring(1,codigooriginal.length);

//establecemos puntos de ruptura ante cada llamada de dynpro y ante la llamada a bdc_transaction
codigooriginal=codigooriginal.replace(/perform bdc_dynpro using/gi,"VCBIC___bd");
codigooriginal=codigooriginal.replace(/perform bdc_transaction using/gi,"VCBIC___PERFORM bdc_transaction USING");

//partimos el código original en bloques que instanciamos
cachitos=codigooriginal.split("VCBIC___");
for(i=0;i<cachitos.length;i++)
	bloques.push(new bloque(cachitos[i],i));

//analizamos los bloques individuales
for(i=0;i<bloques.length;i++)
	bloques[i].desglosa();

//movemos los okcodes de una dynpro a la siguiente
if(transferirokcode)
	for(i=bloques.length-1;i>0;i--)
		{
		if(bloques[i-1].okcode!=null)
			{
			bloques[i].okcode=bloques[i-1].okcode;
			bloques[i-1].okcode=null;
			}
		}

//los recomponemos
macropuesta=false;
for(i=0;i<bloques.length;i++)
	bloques[i].recompone();

//los volvemos a juntar
codigo="";
for(i=0;i<bloques.length;i++)
	codigo+=bloques[i].contenido;
if(standalone)//quitamos basura
{
codigo=codigo.replace(/include bdcrecx1./gi,"");
codigo=codigo.replace(/perform open_group./gi,"");
codigo=codigo.replace(/perform close_group./gi,"");
}
codigo=multireplace(codigo,"\n\n\n","\n\n");
document.getElementById("procesado").value=codigo;
loadmacro();
}

function loadmacro()
{
document.getElementById("lasmacros").value=(standalone?codigomacros:codigomacrosinclude);
}

function resetentrada()
{
document.getElementById("original").value="";
}

function resetsalida()
{
document.getElementById("procesado").value="";
}

function mailea()
{location.href="mailto:voe"+"t@cra"+"nf.net";}


function portapapeles(iden)
{
todo=document.getElementById(iden).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,iden);
}

function efectoespecialdecopia(iden)
{
t="fedcba9876543210";
for(i=0;i<16;i++)
	{p=t.substr(i,1);
	setTimeout("document.getElementById('"+iden+"').style.borderColor='#"+p+p+p+p+p+p+"';",25*i+100);
	}
}


function copy_clip(meintext,iden) //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("the browser config DOES NOT allow to copy data to clipboard using scripts:\n\navoid this limitation writing about:config in the URL field and activating (1 or true) the value\n\nsigned.applets.codebase_principal_support\n\nif you don't want to do this, simply select the generated code and copy it with 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(iden);
   return false;
}
