//*** 
//*
//* @version 		1.0
//* @fecha 
//* @autor 
//* @ubicacion 
//* @dependecias 	

//


// Establece la cookie
var Outline = "";
var CheckerFUNCTION = "";
var FBdb = new Array();
var FBtotal = 1;
var FicTarget;
var Fgroup = new Array();

var NOTNULLlabel = '';

var WLABEL	= 120;
var WFIELD	= 350;
var FORMBORDER 	= 0;

function IE()
{
	
	return ( navigator.appName.indexOf ("Netscape") !=-1 ? false : true )
}


// se cargan del modulo utilidades.js
//function TextToHtml ( str )
//function HtmlToText ( str ) 




// Añade una nueva entrada
function addFBObject(field, type, label, value, size, check , explainer) {
  FBdb[FBtotal]	 	= new Object;
  FBdb[FBtotal].field 	= field;
  FBdb[FBtotal].type 	= typeof type=='undefined'? '' : type;
  FBdb[FBtotal].label 	= typeof label=='undefined'? '' : label;
  FBdb[FBtotal].value 	= typeof value=='undefined'? '' : value;
  FBdb[FBtotal].size 	= typeof size=='undefined'? '' : size;
  FBdb[FBtotal].check 	= typeof check=='undefined'? '' : check;
  FBdb[FBtotal].explainer 	= typeof explainer=='undefined'? '' : explainer;
  FBtotal++
  }



// Pasa los valores capturados por la ventana del selector a los campos del formulario
// Estos valores se pasan como argumentos. El primer valor tras lovid será el valor oculto ( el valor que realmente representa al campo)
// Los demas valores son de visualización y solo se utilizan para mostrarlos en el formulario pero no representan al campo
// P.ej. en un formulario donde se selecciona una persona el usuario verá en uno o varios campos el Nombre, apellidos, dirección etc (campos visibles)
// pero el campo que realmente se insertará en la tabla será el codigo de esa persona (campo oculto)
function FBaddValue (lovid)
{
	var form = document.forms[0];
	 
	 InitFormElement(form, lovid, arguments[1]);
	 for (var i=2; i<arguments.length; i++) 
	 {
		 var objname = lovid + 1*(i-2);
		 if (typeof form[objname]!='undefined')		 
		 	InitFormElement(form, objname, arguments[i]);
	 }

}

// Exite  una version para el selector de la anterior, llamada STsendLovValue incluida en selectTree.js
// Esta funcion va en el selector y no en el formulario por eso se llama tal cual desde el selector mientras
// que la anterior se llama opener.FBaddValue
// Hace exactamente lo mismo pero no es necesario indicar el lovid porque lo toma de URL del selector
// y las llamadas las realiza con los objetos del opener.
// Es decir   FBsendLovValue(p0,p1,p2)  <-->   opener.FBaddValue(lovid,p0,p1,p2)




// retorna con espacios (multiplos de 2) para indentar
function pad(n) {
  var result = ""
  for (var i = 1; i <= n; i++) { result += "&nbsp;&nbsp;&nbsp;&nbsp;" }
  return result
}




function CheckForm()
{
	
	var ERROR = false;
	
	eval ( CheckerFUNCTION  ) ;
	
	if (!ERROR ) 
	{
		document.forms[0].action = FORMACTION;
		if (USR_CheckForm())
			document.forms[0].submit();	
	}
}



// Esta funcion puede ser sobrecargada por el usuario para 
// realizar acciones antes del submit.
function USR_CheckForm()
{
	return true;
}


// Obtiene limite de caracteres que pueden ser introducidos en el campo
// si no hay limite lo deja en blanco
function getMaxlength( fobj )
{
	
	
	if ( fobj.check.match(/VARCHAR2\((.*)\)/ig)!=null )
		return RegExp.lastParen;
	
	if ( fobj.check.match(/VARCHAR2OR\((.*)\)/ig)!=null )
		return RegExp.lastParen;

	if ( fobj.check.match(/NUMBER\((.*)\)/ig)!=null )
		return RegExp.lastParen;
	
	if ( fobj.check.match(/DATE/ig)!=null )
		return 10;
		
return '';
	
}



// verifica una fecha

function checkDate ( fec, separador ) 
{
	

	if ( fec == '' ) return '';
	
	f = fec.split(separador);
	
	dia = 1*f[0];
	mes = 1*f[1];
	anno = 1*f[2];

	if ( isNaN(dia) || isNaN(mes) || isNaN (anno) )
		return ( 'La fecha ' + fec + ' no es correcta.' );

	if ( (mes==4 || mes==6 || mes==9 || mes==11) && dia>30 )
		 return  ( '' + fec + ' - El día no es correcto para ese mes.' );
	 
	 
	if ( mes==2 && dia>29)
		return ( '' + fec + ' - El día no es correcto para ese mes.' );
	
	if ( mes<1 || mes>12 ) 
		return ( '' + fec + ' - El mes no es correcto.' );
	
	if ( anno<100 ) 
		return ( '' + fec + ' - El año debe tener el formato aaaa.' );
	
return '';
}




// Genera la funcion de chequeo para los campos del formulario
function GenerateChecker( fobj, formname )
{
	
	formname = (typeof formname=='undefined') ? 'FBmain' : formname;
	label    = fobj.label.replace(/&nbsp;|<br>/g,' '); // esta conversion se realiza porque en el alert no se aceptan estos tags html
	
	NOTNULLlabel = '';
	
	if ( fobj.check.match(/NOT NULL/ig)!=null )
	{
		CheckerFUNCTION += 'if (!ERROR && ( GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '")=="" || GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '")==null ) ) { alert( "El campo [' + label + '] es obligatorio y debe contener algún valor."); ERROR=true;  }\n';
		
		NOTNULLlabel = '<font color=red> * </font>' ;
	
	}
	
	if ( fobj.check.match(/\bNUMBER\b/ig)!=null )
		CheckerFUNCTION += 'if (!ERROR &&  isNaN(GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '") ) ) { alert( "El campo [' + label + '] sólo puede contener números."); ERROR=true;  }\n';
	
	if ( fobj.check.match(/\bDATE\b/ig)!=null )
	{
		CheckerFUNCTION += 'var cd = checkDate(GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '"), "-"); if ( !ERROR &&  cd != "" )  { alert( "El campo [' + label+ '] debe contener una fecha en el formato dd-mm-aaaa. \\nError:\\n " + cd); ERROR=true;  }\n';
	
		fobj.explainer = '(dd-mm-aaaa) ' + fobj.explainer;
	}

	if ( fobj.check.match(/\bDATEBETWEEN\b/ig)!=null )
	{
		CheckerFUNCTION += 'var cd = checkDate(GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '_A"), "-") + checkDate(GetFormElementValue(document.forms["' + formname + '"], "' + fobj.field + '_B"), "-"); if ( !ERROR &&  cd != "" )  { alert( "El campo [' + label + '] debe contener una fecha en el formato dd-mm-aaaa. \\nError:\\n " + cd); ERROR=true;  }\n';
		fobj.explainer = '(dd-mm-aaaa) ' + fobj.explainer;
	}
}



function GenerateForm()
{
	
	Outline +=  (' <form name=FBmain action="" method=' + FORMMETHOD + '>  \n');
	Outline +=  (' <table border=' + FORMBORDER + ' cellspacing=1 cellpadding=2 >  \n');
	
	for (i=1; i<FBtotal; i++)
	{
		Outline +=  (' <tr>  \n');
		
		 GenerateFormObject(FBdb[i])  ;
		
		Outline +=  (' </tr>  \n');
	}
	
	Outline +=  (' </table>  \n');
	Outline +=  (' </form>  \n');
	
return Outline;
}





// Genera cada uno de los tipos de elementos del formulario
function GenerateFormObject ( fobj, formname )
{
	
	var typeclass =  IE()  ? ' class=' + fobj.type + '0' :'' ;
	
	switch ( fobj.type )
	{
		

		case 'hidden':
			Outline +=  (' <td class=label0 colspan=2 ><input  type=hidden name=' + fobj.field + ' value="' + fobj.value + '" ></td>  \n');
		break;

		case 'label':
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + (2*WFIELD) + '>' + fobj.value + '&nbsp;</td>  \n');
		break;

		case 'submit':
			Outline +=  (' <td class=button0 colspan=2 ><input ' + typeclass + ' type=button name=' + fobj.field + ' value="' + fobj.label + '" onclick="CheckForm();return false;"></td>  \n');
		break;

		case 'text':
			GenerateChecker( fobj, formname );
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;

			var grp = Fgroup[fobj.field]==0 ? '' : Fgroup[fobj.field];
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=text name=' + fobj.field + grp + ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" maxlength=' + getMaxlength(fobj) + '>&nbsp;' + fobj.explainer + '</td>  \n');

		break;
		
		case 'password':
			GenerateChecker( fobj, formname );
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;

			var grp = Fgroup[fobj.field]==0 ? '' : Fgroup[fobj.field];
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=password name=' + fobj.field + grp + ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" maxlength=' + getMaxlength(fobj) + '>&nbsp;' + fobj.explainer + '</td>  \n');

		break;
		
		case 'textdisabled':
			GenerateChecker( fobj, formname  );
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;

			var grp = Fgroup[fobj.field]==0 ? '' : Fgroup[fobj.field];
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + ' ><input ' + typeclass + ' type=text   name=' + fobj.field + grp + ' size=' + fobj.size + ' value="' + fobj.value + '"  onfocus="blur();">&nbsp;' + fobj.explainer + '</td>  \n');
		break;
		
		case 'textarea':
			GenerateChecker( fobj, formname  );
			
			size = (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size);
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<textarea wrap' + typeclass + ' name=' + fobj.field +  ' cols=' + size + ' rows=' + Math.floor(WFIELD/size) + '  >' + fobj.value + '</textarea>&nbsp;' + fobj.explainer + '</td>  \n');
		break;
		
		case 'titlegroup':
			Outline +=  (' <td class=titlegroup colspan=2><br>' + fobj.label + '</td>  \n');
		break;

		case 'labelbutton':
			GenerateChecker( fobj, formname );
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '><input ' + typeclass + ' type=button name=' + fobj.field + ' value="' + fobj.label + '" onclick="' + fobj.check + ';return false;">&nbsp;' + fobj.explainer + '</td>  \n');
		break;

		case 'selectorA':
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;
			
			var Fgrouponclick = "STopenSelector('" + fobj.field + "', '" + fobj.check + "')"
			
			Outline +=  (' <td class=label0  width=' + WLABEL + '><input  ' +  (typeclass=='' ? '' : typeclass+'btn')   + ' type=button name=' + fobj.field +'btn' + ' value="' + fobj.label + '" onclick="' + Fgrouponclick + ';return false;"></td>  \n');
			//Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=text name=' + fobj.field + Fgroup[fobj.field] + ' size="' + fobj.size + '" value="' + fobj.value + '" onfocus=blur();>&nbsp;' + fobj.explainer );
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=text name=TX' + Fgroup[fobj.field] + '_' + fobj.field +  ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" onfocus=blur();>&nbsp;' + fobj.explainer );
			
			Outline +=  Fgroup[fobj.field]==0 ? (' <input  type=hidden name=' + fobj.field + ' value="" ></td>  \n') : '';
						
		break;



		case 'selectorB':
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;

			var Fgrouponclick = "STopenSelector('" + fobj.field + "', '" + fobj.check + "')"
 
 			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + fobj.label + '</td>  \n');
			//Outline +=  (' <td class=field0 width=' + WFIELD + ' ><input ' + typeclass + ' type=text name=' + fobj.field + Fgroup[fobj.field] + ' size="' + fobj.size + '" value="' + fobj.value + '" onfocus=blur();>' )
			Outline +=  (' <td class=field0 width=' + WFIELD + ' ><input ' + typeclass + ' type=text name=' + fobj.field + Fgroup[fobj.field] + ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" onfocus=blur();>' )
			Outline +=  ('<input  ' + (typeclass=='' ? '' : typeclass+'btn') + ' type=button name=' + fobj.field+'btn' + ' value="' + fobj.explainer + '" onclick="' + Fgrouponclick + ';return false;">');
			Outline +=  Fgroup[fobj.field]==0 ? (' <input  type=hidden name=' + fobj.field + ' value="" ></td>  \n') : '' ;
		break;


		case 'radio':
			GenerateChecker( fobj, formname  );
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + ' >' )
			
			var vals = fobj.value.split(':');
			for ( var i=0; i<vals.length; i+=2) 
				Outline +=  ('<input  ' + typeclass + ' type=radio name=' + fobj.field + ' value="' + vals[i+1] + '" >' + vals[i] + '');

			Outline +=  (' </td>  \n');

		break;

		case 'checkbox':
			GenerateChecker( fobj, formname  );
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + ' >' )
			
			var vals = fobj.value.split(':');
			for ( var i=0; i<vals.length; i+=2) 
				Outline +=  ('<input  ' + typeclass + ' type=checkbox name=' + fobj.field + ' value="' + vals[i+1] + '" >' + vals[i] + '');

			Outline +=  (' </td>  \n');

		break;

		case 'select':
			GenerateChecker( fobj, formname  );
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + ' >' )
			
			var vals = fobj.value.split(':');
			Outline += '<select name=' + fobj.field + ' ' + typeclass + '>'
			for ( var i=0; i<vals.length; i+=2) 
				Outline +=  '<option   value="' + vals[i+1] + '" >' + vals[i] + '</option>';

			Outline +=  ('</select> \n </td>  \n');

		break;

		case 'date':
			GenerateChecker( fobj, formname  );

			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=text name=' + fobj.field +  ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" maxlength=' + getMaxlength(fobj) + '> &nbsp;' + fobj.explainer + '</td>  \n');
		break;

		case 'datebetween':
			GenerateChecker( fobj, formname  );
			if (typeof Fgroup[fobj.field]== 'undefined') Fgroup[fobj.field]=0; 
				else Fgroup[fobj.field]++;

			var grp = Fgroup[fobj.field]==0 ? '' : Fgroup[fobj.field];
			Outline +=  (' <td class=label0 width=' + WLABEL + '>' + NOTNULLlabel + fobj.label + '</td>  \n');
			Outline +=  (' <td class=field0 width=' + WFIELD + '>\n<input ' + typeclass + ' type=text name=' + fobj.field + '_A' + grp + ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" maxlength=' + getMaxlength(fobj) + '>&nbsp; a  ');
			Outline +=  (' <input ' + typeclass + ' type=text name=' + fobj.field + '_B' + grp + ' size="' + (getMaxlength(fobj)!='' && fobj.size==0 ? getMaxlength(fobj) : fobj.size) + '" value="' + fobj.value + '" maxlength=' + getMaxlength(fobj) + '>&nbsp;' + fobj.explainer + '</td>  \n');
		break;
		
		default:
			alert('FORMbuilder ERROR:\n   - El tipo [' + fobj.type + ']  no existe ');
		
		
	}
	
}
