//FUNCIONES JAVASCRIPT PARA EL MANEJO DE LA APLICACION DE FORMULARIOS

//num es la variable global que usamos para llevar la cuenta de las opciones dentro de los parametros de los campos, es necesaria por su uso en varias funciones
 var num = 0;
// Las dos variables globales noval y noval2 vienen determinadas por si los parametros al insertar un campo son validos o no
 var noval = false;
 var noval2 = false;
 //Funcion que mueve los subformularios al presionar sobre las flechas mediante
 //AJAX asi conseguimos no recargar la página
 function mover(direccion,orden,subform,sub_ac,id_mod_web,id_idioma){
 	var pars = 'orden_m='+orden+'&subf_m='+subform+'&dire_m='+direccion+'&sub_acm='+sub_ac+'&id_mod_webm='+id_mod_web+'&id_idiomam='+id_idioma+'&'+Math.random();;
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMover
    });
	
	
 }
 
 function mover_bd(direccion,orden,subform,sub_ac,id_mod_web,id_idioma){
 	var pars = 'orden_m='+orden+'&subf_m='+subform+'&dire_m='+direccion+'&sub_acm='+sub_ac+'&id_mod_webm='+id_mod_web+'&id_idiomam='+id_idioma+'&'+Math.random();;
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMover_bd
    });
	
	
 }
 
 //Mostrar parametros para la edicion de la relacion tabla
 function editCampoRelacionBD(id_campo,id_tabla){
	 var pars = 'idcampo_ecrbd='+id_campo+'&idtabla_ecrbd='+id_tabla+'&'+Math.random();
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMostrarParametrosCampoBD
    });
 }
 
 //Mostramos el select de los distintos campos a elegir segun la tabla que se seleccione, de forma que cada tabla tendra sus tipos de campo dependiendo del tipo de columnas
 function mostrarTiposCamposTabla(optSelect,idsubf){
	var indice = optSelect.selectedIndex
    var valor = optSelect.options[indice].value 
	if(valor != 0){
		var pars = 'idtabla_mtct='+valor+'&idsubform_mtct='+idsubf+'&'+Math.random();;
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retMostrarTiposCamposTabla
		});
	}
	else{
		$('contSelectCampos').innerHTML = "";
	}
	
 }
 
 
 
 function retMostrarTiposCamposTabla(onRequest){
	 $('contSelectCampos').innerHTML = onRequest.responseText;
	 $('escribirCampos').innerHTML = '';
	 $('subcreandose').innerHTML = '';
 }
 
 function mostrarParametrosRelacionBD(id_tabla){
	 	$('selectCamposBD').selectedIndex = 0;
		var pars = 'idtabla_mprbd='+id_tabla+'&'+Math.random();;
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retMostrarParametrosCampoBD
		});
 }
  function mostrarParametrosRecursivaBD(id_tabla){
	 	$('selectCamposBD').selectedIndex = 0;
		var pars = 'idt_conf_cr='+id_tabla+'&'+Math.random();;
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retMostrarParametrosCampoBD
		});
 }
 
 function mostrarParametrosCampoBD(optSelect){
	var indice = optSelect.selectedIndex
    var valor = optSelect.options[indice].value 
	var pars = 'idcol_mpcbd='+valor+'&'+Math.random();;
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMostrarParametrosCampoBD
    });
 }
 
 function retMostrarParametrosCampoBD(onRequest){
	 $('escribirCampos').innerHTML = onRequest.responseText;
 }


//Funcion que se ejecuta con la vuelta de PHP de la llamada AJAX
 //Esta funcion basicamente rescribe los dos subformularios que hemos movido
 function retMover(onRequest){
 		res = onRequest.responseText.split('@&%#$');
		orden = res[0].split(':::');
		document.getElementById(orden[1]).innerHTML = res[2];
		document.getElementById(orden[2]).innerHTML = res[1];
		$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[3]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar();">';
 }
 
 function retMover_bd(onRequest){
 		res = onRequest.responseText.split('@&%#$');
		orden = res[0].split(':::');
		document.getElementById(orden[1]).innerHTML = res[2];
		document.getElementById(orden[2]).innerHTML = res[1];
		$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[3]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar_bd();">';
 }
 
 //Funcion que muestra a traves de AJAX el formulario de parametros al insertar un nuevo campo
 function mostrarCamp(id_tipo){
 	var pars = 'id_tipo_mos='+id_tipo+'&'+Math.random();
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
 }
 
 //Muestra el formulario de los parametros de el campo elegido
 function retMos(onRequest){
 	//iniciamos el contador de opciones en 2, siempre hay una opcion por defecto, y lo iniciamos cada vez que se muestre el formulario de parametros de un campo (a no ser que editemos el campo)
 	num = 2;
	noval = false;
	noval2 = false;
 	res = onRequest.responseText;
	$('escribirCampos').innerHTML = res;
 }
 
 //Funcion que, por AJAX, es llamada al cambiar la alineacion de un formulario
 function redInsert(form,subform){
 	//Si el orden de los campos ha cambiado debemos obtenerlo de nuevo ya que cambiamos la alineacion
 	var orden = consigueOrden(form.elements[0].options[form.elements[0].selectedIndex].value,subform);
 	var pars = 'aline_r='+form.elements[0].options[form.elements[0].selectedIndex].value+'&subform_r='+subform+'&orden='+orden+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retInsert
    });
 }
 
 //Funcion que coloca el codigo HTML de vuelta de ajax para representar los campos que se estan insertando (vista previa)
 function retInsert(onRequest){
 	//Utilizamos @&%#$ como separador entre la cadena de texto que se nos devuelve por ajax
 	res = onRequest.responseText.split('@&%#$');
	$('subcreandose').innerHTML = '<span class="titC">Campos Insertados</span>'+res[0];
	 //Si estabamos editando dejamos de mostrar el formulario de parametros para editar el campo
	 if(res[1] == 1){
		$('escribirCampos').innerHTML = '';
	}
	//Creamos los sortables, es decir, las funciones pertinentes para conseguir el movimiento de Drag and Drop. (Scriptaculous)
	crearSortables(res[2],res[3]);
	
	if($('contSelectCampos')){
		refrescarSelectCamposBD(res[4], res[3])	
	}
 }
 
 //funcion que borra por AJAX un conjunto (subformulario) 
 function borrarCon(subform,subformmod){
 	if(confirm('¿Esta seguro de que quiere borrar el conjunto?')){
		var pars = 'subform_b='+subform+'&subformmod_b='+subformmod+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retBorrarCon
		});
	}
 }
 
 function borrarCon_bd(subform,subformmod){
 	if(confirm('¿Esta seguro de que quiere borrar el conjunto?')){
		var pars = 'subform_b='+subform+'&subformmod_b='+subformmod+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retBorrarCon_bd
		});
	}
 }
 
 //Retorno de la funcion borrar (AJAX)
 function retBorrarCon(onRequest){
 	res = onRequest.responseText.split('@&%#$');
	//mostramos lo recibido en el div de subformularios finalizados y los botones de nuevo y fin
	$('cont_subformsfin').innerHTML = res[0];
	$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[1]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar();">';
	$('subformu_nue').innerHTML = '';
	$('subformu_nue').className = '';
 }
 
 function retBorrarCon_bd(onRequest){
 	res = onRequest.responseText.split('@&%#$');
	//mostramos lo recibido en el div de subformularios finalizados y los botones de nuevo y fin
	$('cont_subformsfin').innerHTML = res[0];
	$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[1]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar_bd();">';
	$('subformu_nue').innerHTML = '';
	$('subformu_nue').className = '';
 }
 
  //funcion crea un nuevo conjunto por AJAX 
 function nuevoConjunto(form){
 	var pars = 'form_n='+form+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retNuevoConjunto
    });
 }
 //funcion retorno de nuevoConjunto
 function retNuevoConjunto(onRequest){
 	res = onRequest.responseText;
	$('subformu_nue').innerHTML = res;
	$('subformu_nue').className = 'subformu'
	$('botoNuevoSubformu').innerHTML = '';
	$('botoFinFormu').innerHTML = '';
 }
 
 //funcion que usando el formulario de parametros usado para insertar un campo y habiendo estado debidamente cumplimentado inserta un nuevo campo
 function insertarCampo(form,edit,idcampo){
	//Si los parametros son validos
 	if(noval == false && noval2 == false){
	//Obtenemos el orden del formulario por si se ha cambiado con el drag n drop
		var orden = consigueOrden(document.miformulario.alinea.value,document.miformulario.subformu.value);
	//Conseguimos los distintos campos de el formulario miformulario
		var cont = 0;
		var numel = document.miformulario.elements.length;
		var pars = 'inscampo=1&'+document.miformulario.elements[cont].name+'='+document.miformulario.elements[cont].options[document.miformulario.elements[cont].selectedIndex].value;
		
		
	
		cont = cont + 1;
		while(cont<numel){
			//Si es un checkbox, el parametro no el tipo de campo a insertar, miramos si esta chequeado
			if(document.miformulario.elements[cont].name.substr(0,8) == "CHECKBOX"){
				checked = 0;
				if(document.miformulario.elements[cont].checked){checked = 1;}
				pars = pars+'&'+document.miformulario.elements[cont].name+'='+checked;
			}
			else{
				//Si es una sucesion de opciones debemos unirlas todas, estando separadas por unos caracteres de separacion.
				if(document.miformulario.elements[cont].name == "PARAMETRO37" || document.miformulario.elements[cont].name == "PARAMETRO49"){
					opciones = joinOpciones();
					for (i=0; i<opciones.length; i++){
						opciones[i] = escaparAjax(opciones[i]);
					}
					num2 = opciones.length;
					opfin = opciones[0];
					cont2 = 1;
					while(cont2 < num2){
						opfin = opfin+',.:'+opciones[cont2];
						cont2++;
					}	
					pars = pars +'&'+document.miformulario.elements[cont].name+'='+opfin;
					cont = cont + num2;	
				}
				else
				{
					nombre = escaparAjax(document.miformulario.elements[cont].name);
					valor = escaparAjax(document.miformulario.elements[cont].value);
					//nombre = escape(document.miformulario.elements[cont].name);
					//valor = escape(document.miformulario.elements[cont].value);
					pars = pars+'&'+nombre+'='+valor;
				}
			}
			cont = cont + 1;
		}
		if(edit == 1)
		{
			pars = pars+'&id_campo='+idcampo;
		}
		pars = pars+'&edit='+edit+'&orden='+orden+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retInsert
		});
	}
 } 
 
  //funcion que usando el formulario de parametros usado para insertar un campo y habiendo estado debidamente cumplimentado inserta un nuevo campo cuando estamos en el tipo de formulario BD (Gestor_BD)
 function insertarCampoBD(form,edit,idcampo,camporel){
	 
	//Si los parametros son validos
 	if(noval == false && noval2 == false){
	//Obtenemos el orden del formulario por si se ha cambiado con el drag n drop
		var orden = consigueOrden(document.miformulario.alinea.value,document.miformulario.subformu.value);
	//Conseguimos los distintos campos de el formulario miformulario
		var cont = 0;
		var numel = document.miformulario.elements.length;
		var pars = 'inscampo=1&'+document.miformulario.elements[cont].name+'='+document.miformulario.elements[cont].options[document.miformulario.elements[cont].selectedIndex].value;
		
		
	
		cont = cont + 1;
		while(cont<numel){
			//Si es un checkbox, el parametro no el tipo de campo a insertar, miramos si esta chequeado
			if(document.miformulario.elements[cont].name.substr(0,8) == "CHECKBOX"){
				checked = 0;
				if(document.miformulario.elements[cont].checked){checked = 1;}
				pars = pars+'&'+document.miformulario.elements[cont].name+'='+checked;
			}
			else{
				//Si es una sucesion de opciones debemos unirlas todas, estando separadas por unos caracteres de separacion.
				if(document.miformulario.elements[cont].name == "PARAMETRO37" || document.miformulario.elements[cont].name == "PARAMETRO49"){
					opciones = joinOpciones();
					for (i=0; i<opciones.length; i++){
						opciones[i] = escaparAjax(opciones[i]);
					}
					num2 = opciones.length;
					opfin = opciones[0];
					cont2 = 1;
					while(cont2 < num2){
						opfin = opfin+',.:'+opciones[cont2];
						cont2++;
					}	
					pars = pars +'&'+document.miformulario.elements[cont].name+'='+opfin;
					cont = cont + num2;	
				}
				else
				{
					nombre = escaparAjax(document.miformulario.elements[cont].name);
					valor = escaparAjax(document.miformulario.elements[cont].value);
					//nombre = escape(document.miformulario.elements[cont].name);
					//valor = escape(document.miformulario.elements[cont].value);
					pars = pars+'&'+nombre+'='+valor;
				}
			}
			cont = cont + 1;
		}
		if(edit == 1)
		{
			pars = pars+'&id_campo='+idcampo;
		}
		
		if(camporel == 1){$col=-1;}else{$col=$('selectCamposBD').value;}
		
		pars = pars+'&edit='+edit+'&orden='+orden+'&columna='+$col+'&tabla='+$('selectTablas').value+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retInsert
		});
	} 
 }
	 	
 
 
//Funcion que escapa los caracteres conflictivos para Ajax
  function escaparAjax(texto){

	for(i=0;i<texto.length;i++)
	
	{
	
		if(texto.charAt(i)=="#"){
			letra = escape(texto[i]);
			texto = texto.replace("#","%23");
		}
		else if(texto.charAt(i)=="?"){
			letra = escape(texto[i]);
			texto = texto.replace("?","%3F");
		}
		else if(texto.charAt(i)=="&"){
			letra = escape(texto[i]);
			texto = texto.replace("&","%26");
		}
	}
	return texto;
	
  }
 
 //Funcion que se ejecuta al pulsar el boton de finalizacion de un subconjunto
 function finConjunto(subform,edit){
 	var orden = consigueOrden(document.miformulario.alinea.value,subform);
 	var pars = 'subform_fin='+subform+'&edit='+edit+'&alinea='+document.miformulario.alinea.value+'&nombre_subformu='+document.miformulario.nombre_subformu.value+'&desc_subformu='+document.miformulario.desc_subformu.value+'&orden='+orden+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retFinConjunto
    });
 }
 
 //Retorno de la funcion de finalizar conjunto que muestra de nuevo los botones de nuevo subformulario y fin de formulario
 function retFinConjunto(onRequest){
 	res = onRequest.responseText.split('@&%#$');
	$('cont_subformsfin').innerHTML = res[0];
	$('subformu_nue').innerHTML = '';
	$('subformu_nue').className = '';
	$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[1]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar();">';
 }
 
 //Funcion que comprueba si se han escrito el nombre del formulario y la direccion (obligatorios) y a demas si la direccion es valida
 function enviar(){
	 
	if(document.form_descformulari.nombre_formu.value.length == 0){
		alert('Debe incluir un nombre para el formulario');
	}
	else if(document.form_descformulari.email_formu.value.length == 0){
		alert('Debe incluir una direccion de correo donde enviar el formulario');
	}else{
		if(isEmailAddress(document.form_descformulari.email_formu,'email_formu')){
			document.form_descformulari.submit();
		}
	}
	
 }
 
//funcion que se usara cuando se esten editando los niveles de seguridad de un CAMPO y servira para asignar a cada CAMPO niveles de seguridad por grupo de usuarios
function asignarPerCampo(form,edit,campo){

	//Conseguimos los distintos campos del formulario miformulario uqe usare para asiganar los permisos
	//necesitare el id del grupo, el id del nivel de seguridad y el id del subformulario
	var pars = 'grupousr='+document.formu_permisos.grupo_usr.options[document.formu_permisos.grupo_usr.selectedIndex].value+'&nivelgrupo='+document.formu_permisos.nivel_grupo.options[document.formu_permisos.nivel_grupo.selectedIndex].value;
 	var pars =  pars+'&asignar_per_campo='+campo+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
}

function asignarValCampo(form,campo){
	
	var pars =  pars+'&asignar_val_campo='+campo+'&id_val='+$('validaciones_disponibles').value+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });	
}
function quitarValCampo(form,campo){
	
	var pars =  pars+'&quitar_val_campo='+campo+'&id_val='+$('validaciones_activas').value+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });	
}
//funcion que se usara cuando se esten editando las validaciones de un campo, y servira para modificar cualquiera de las validaciones que ya tenga ese campo creadas
function modificarValCampo(form,n_valida,validacio,campo){

	//Conseguimos los distintos campos del formulario miformulario uqe usare para modificar en la base de datos
	//necesitare el nombre, descripcion y codigo del campo
	var pars = 'nom_v='+$('f_nom_valida_'+n_valida).value+'&codigo_v='+$('f_codigo_valida_'+n_valida).value+'&desc_v='+$('f_desc_valida_'+n_valida).value+'&error_v='+$('f_error_valida_'+n_valida).value;
 	var pars =  pars+'&modificar_val_campo='+validacio+'&campo='+campo+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
}

//funcion que se usara cuando se esten editando las validaciones de un campo, y servira para borrar cualquiera de las validaciones que ya tenga ese campo creadas
function borrarValCampo(form,validacio,campo){

	//Conseguimos los distintos campos del formulario miformulario uqe usare para modificar en la base de datos
	//necesitare el nombre, descripcion y codigo del campo
	var pars =  pars+'&borrar_val_campo='+validacio+'&campo='+campo+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
}

//funcion que se usara cuando se esten editando las validaciones de un campo, y servira para insertar cualquier nueva validacion para ese campo
function insertarValCampo(form,tipo_dato,validacio,campo){

	//Conseguimos los distintos campos del formulario miformulario uqe usare para insertar en la base de datos
	//necesitare el nombre, descripcion y codigo del campo
	var pars = 'nom_v='+$('n_nom_valida').value+'&codigo_v='+$('n_codigo_valida').value+'&desc_v='+$('n_desc_valida').value+'&error_v='+$('n_error_valida').value;
 	var pars =  pars+'&insertar_val_campo='+validacio+'&campo='+campo+'&tipo_dato='+tipo_dato+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
}


//funcion que se usara cuando se esten editando los niveles de seguridad de un formulario y servira para asignar a cada subform niveles de seguridad por grupo de usuarios
function asignarPer(form,edit,subform){

	//Conseguimos los distintos campos del formulario miformulario uqe usare para asiganar los permisos
	//necesitare el id del grupo, el id del nivel de seguridad y el id del subformulario
	var pars = 'grupousr='+document.miformulario.grupo_usr.options[document.miformulario.grupo_usr.selectedIndex].value+'&nivelgrupo='+document.miformulario.nivel_grupo.options[document.miformulario.nivel_grupo.selectedIndex].value;
 	var pars =  pars+'&asignar_per='+subform+'&'+Math.random();
	
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retEditCon
    });
}

//Funcion que hace las tareas pertinentes para empezar a editar las opciones de seguridad de un conjunto, se le llama con el boton Permisos Conjunto
 function permisCon(subform){
 	var pars = 'subform_per='+subform+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retEditCon
    });
 }

//Funcion que hace las tareas pertinentes para empezar a editar un subconjunto, se le llama con el boton editar conjunto
 function editCon(subform){
 	var pars = 'subform_ed='+subform+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retEditCon
    });
 }
 
 //Funcion de vuleta por AJAX de la funcion editar conjunto
 function retEditCon(onRequest){
	res = onRequest.responseText.split('@&%#$');
	$('subformu_nue').innerHTML = '';
	$('subformu_nue').className = '';
	$('cont_subformsfin').innerHTML = res[0];
	document.getElementById(res[2]).innerHTML = res[1];
	$('botoNuevoSubformu').innerHTML = '';
	$('botoFinFormu').innerHTML = '';
	crearSortables(res[3],res[4])
}
 //Funcion que comprueba si la cadena por parametro es una direccion email valida
 function isEmailAddress(theElement, nombre_del_elemento )
 {
	 var s = theElement.value;
	 var filter=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
	 if (s.length == 0 ) return true;
	 if (filter.test(s))
		return true;
	 else
	 	alert("Ingrese una dirección de correo válida");
	 theElement.focus();
	 return false;
 }
 
 //Funcion que abre el formulario de edicion de un campo con los campos pertinentes rellenados
 function editCampo(idcampo){
 	var pars = 'idcampo_edc='+idcampo+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
 }

 //Funcion que abre el formulario de edicion de los permisos para un campo especifico
 function editPermisoCampo(idcampo){
 	var pars = 'idcampo_epc='+idcampo+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
 }

 //Funcion que abre el formulario de edicion de validaciones para un campo especifico
 function editValidaCampo(idcampo){
 	var pars = 'idcampo_valc='+idcampo+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
 }

//Funcion que borra una asignacion de un gropo con su respectivo nivel de seguridad por AJAX
//esta funcion se llama cuando se pulsa en borrar asignacion dentro de la edicion de permisos del conjunto
 function borrarAsignacion(id_asignacion,subform,alinea){
 	var orden = consigueOrden(alinea,subform);
 	var pars = 'asignacion_bc='+id_asignacion+'&subform='+subform+'&orden='+orden+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retEditCon
    });
 }

//Funcion que borra una asignacion de un gropo con su respectivo nivel de seguridad por AJAX
//esta funcion se llama cuando se pulsa en borrar asignacion dentro de la edicion de permisos del campo
 function borrarAsignacionCampo(id_asignacion,campo){
 	var pars = 'asignacion_bc_campo='+id_asignacion+'&id_campo_bc='+campo+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retMos
    });
 }

//Funcion que borra un campo por AJAX
 function borrarCampo(idcampo,subform,alinea){
 	var orden = consigueOrden(alinea,subform);
 	var pars = 'idcampo_bc='+idcampo+'&orden='+orden+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retInsert
    });
	
 }
 
 //Funcion usada en los formularios de edicion e insercion de campos con opciones para agregar  una nueva opcion. num_op es, en el caso de que etemos editando, el numero de opciones que hay en ese momento
 function nuevaOpcion(num_op){
 	cont = 1;
	//Si estamos editando debemos asignar al contador global de opciones el numero de opciones actual
	if(num_op != 0){
		num = num_op;
	}
	//Cada nueva opcion hemos de darle a todas las anteriores de nuevo su valor
	while(cont < num){
		id='Opcion_'+cont;
		if(document.getElementById(id)){
			document.getElementById(id).setAttribute('value',document.getElementById(id).value);
		}
		cont++;
	}
	num = num+1;
	//Ponemos la imagen para quitar la opcion en la ultima opcion
 	$('div_opciones').innerHTML = $('div_opciones').innerHTML + '<img id="img_'+num+'" src="imgs/eliminarCampo.png" style="cursor: pointer;" onclick="quitarOpcion('+num+');" /><br id="br_'+num+'" />';
	//Creamos un nuevo input con sus atributos correspondientes
	ele = document.createElement('INPUT'); 
	ele.setAttribute('type', 'text');
	ele.setAttribute('name', 'Opcion_'+num);
	ele.setAttribute('id', 'Opcion_'+num);  
	ele.setAttribute('className', 'inParams2'); 
	ele.setAttribute('class', 'inParams2');
	ele.setAttribute('onclick', 'nuevaOpcion(0)');
	//De esta forma funciona en Explorer tambien
  	ele.onclick= function(){nuevaOpcion(0);};
	//Colocamos el elemento en el div correspondiente
	$('div_opciones').appendChild(ele);
 	num = num - 1;
	//Cambiamos los atributos de la que era la ultima opcion (sobre la que hemos pulsado para crear la nueva opcion)
	opcion = 'Opcion_'+num;
	document.getElementById(opcion).setAttribute('value','Opcion '+num);
	//document.getElementById(opcion).value='Opcion '+num;
	document.getElementById(opcion).setAttribute('className','inParams');
	document.getElementById(opcion).setAttribute('class', 'inParams');
	document.getElementById(opcion).setAttribute('onclick',null);
	//document.getElementById(opcion).onclick=function(){};
	document.getElementById(opcion).setAttribute('id','Opcion_'+num);
	//document.getElementById(opcion).id='Opcion '+num;
	num = num + 1;
 }
 //Funcion que se llama al pulsar sobre la imagen de quitar opcion. Quita el input, la imagen  y el salto de linea (br de la opcion) 
 function quitarOpcion(num1){
 	num1 = num1 - 1;
	id='Opcion_'+num1;
 	opcion = document.getElementById(id);
 	$('div_opciones').removeChild(opcion);
	num1 = num1 + 1;
	id='img_'+num1;
	img = document.getElementById(id);
 	$('div_opciones').removeChild(img);
	id='br_'+num1;
	br = document.getElementById(id);
 	$('div_opciones').removeChild(br);
 }
 
 //Funcion que junta todas las opciones en un solo vector y lo devuelve
 function joinOpciones(){
 	cont = 0;
	opciones = new Array();
	elementos = $('div_opciones').getElementsByTagName('INPUT');
	opciones[cont] = elementos[cont].value;
	cont++;
	while(elementos[cont].className != 'inParams2'){
		opciones[cont] = elementos[cont].value;
		cont++;
	}
	return opciones;
 }
 
//Funcion que consigue el orden de los campos ya insertados juntando los ids de los campos separados por , y de las columnas por :: . Es decir, 10,11,12::15,16::20 
 function consigueOrden(alinea,subform){
 	cont = 0;
	var orden;
	if($('col_1'+subform)){
		elementos = $('col_1'+subform).getElementsByTagName('div');
		if(elementos.length > 0){
			orden = elementos[cont].id;
			cont++;
			while(cont < elementos.length){
				orden = orden+','+elementos[cont].id;
				cont++;
			}
		}
		else
		{
			orden = '-1';
		}
	}
	else
	{
		orden = '-1';
	}
	cont = 0;
	if($('col_2'+subform)){
		elementos = $('col_2'+subform).getElementsByTagName('div');
		if(elementos.length > 0){
			orden = orden+'::';
			orden = orden+elementos[cont].id;
			cont++;
			while(cont < elementos.length){
				orden = orden+','+elementos[cont].id;
				cont++;
			}
		}
		else
		{
			orden = orden+'::-1';
		}
	}
	cont = 0;
	if($('col_3'+subform)){
		elementos = $('col_3'+subform).getElementsByTagName('div');
		if(elementos.length > 0){
			orden = orden+'::';
			orden = orden+elementos[cont].id;
			cont++;
			while(cont < elementos.length){
				orden = orden+','+elementos[cont].id;
				cont++;
			}
		}
		else
		{
			orden = orden+'::-1';
		}
	}
	cont = 0;
	if($('col_4'+subform)){
		elementos = $('col_4'+subform).getElementsByTagName('div');
		if(elementos.length > 0){
			orden = orden+'::';
			orden = orden+elementos[cont].id;
			cont++;
			while(cont < elementos.length){
				orden = orden+','+elementos[cont].id;
				cont++;
			}
		}
		else
		{
			orden = orden+'::-1';
		}
	}
	return orden;
 }
 
 //Funcion que segun el alineamiento de los campos que estemos crea Sortables, es decir, el elemento necesario para el drag n drop de los campos. (Scriptaculous)
 function crearSortables(aline,subf){
 
 		//Sortable.create('Id del elemento que contiene a los elementos que se van a mover',{Opciones(ver manual de sortables)})
		if(aline == '1 columna, izquierda' || aline == '1 columna, centro' || aline == '1 columna, derecha'){
			Sortable.create('col_1'+subf, {tag: 'div'});
		}
		else if(aline == '2 columnas'){
			//tag:'Tipo de elemento que vamos a mover'
			//containment:[ids de los contenedores entre los cuales se va a interrelacionar el drag n drop]
			//constraint: true/false restriccion del movimiento a solo vertical(true) o libre(false) defecto true
			Sortable.create('col_1'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf],constraint:false});
			Sortable.create('col_2'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf],constraint:false});
		}
		else if(aline == '3 columnas'){
			Sortable.create('col_1'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf],constraint:false});
			Sortable.create('col_2'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf],constraint:false});
			Sortable.create('col_3'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf],constraint:false});
		}
		else if(aline == '4 columnas'){
			Sortable.create('col_1'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf,'col_4'+subf],constraint:false});
			Sortable.create('col_2'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf,'col_4'+subf],constraint:false});
			Sortable.create('col_3'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf,'col_4'+subf],constraint:false});
		Sortable.create('col_4'+subf, {dropOnEmpty:true,
		tag: 'div',containment:["col_1"+subf,"col_2"+subf,"col_3"+subf,'col_4'+subf],constraint:false});
		}
	}
//Funcion que valida si el valor pasado como parametro es un entero
function validarEntero(valor){ 
      //intento convertir a entero. 
      //si era un entero no le afecta, si no lo era lo intenta convertir 
       valor = parseInt(valor);
	
      //Compruebo si es un valor numérico 
      if (isNaN(valor)) { 
         //entonces (no es numero) devuelvo el valor cadena vacia 
         return ""; 
      }else{ 
         //En caso contrario (Si era un número) devuelvo el valor 
         return valor ;
      } 
	} 

//Funcion que muestra el mensaje de error si el valor que le pasamos no es un entero
function validarSiNumero(elem,cont){ 
	var enteroValidado = validarEntero(elem.value) 
	var spant = new Array();
	spant = $('escribirCampos').getElementsByTagName('span');
	if (enteroValidado == "" && elem.value!=''){ 
         //selecciono el texto 
         elem.select();
         //coloco otra vez el foco 
         elem.focus();
		 spant[cont].innerHTML = ' < ERROR: Debe ser un número entero!';
		 //document.getElementById(id).innerHTML=' ERROR: Debe ser un número entero!';
		 noval=true;
	}else {
		noval=false;
		spant[cont].innerHTML = '';
		//alert(document.getElementById(id).innerHTML);
		//document.getElementById(id).innerHTML='';
		elem.value = enteroValidado ;
	}
} 

//Funcion que comprueba si la opcion por defecto se corresponde con las opciones introducidas
function validarOpcionDef(elem,num){
	cont = 0;
	encontrada = false;
	var spant = new Array();
	spant = $('escribirCampos').getElementsByTagName('span');
	elementos = $('div_opciones').getElementsByTagName('INPUT');
	while(elementos[cont].className != 'inParams2' && encontrada == false){
		if(elem.value == elementos[cont].value)
		{
			encontrada = true;
		}
		cont++;
	}
	if(encontrada == false && elem.value!=''){
		 spant[num].innerHTML = ' < ERROR: La opción por defecto no se corresponde con ninguna de las opciones introducidas!';
		noval2=true;
	}
	else
	{
		spant[num].innerHTML = '';
		noval2=false;
	}
	

}

//Funcion para validar los formularios segun los campos obligatorios elegidos por el usuario
function validar(form){
		var cadena='';
		var retorno = true;
		var contenedor = form;
		var inputs = contenedor.getElementsByTagName('input');
		var pat = 'o-b-l';
		var nombre='';
		for (i=0; i<inputs.length; i++){
		 	if(inputs[i].name.indexOf(pat) != -1 && inputs[i].type == 'text'){
				if(inputs[i].value == ''){
					nombre = inputs[i].name.split(pat);
					cadena=cadena+'El campo '+nombre+' es obligatorio!! Debes Rellenarlo.\n';
					retorno = false;
				}
			}
			else if(inputs[i].name.indexOf(pat) != -1 && inputs[i].type == 'checkbox'){
				if(!inputs[i].checked){
					nombre = inputs[i].name.split(pat);
					cadena=cadena+'El campo '+nombre+' es obligatorio!! Debes Marcarlo.\n';
					retorno = false;
				}
			}
		} 
		for (i=0; i<inputs.length; i++){
		 	
		} 
		var spans = contenedor.getElementsByTagName('span');
		var radios = new Array();
		var numchecked = 0;
		for (i=0; i<spans.length; i++){
			if(spans[i].id == pat){
				radios = spans[i].getElementsByTagName('input');
				numchecked = 0;
				for (j=0; j<radios.length; j++){
					if(!radios[j].checked){
						nombre = radios[j].name;
						numchecked++;						
					}
					if(numchecked == radios.length){
						cadena=cadena+'El campo '+nombre+' es obligatorio!! Debes elegir una opcion.\n';
						retorno = false;
					}
				}
			}
			
		} 
		var textareas = contenedor.getElementsByTagName('textarea');
		for (i=0; i<textareas.length; i++){
		 	if(textareas[i].name.indexOf(pat) != -1){
				if(textareas[i].value == ''){
					nombre = textareas[i].name.split(pat);
					cadena=cadena+'El campo '+nombre+' es obligatorio!! Debes Rellenarlo.\n';
					retorno = false;
				}
			}
		} 
		if(retorno == false){
			alert(cadena);
		}
		return retorno;
	}



//***************************************************************************************************************************************
//************************** FUNCIONES PARA LOS FORMULARIOS TIPO BASE DE DATOS **********************************************************
//***************************************************************************************************************************************
// las funciones a continuacion se usaran exclusivamente para este tipo de formularios


//Funcion para validar los formularios, realmente lo que haremos sera enviar a ajax_form todos los ids de los campos a revisar. 
//Alli revisaremos todo y enviaremos los datos de validacion a la funcion retValidar
//en el caso de que todos los campos hayan pasado la validacion se enviara el formulario desde retValidar
function validar_bd(form){

	var cadena='';
	var cadena2='';
	var cadena_s='';
	var cadena2_s='';
	var contenedor = form;
	var inputs = contenedor.getElementsByTagName('input');
	var inputs2 = contenedor.getElementsByTagName('select');

	//le paso a ajax_form todos los nombres de los inputs y selects de entre los cuales estan los ids que nos interesan
	//tambien le voy a pasar los valores de los inputs
	for (i=0; i<inputs2.length; i++){
		cadena_s=cadena_s+'-*-'+inputs2[i].name;
		cadena2_s=cadena2_s+'-*-'+inputs2[i].value;
	}
	
	for (i=0; i<inputs.length; i++){
		cadena=cadena+'-*-'+inputs[i].name;
		cadena2=cadena2+'-*-'+inputs[i].value;
	}
	
	cadena=cadena_s+cadena;
	cadena2=cadena2_s+cadena2;
	
	var pars = 'validar_f='+cadena+'&valors='+cadena2+'&'+Math.random();
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	var myAjax = new Ajax.Request(
		url,
	{
		method: 'get',
		parameters: pars,
		onComplete: retValidar
	});	
	
	//uso esto para que no se envie el formulario
	return false;
}

function retValidar(onRequest){
	res = onRequest.responseText.split('@&%#$');
   
    var errors = res[0];   
 	var hay_errors = res[1]; 
	
	if(hay_errors == 0){
		
		document.form_subformulari.submit();
	
	}else{ 
		errors = errors.replace(/çç/g,"\n");   
    	alert(errors);
	}	
}

//Esta funcion lo que hara es comprobar si se han hecho cambios en el formulario, en tal caso se avisara al usuario por si quiere guardar dichos cambios
//Cada uno de los campos del formulario tiene un input hidden por el cual voy a pasarle el valor anterior del campo para compararlo con el valor actual del input
function compruebaCambiosBD(form){

	var cadena='';
	var cadena2='';
	var contenedor = form;
	var inputs = contenedor.getElementsByTagName('input');

	var cadena_aux = '';
	
	var campos_h = new Array() 
	var valors_h = new Array()
	var campos_antes = new Array() 
	var valors_antes = new Array()
	var campos = new Array() 
	var valors = new Array()	
	
	//de todos los parametros solo nos quedemos con los id_campos que vamos a revisar en la validacion
	var u=0;
	for (i=0; i<inputs.length; i++){
		
		//por ello quitamos de los arrays los inputs que no nos sirven   
		if(inputs[i].name.lenght == 0 || inputs[i].type == 'file' || inputs[i].name.indexOf('usrs_gr') != -1 || inputs[i].name.indexOf('inserttipoform') != -1 || inputs[i].name.indexOf('subform') != -1 || inputs[i].name.indexOf('checkBD') != -1 || inputs[i].name.indexOf('edittipoform') != -1 || inputs[i].name.indexOf('id_v_edit') != -1 || inputs[i].name.indexOf('posicion') != -1 || inputs[i].name.indexOf('deletetipoform') != -1 || inputs[i].name.indexOf('usuario') != -1 || inputs[i].name.indexOf('pass') != -1 || inputs[i].name.indexOf('editAccept') != -1){
		}else{
			//de igual forma me quedo con los valores correspondientes y formo 2 arrays
			campos_h[u]=inputs[i].name;
			valors_h[u]=inputs[i].value;
			u=u+1;
			
		}
	}

	//debido a que necesito comprobar los cambios hechos por el usuario antes de alguna accion, tengo en el array de inputs los hidden pasado para tal efecto
	//necesito separar en diferentes arrays los inputs que me vienen por hidden (son los campos y valores que se mantienen)
	//de los inputs que me vienen por el formulario directamente (son los campos y valores actuales que inserta el usuario)
	var u=0;var v=0;
	for (i=0; i<campos_h.length; i++){
		
		if(campos_h[i].indexOf('h_') != -1){
			campos_antes[u]=campos_h[i].substring(2,campos_h[i].length); 
			valors_antes[u]=valors_h[i];
			u=u+1;
		}else{
			campos[v]=campos_h[i];
			valors[v]=valors_h[i];
			v=v+1;
		}		

	}
		
	//por ultimo con cada uno de los arrays (uno con los valores actuales y el otro con los anteriores), comparo y si no hay cambios, le pasare al ajax un 0
	//si hay cambios en alguno de los valores pasare un 1, con lo cual en la funcion retComprueba sabre que debo avisar al usuario
	var hay_errores=0;
	for (i=0; i<valors.length; i++){
		
		if(valors[i] != valors_antes[i]){
			hay_errores=1;
		}	
		
	}
	
	if(hay_errores==0){return true;}
	else{
		if(confirm('Ha realizado cambios en el Formulario pero no los ha guardado. Si continua se perderan los cambios. ¿Esta seguro que desea continuar? ')==true){
			return true;
		}else{
			return false;	
		}
	}
	
}

 //Funcion que comprueba si se han escrito el nombre del formulario(obligatorios), se usara en formus del tipo BD ya que no usan email
 function enviar_bd(){
 	if(document.form_descformulari.nombre_formu.value.length == 0){
		alert('Debe incluir un nombre para el formulario');
	}else{
 		document.form_descformulari.submit();		
	}
 }
 
 //Retorno de la funcion de finalizar conjunto que muestra de nuevo los botones de nuevo subformulario y fin de formulario
 function retFinConjunto_bd(onRequest){
 	res = onRequest.responseText.split('@&%#$');
	$('cont_subformsfin').innerHTML = res[0];
	$('subformu_nue').innerHTML = '';
	$('subformu_nue').className = '';
	$('botoNuevoSubformu').innerHTML = '<input  class="inBotoNuevoSubformu" type="submit" name="nuevo_conjunto" value="Nuevo conjunto de campos" onclick="nuevoConjunto('+res[1]+');">';
	$('botoFinFormu').innerHTML = '<input class="inBotoFinFormu" type="submit" name="finalizar_formulario" value="Finalizar Formulario" onclick="enviar_bd();">';
 }
 
 //Funcion que se ejecuta al pulsar el boton de finalizacion de un subconjunto
 function finConjunto_bd(subform,edit){
 	var orden = consigueOrden(document.miformulario.alinea.value,subform);
 	var pars = 'subform_fin='+subform+'&edit='+edit+'&alinea='+document.miformulario.alinea.value+'&nombre_subformu='+document.miformulario.nombre_subformu.value+'&desc_subformu='+document.miformulario.desc_subformu.value+'&orden='+orden+'&'+Math.random();
 	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
    var myAjax = new Ajax.Request(
    	url,
    {
        method: 'get',
        parameters: pars,
		onComplete: retFinConjunto_bd
    });
 }
 
 //Despues de insertar o eliminar un campo del tipo BD (Gestor_BD) debemos actualizar el select de Columnas de la BD
 function refrescarSelectCamposBD(idtabla, idsubform){
	if($('selectCamposBD')){
		var pars = 'idtabla_rscbd='+idtabla+'&idsubform='+idsubform+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retRefrescarSelectCamposBD
		});
	}
 }
 
 function retRefrescarSelectCamposBD(onRequest){
	$('contSelectCampos').innerHTML = onRequest.responseText; 
 }
 
 
 
 //SECCION DEL CONTROL DE PAGINACION DE FORM_ULARI_OS BD
 
 function irAFilaInicial(tabla,subform,modo){
	  if(compruebaCambiosBD(window.document.forms.form_subformulari)==true){
		 var pars = 'idtabla_iafi='+tabla+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
			//Url de la pagina donde residen las funciones PHP.
			var url = 'ajax_form.php';
			//Creamos un nuevo objeto AJAX (Prototype)
			var myAjax = new Ajax.Request(
				url,
			{
				method: 'get',
				parameters: pars,
				onComplete: retIrAFilaInicial
			});
	  }
 }
 
 function irAFilaFinal(tabla,subform,modo){
	  if(compruebaCambiosBD(window.document.forms.form_subformulari)==true){
		 var pars = 'idtabla_iaff='+tabla+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
			//Url de la pagina donde residen las funciones PHP.
			var url = 'ajax_form.php';
			//Creamos un nuevo objeto AJAX (Prototype)
			var myAjax = new Ajax.Request(
				url,
			{
				method: 'get',
				parameters: pars,
				onComplete: retIrAFilaInicial
			});
	  }
 }
 
  function mostrarEdicionTabla(tabla,subform,actual,modo){
	  var pars = 'idtabla_met='+tabla+'&idsubform='+subform+'&factual='+actual+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});
 }
 
 function irAtras(tabla,subform,actual,modo){
	 if(compruebaCambiosBD(window.document.forms.form_subformulari)==true){
	 
	  var pars = 'idtabla_ia='+tabla+'&idsubform='+subform+'&factual='+actual+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	
	 }
 }
 
 function irAdelante(tabla,subform,actual,modo){
	  if(compruebaCambiosBD(window.document.forms.form_subformulari)==true){
		  var pars = 'idtabla_ia2='+tabla+'&idsubform='+subform+'&factual='+actual+'&modo='+modo+'&'+Math.random();
			//Url de la pagina donde residen las funciones PHP.
			var url = 'ajax_form.php';
			//Creamos un nuevo objeto AJAX (Prototype)
			var myAjax = new Ajax.Request(
				url,
			{
				method: 'get',
				parameters: pars,
				onComplete: retIrAFilaInicial
			});	
	  }
 }
 
 function retIrAFilaInicial(onRequest){
	 res = onRequest.responseText.split('@&%#$');
	$('cont_subformuCreado'+res[1]).innerHTML = res[0];  
 }
 
 function cambiarHiddenCheck(id_campo,elem){
	 if(elem.checked == true){ $('hiddencheck_'+id_campo).value = '1'} else{ $('hiddencheck_'+id_campo).value = '0'}
	 
 }

function mostrarSubformNuevo(tabla,subform,modo){

	var pars = 'idtabla_msn='+tabla+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	
}

//funcion que borrara un registro directamente de la base de datos virtual y te dejara abierto el registro anterior al borrado
function borrarRegistroActual(tabla,subform,actual,modo){

	if(confirm('Esta seguro que desea borrar esta fila')){
	  	var pars = 'idtabla_bra='+tabla+'&idsubform='+subform+'&factual='+actual+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	
	}
	else{

	}	
}

//muestra un select con los usuario del grupo asignado a la tabla asignada al subformulario
//de manera que elijamos uno.
function mostrarUsuariosDeGrupo(tabla,subform,id_campo){
	var pars = 'idtabla_mudg='+tabla+'&idsubform='+subform+'&idcampo='+id_campo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retMostrarUsuariosDeGrupo
		});	
}

function retMostrarUsuariosDeGrupo(onRequest){
	res = onRequest.responseText.split('@&%#$');
	$('contOpcionRegBD'+res[1]).innerHTML = res[0];
}

//Muestra los campos de insercion de un nuevo usuario web desde el formulario de insercion
function mostrarNuevoUweb(id_campo){
	$('contOpcionRegBD'+id_campo).innerHTML = 'Usuario: <input class="inCampoText" type="text" name="usuario"/>Contraseña: <input class="inCampoText" type="password" name="pass"/>';	
}

//Cambia el select de formularios en la insercion/edicion del tipo de campo 'tabla_relacion' 
function cambiarSelectSubform(elem){
	var indice = elem.selectedIndex
    var valor = elem.options[indice].value
	var name = $('selectSubform').name;
	var pars = 'idtabla_css='+valor+'&name='+name+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retCambiarSelectSubform
		});	
}

function retCambiarSelectSubform(onRequest){
	$('liSelectSubform').innerHTML = onRequest.responseText;
}

//******************** FILTROS ***************************************
//aplicar el filtro de la columna especifica segun corresponda
function aplicarFiltro(tabla,id_campo,tipo_filtro,$id_usr,subform,modo){
	var v_filtro = document.getElementById("filtro"+id_campo+tipo_filtro).value;
	  var pars = 'id_tabla_apf='+tabla+'&campo='+id_campo+'&tipo_filtro='+tipo_filtro+'&v_filtro='+v_filtro+'&id_usr='+$id_usr+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	 
}

//borrar el respectivo filtro de una columna
function borrarFiltro(tabla,id_filtro,subform,modo){
	
	  var pars = 'id_tabla_brrf='+tabla+'&id_filtro='+id_filtro+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	 
}

function resetFiltros(subform,id_usr,tabla,modo){
	
	  var pars = 'id_tabla_resetf='+tabla+'&id_usr_r='+id_usr+'&idsubform='+subform+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});	 
}

function mostrarSubformAux(tabla,id_subform,subform_act){
	var pars = 'idtabla_msa='+tabla+'&id_subform='+id_subform+'&id_subform_act='+subform_act+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retMostrarSubformAux
		});	
}

function retMostrarSubformAux(onRequest){
	res = onRequest.responseText.split('@&%#$');
	$('cont_subformAux'+res[1]).innerHTML = res[0];
}

//funcion que me mostrara la tabla relacionada, se llama cuando desde una tabla pinchamos en algun registro que esta en una columna de ralacion
function mostrarTablaRelacion(tabla,subform,subform_r,modo){
	  var pars = 'idtabla_mtr='+tabla+'&idsubform='+subform+'&idsubform_r='+subform_r+'&modo='+modo+'&'+Math.random();
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retIrAFilaInicial
		});
}

//******************** OPCIONES ADICIONALES PARA LAS TABLAS ***************************************
function creaLinkDescarga(subform,filas){

	c_img = $('o_c_imgs').value;
	c_nom = $('o_c_nom').value;
	
	  var pars = 'camb_link='+c_img+'&c_nom='+c_nom+'&ids_virt='+filas+'&idsubform='+subform+'&'+Math.random();
	  
		//Url de la pagina donde residen las funciones PHP.
		var url = 'ajax_form.php';
		//Creamos un nuevo objeto AJAX (Prototype)
		var myAjax = new Ajax.Request(
			url,
		{
			method: 'get',
			parameters: pars,
			onComplete: retCambiaOpcionDesc
		});	
	  
 }
 
 function retCambiaOpcionDesc(onRequest){
	 res = onRequest.responseText.split('@&%#$');
	$('o_desc_imgs_2').innerHTML = res[0];  
 }
 
//Marca todos los campos de la seccion control columnas y a demas esconde los lis
// que identifican el orden de las columnas
function marcarTodos2(id,check){
	element = $(id);
	inputs = element.getElementsByTagName('input');
	lis = $('dropList').getElementsByTagName('li');
	if(check.checked == true){
		for(i = 0 ; i<inputs.length;i++){
			inputs[i].checked = true;
			lis[i].style.display = "inline";
		}
	}
	else{
		
		for(i = 0 ; i<inputs.length;i++){
			inputs[i].checked = false;
			lis[i].style.display = "none";
		}
	}
}

//En la insercion de una nueva tabla
function actDesactCol(id, check){
	element = $(id);
	if(check.checked == true){
		element.style.display = "inline";
	}
	else{
		element.style.display = "none";
	}
}

//Envia el formulario de Control de Columnas
//Es necesaria esta funcion para poder enviar el orden de las columnas
function controlColTabla(subform,id_tabla,n_columnas,id_vis){

	//Obtenemos los hijos del ul que contiene las columnas en el formulario, las cuales ya estan en el orden elegido
	hijos = $('dropList').childNodes;
	var orden = new Array() 
	var activas = new Array() 
	//Concatenamos los ids ordenados de los lis con las columnas, con el separador "_"
	//Asi obtenemos el orden de los ids
	for(i=0; i < hijos.length; i++){
		hijo_val = hijos[i].id.split("ordcol");		
		orden[i] = hijo_val[1];		
	}	
	
	for(i=0; i < n_columnas; i++){
		if($('checkCol'+i).checked){
		activas[i]=$('checkCol'+i).value;
		}
	}
	
	if($('checkRecursivas').checked==true){var act_recursivas=1;}else{var act_recursivas=0;}
	if($('checkRelacionadas').checked==true){var act_rel=1;}else{var act_rel=0;}
	if($('checkIdinternos').checked==true){var act_idin=1;}else{var act_idin=0;}
	
	
	var strOrden = orden.join(",");
	var strActivas = activas.join(",");
	
	var pars = 'contr_col='+strOrden+'&hidden_tabla='+id_tabla+'&col_activas='+strActivas+'&id_vis_act='+id_vis+'&act_recursivas='+act_recursivas+'&act_rel='+act_rel+'&act_idin='+act_idin+'&idsubform='+subform+'&'+Math.random();
	  
	//Url de la pagina donde residen las funciones PHP.
	var url = 'ajax_form.php';
	//Creamos un nuevo objeto AJAX (Prototype)
	var myAjax = new Ajax.Request(
		url,
	{
		method: 'get',
		parameters: pars,
		onComplete: retControlColTabla
	});
	
}
function retControlColTabla(onRequest){
	window.location.reload();  
	document.location.href = document.location.href;
	//res = onRequest.responseText.split('@&%#$');
	//$('contenedor_controlcolumnas').innerHTML = res[0];  	
}

//***************************************************************************************************************************************
//************************** REPRESENTACION DE LA TABLA PARA LOS REGISTROS **************************************************************
//***************************************************************************************************************************************
// las funciones a continuacion SON exclusivas para formar la tabla que usamos cuando pasamos a modo tabla


//Funcion que abre el menu de las tablas (Menu amarillo superior) (Onmouseover)
function abrirMenuTabla(num){
	$('menu_tablas'+num).style.display = 'block';
}
//Funcion que esconde el menu de las tablas (Menu amarillo superior) (Onmouseout)
function esconderMenuTabla(num){
	alert('xx');
	$('menu_tablas'+num).style.display = 'none';
}

//Funcion que muestra el menu de las columnas (onclick)
function desplegarMenuTr(num){
	$('menu_col'+num).style.display = 'block';
}
//Funcion que esconde el menu de las columnas (onclick)
function esconderMenuTr(num){

	$('menu_col'+num).style.display = 'none';
}
//Muestra un elemnto (generico)
//Recibe un id de un elemento html
function mostrarGenerico(id){
	$(id).style.display = 'block';
}

//Muestra un elemnto (generico)
//Recibe un id de un elemento html
function esconderGenerico(id){

	$(id).style.display = 'none';
}

function imprSelec(nombre)
{
	//quito los elementos que no quiero imprimir
	var tabs = getElementsByClass('noImprimir');
	for(i=0; i<tabs.length; i++){
		tabs[i].style.display = 'none';
	}
	
	//quito los margenes de la tabla que voy a imprimir
	var tables = document.getElementsByTagName("table");
	for (var i = 0; i < tables.length; i ++){
		tables[i].style.right='0px';
	}
	
	var ficha = document.getElementById(nombre);
	var ventimp = window.open(' ', 'popimpr');
	ventimp.document.write( ficha.innerHTML );
  
	ventimp.document.close();
	ventimp.print( );
	ventimp.close();
}
//Para marcar todos los checkbox del formulario form_subformulari
function seleccionar_todo(){
   for (i=0;i<document.form_subformulari.elements.length;i++)
      if(document.form_subformulari.elements[i].type == "checkbox")
         document.form_subformulari.elements[i].checked=1
} 
//Para desmarcar todos los checkbox del formulario form_subformulari
function deseleccionar_todo(){
   for (i=0;i<document.form_subformulari.elements.length;i++)
      if(document.form_subformulari.elements[i].type == "checkbox")
         document.form_subformulari.elements[i].checked=0
} 

function getElementsByClass( searchClass, domNode, tagName) { 
	if (domNode == null) domNode = document;
	if (tagName == null) tagName = '*';
	var el = new Array();
	var tags = domNode.getElementsByTagName(tagName);
	var tcl = " "+searchClass+" ";
	for(i=0,j=0; i<tags.length; i++) { 
		var test = " " + tags[i].className + " ";
		if (test.indexOf(tcl) != -1) 
			el[j++] = tags[i];
	} 
	return el;
}
