var version_jq= "a";
var arr_js = new Array(); //lista de archivos js que se han cargado dinamicamente
var arr_js_callback = new Array(); //lista de funciones callback que se ejecutan al cargar los js dinamicamente
var arr_css = new Array() //lista de archivos css que se han cargado dinamicamente
var cont_form_entidad = new Array() //contador de los formulario solicitados por entidad (agregado)
var idioma_jq = 1;  //idioma de trabajo
var tipo_peticion_jq = "POST"  //tipo de solicitud al servidor
var titulo_pagina = document.title; //titulo de la pagina
var opciones_form = new Array(); //declaracion del arreglo que los archivos js de las entidades usan para poner las caracteristicas personalizadas para el dialog del form, por ejemplo declarar el tamaño del dialog
var nombre_div_modal = "div_modal_";    //id del div que se va a usar como dialog
var nombre_form_modal = "form_modal_";  //id del formulario  dentro del dialog
var complemento_guardar = new Array(); //almacena informaci�n para recargar formularios (por ejemplo agregar->editar)
var directorio_estilos = "/css/theme/azul";  //directorio donde se almacenan los temas
var hoja_estilos = "theme.css";	//nombre de la hoja de estilos del thema
var cancela_ligas_auto = false ; //no detener la carga de ligas
var directorio_form_js = "/funciones/jq/qn/";  //directorio donde se buscaran los archivos js con las porpiedades de las entidades
var sufijo_form_js = "_jq";	//fin del nombre del archivo js de las entidades, por ejemplo telefono_jq.js
var arr_mensajes_jgrowl = new Array();
//firma y capcha
var callback_firma;
var function_carga_relogueo;
var msg_callback_firma = null;
var ajaxd = "/f/i.php";

if( !$.isArray( leyenda ) )
{
	var leyenda = new Array();
}
configura_fjq();

/*inicio de funciones*/
function configura_fjq()
{
	$.ajaxSetup( {
		scriptCharset : 'utf-8'
	} );
	$(function( ){
		if( $("script.leyendas_fjq").length <= 0 )
		{
			leyendas_idioma("formulario_jq","","",function(){
				configura_validacion();
			});
		}
		else
		{
			configura_validacion();
		}
		if( $("link.ui-theme").length <= 0 )
		{
			carga_css( directorio_estilos+"/"+hoja_estilos,"ui-theme" );
		}
		if( !cancela_ligas_auto )
		{
			prepara_ligas();
			prepara_botones();
		}
	});
}

//carga leyendas, guarda en un arreglo las categorias que ya cargo para no volverlos a cargar
function leyendas_idioma(c_leyenda, i_leyenda, r_leyenda, callback_li,texto_plano_li)
{
	i_leyenda = recibe_texto(i_leyenda);
	r_leyenda = recibe_texto(r_leyenda);
	if( i_leyenda == "" )
	{
		i_leyenda = idioma_jq;
	}
	var servidor_l = window.location.protocol=="https:"? window.location.protocol+"//"+window.location.hostname : "http://www.quiminet.com";
	var archivo_l = "/funciones/jq/qn/leyendas/" + ( r_leyenda == "" ? "" : r_leyenda + "/" ) + i_leyenda + "/"+ ( texto_plano_li == true ? "1" : "0" ) + "/" + c_leyenda + ".js";
	carga_js( archivo_l, callback_li, false , servidor_l );
}
function configura_validacion()
{
	$.validator.addMethod("required", function(value){
		return (value=="" || value=="0")? false : true;
	});
	$.extend($.validator.messages, {
		required: leyenda['form_valida_required'],
		remote: leyenda['form_valida_remote'],
		email: leyenda['form_valida_email'],
		url: leyenda['form_valida_url'],
		date: leyenda['form_valida_date'],
		dateISO: leyenda['form_valida_dateISO'],
		number: leyenda['form_valida_number'],
		digits: leyenda['form_valida_digits'],
		creditcard: leyenda['form_valida_creditcard'],
		equalTo: leyenda['form_valida_equalTo'],
		accept: leyenda['form_valida_accept'],
		maxlength: $.validator.format(leyenda['form_valida_maxlength']),
		minlength: $.validator.format(leyenda['form_valida_minlength']),
		rangelength: $.validator.format(leyenda['form_valida_rangelength']),
		range: $.validator.format(leyenda['form_valida_range']),
		max: $.validator.format(leyenda['form_valida_max']),
		min: $.validator.format(leyenda['form_valida_min'])
	});
}
//carga archivos js, guarda en un arreglo los archivos que ya cargo para no volverlos a cargar
function carga_js( archivo_js, callback_cjs_rec, referenciado_cj , servidor_js )
{
	var callback_cjs = $.isFunction( callback_cjs_rec ) ? callback_cjs_rec : function( ){};
	if( typeof servidor_js == "undefined")
	{
		servidor_js = host_u( archivo_js );
	}
	switch( arr_js[archivo_js] )
	{
		case 0://lo esta pidiendo
			arr_js_callback[archivo_js].push( callback_cjs );//encola el callback
			break;
		case 1://ya lo tiene
			callback_cjs( );//ejecuta el callback
			break;
		default://pide el archivo y encola el callback
			if( referenciado_cj )
			{
				var id_msgg = mensaje_growl(leyenda["cargando_entidad"],{
					referenciado : true
				});
			}
			arr_js[archivo_js] = 0 ;
			$.getScript( servidor_js + archivo_js,function(){
				if( referenciado_cj )
				{
					cierra_growl(id_msgg);
				}
				arr_js[archivo_js] = 1;
				$.each( arr_js_callback[archivo_js], function( id, funcion ) {
					funcion();
				});
			});
			arr_js_callback[archivo_js] = [callback_cjs];
			break;
	}
}
//carga una sola ves una hoja de estilos
function carga_css( archivo_css, identificador_css )
{
	if ( $.inArray( archivo_css, arr_css ) < 0 )
	{
		arr_css.push( archivo_css );
		var identificador_CSS = identificador_css ?  identificador_css : "";
		cssLink = $('<link href="' + host_u( archivo_css ) + archivo_css + '" type="text/css" rel="stylesheet" class="' + identificador_CSS + '" />');
		$("head").append(cssLink);
		if( identificador_CSS != "" && $("link." + identificador_CSS ).size() > 3)
		{
			$("link." + identificador_CSS + ":first").remove();
		}
	}
}
//servidor de trabajo de imagenes
var host_i = function()
{
	//return window.location.protocol=="https:"? window.location.protocol+"//"+window.location.hostname : "http://i.mkt.lu" ;
	return window.location.protocol+"//i.mkt.lu" ;
}
//servidor de trabajo de js y css (util)
var host_u = function()
{
	//return ( window.location.protocol=="https:"? window.location.protocol+"//"+window.location.hostname+"/f/util" : "http://u.mkt.lu" )+"/"+version_jq+"/"+idioma_jq;
	//RAEG 30/08/2011  return ( window.location.protocol+"//u.mkt.lu" )+"/"+version_jq+"/"+idioma_jq;
	return window.location.protocol+"//"+window.location.hostname+"/f/util"+"/"+version_jq+"/"+idioma_jq;
}
//crea y prepara un div para usarlo como dialog, por default es modal
function dialog_qn( div, obj_op_rec )
{
	var obj_op = $.extend({
		height : 400,
		width : 500,
		title : leyenda["dialog_qn_sin_titulo"],
		hide : "",
		show : "",
		modal : true,
		buttons : {
			"":""
		},
		botones_qn : {
			botones : {
				cerrar : {
					texto: leyenda["dialog_qn_cerrar"],
					icono:"ui-icon-circle-close",
					fn_click: function(){
						$("#"+div).dialog("close");
					}
				}
			}
		},
		autoOpen : false,
		close :  function( ) {
			$(this).remove( );
		}
	}, obj_op_rec );
	//crear div si no existe
	if ( $("#"+div).length <= 0 )
	{
		$("<div id='"+div+"'></div>").appendTo("body");
	}
	$("#"+div).dialog(obj_op);
	botones_qn( $("#"+div+" ~ .ui-dialog-buttonpane") , obj_op.botones_qn );
}

//crea un grupo de botones
function botones_qn( objeto_destino, obj_botones_qn )
{
	if(!$.isEmptyObject(objeto_destino) && !$.isEmptyObject(obj_botones_qn))
	{
		var botones_rec = obj_botones_qn.botones;
		var opciones = $.extend({
			borrar_contenido : true,
			buttonset : false,
			css : {
				textAlign : "right",
				padding: "5px 20px 5px 20px"
			}
		},obj_botones_qn.opciones);
		// Borrar los botones actuales
		if( opciones.borrar_contenido )
		{
			objeto_destino.html("");
		}
		//valores por default del boton
		$.each(botones_rec,function(indice_boton, boton){
			var obj_boton = $.extend({
				texto:"",
				clase:"",
				id:"btn_"+indice_boton,
				icono:"",
				disabled:false,
				solo_icono:false,
				fn_click: function(){},
				css : {
					margin : "0px 2px 0px 2px"
				}
			}, boton);
			//crear boton
			var boton_act = $("<button>"+obj_boton.texto+"</button>")
			.attr("id",obj_boton.id)
			.css(obj_boton.css)
			.addClass(obj_boton.clase)
			.button({
				disabled : obj_boton.disabled,
				icons : {
					primary: obj_boton.icono
				},
				text : !obj_boton.solo_icono
			})
			.click(obj_boton.fn_click)
			.appendTo(objeto_destino);
			//aplicar  buttonset
			if( opciones.buttonset )
			{
				boton_act.css( {
					margin:"0"
				} );
				objeto_destino.buttonset(opciones.buttonset);
			}
			objeto_destino.css(opciones.css);
		});
	}
}
//todas las ligas que tengan la clase edit_dialog se procesan para agregarle la funcionalidad de formularios modales las ligas deben estar generadas con la funcion liga_edicion_clase
function prepara_ligas (selector_liga_rec,clase_sel,directorio_pl)
{
	var selector_liga = ".edit_dialog";
	var clase_remover = "edit_dialog";
	var clase_liga_sel = "edit_dialog_sel";
	if( typeof( selector_liga_rec ) != "undefined" )
	{
		inicio_selector = new String( selector_liga_rec[0] );
		selector_liga = ( inicio_selector == "#" || inicio_selector == "." ) ? selector_liga_rec : "#" + selector_liga_rec;
		clase_remover = ( inicio_selector == "." ) ? selector_liga_rec.replace(".","") : clase_remover;
	}
	if( typeof( clase_sel ) != "undefined" )
	{
		clase_liga_sel = clase_sel;
	}
	$(selector_liga).each(function( )
	{
		var href = $(this).attr("href");
		partes_href = href.split("?");
		var info_peticion = interpreta_liga_edicion( partes_href[1], directorio_pl );
		$(this).bind("click.prepara_ligas", function(){
			ejecuta_liga_edicion(info_peticion,this);
			$("."+clase_liga_sel).removeClass(clase_liga_sel);
			$(this).addClass(clase_liga_sel);
			return false;
		}).removeClass(clase_remover);
	});
}
//obtiene la informacion contenida en la liga y prepara los objetos necesarios para ejecutar la peticion
function interpreta_liga_edicion( query_string, directorio_le )
{
	var obj_resp = {
		get_env : {},
		entidad : "",
		pf : {},
		archivo_jq : ""
	};
	$.each( recibe_texto( query_string ).split( "&" ), function( get_id, get_cont ){
		if( get_cont.match(/([^=\?]+)=(.*)/,'') )
		{
			obj_resp.get_env[RegExp.$1] = RegExp.$2;
		}
		if( get_cont.match(/pf\[(.+)\]=(.*)/,'') && RegExp.$1 != "fc" )//soporte de pf en arreglo de 1 nivel
		{
			obj_resp.pf[RegExp.$1] = RegExp.$2;
		}
	});
	obj_resp.entidad = recibe_texto( obj_resp.get_env["ad2[pfn]"] );
	if( obj_resp.entidad != "" && !$.isPlainObject( opciones_form[obj_resp.entidad] ) )
	{
		directorio_le = recibe_texto( directorio_le );
		obj_resp.archivo_jq = ( ( directorio_le != "" )? directorio_le : directorio_form_js) + obj_resp.entidad + sufijo_form_js + ".js";
	}
	return obj_resp;
}

function ejecuta_liga_edicion(obj_liga,liga_origen,obj_retorno)
{
	var entidad = ( obj_liga.entidad == "" ) ? "gen" : obj_liga.entidad;
	if( obj_liga.archivo_jq != "" )
	{
		carga_js( obj_liga.archivo_jq , function(){
			obj_liga.archivo_jq = "";
			ejecuta_liga_edicion(obj_liga,liga_origen);
		},1);
		return false;
	}
	var get_env = obj_liga.get_env;
	var pf = obj_liga.pf;
	var contenedor_embebido = recibe_texto( get_env["cont"] );
	//cambia_titulo_pagina( get_env.titulo );
	if( !$.isPlainObject( opciones_form[entidad] ) )
	{
		opciones_form[entidad] = { };
	}
	var opciones = $.extend({
		embebido : false,
		botones : true,
		agregado : false,
		icono_elimina_gregado : true,
		incluir_form : true,
		multi_contenedores : false,
		errorClass : "error",
		oculta_respuesta : false,
		growl_espera: false,
		growl_guardar: true,
		cerrar_guardar: false,
		validate : true,
		modal: true,
		callback_guardar : null,
		funcion_guardar : null,
		funcion_mostrar : null,
		qs_en_pf : false
	}, opciones_form[entidad]);
	if( opciones.qs_en_pf )
	{
		pf.qs_org = urlencode($(liga_origen).attr("href"));
	}
	if( opciones.cerrar_guardar )
	{
		opciones.growl_guardar = true;
	}
	var contador_entidad = recibe_entero( cont_form_entidad[entidad] ) + 1 ;
	if( opciones.agregado )
	{
		var contenedor_agregado = recibe_texto( get_env["cont_ag"] );
		if( contenedor_agregado != "" )
		{
			opciones.embebido = true;
			opciones.botones = false;
			opciones.incluir_form = (typeof(opciones_form[entidad].incluir_form) == "undefined") ? false : opciones_form[entidad].incluir_form;
			opciones.multi_contenedores = true;
			pf.indice_campos = contador_entidad;
			contenedor_embebido = contenedor_agregado
		}
		else
		{
			opciones.agregado = false;
		}
	}
	if( !opciones.modal )
	{
		opciones.multi_contenedores = true;
	}
	if( opciones.multi_contenedores )
	{
		cont_form_entidad[entidad] = contador_entidad ;
	}

	var complemento_id = recibe_texto( cont_form_entidad[entidad] );
	var div_modal = nombre_div_modal + entidad + complemento_id;
	var form_modal = nombre_form_modal + entidad + complemento_id;
	var cont_div_cont = "<div id=\"cont_"+form_modal+"\" class=\"cont_form\"></div>";
	var cont_div_resp = "<div id=\"resp_"+form_modal+"\" class=\"resp_form\"></div>";
	var contenido_form_modal = "" ;
	if( opciones.incluir_form )
	{
		contenido_form_modal  = cont_div_resp;
		contenido_form_modal += "<form id=\""+form_modal+"\" class=\"form_modal\" style='margin: 2px 0px 0px 0px;' accept-charset=\"UTF-8\" >";
		contenido_form_modal += cont_div_cont;
		contenido_form_modal += "</form>";
	}
	else
	{
		contenido_form_modal = cont_div_cont;
	}
	opciones.title = unescape(recibe_texto(get_env["titulo"]));
	var arr_consulta ;
	if( opciones.botones )
	{
		var obj_botones_ele = {
			botones : {
				recargar : {
					texto : leyenda["formulario_recargar"],
					icono : "ui-icon-refresh",
					disabled : false,
					id : "btn_recargar_" + form_modal,
					fn_click : function(){
						confirmar(leyenda["formulario_recarga_tit"],leyenda["formulario_recarga_msg"],function(){
							pet_interfaz( arr_consulta );
						});
						return false;
					}
				},
				cancelar : {
					texto : leyenda["formulario_cancelar"],
					icono : "ui-icon-circle-close",
					id : "btn_cancelar_" + form_modal,
					fn_click : function(){
						if( opciones.embebido )
						{
							actualiza_listado( contenedor_embebido, entidad );
						}
						else
						{
							$("#"+div_modal).dialog("close");
						}
						return false;
					}
				},
				guardar : {
					texto : leyenda["formulario_guardar"],
					icono : "ui-icon-disk",
					id : "btn_guardar_" + form_modal,
					disabled : true,
					fn_click : function(){
						$("#"+form_modal).submit();
						return false;
					}
				}
			}
		};
		opciones.botones_qn = $.extend( true, obj_botones_ele, opciones.botones_qn );
	}
	arr_consulta = arr_resp( recibe_texto( get_env["fm"] ), recibe_texto( get_env["ad[fn]"] ), "cont_"+form_modal+"" );
	if( typeof(get_env["vi"]) != "undefined" )
	{
		arr_consulta.vi = get_env["vi"];
	}
	if( typeof(get_env["ln"]) != "undefined" )
	{
		arr_consulta.ln = get_env["ln"];
	}
	arr_consulta.pf = pf;
	arr_consulta.funcion_mostrar = opciones.funcion_mostrar;

	var div_cont_form = opciones.embebido ? "cont_" + form_modal : div_modal;
	var contenido_iframe = false;
	if( typeof( get_env["sc"] ) != "undefined" )
	{
		contenido_form_modal = "<iframe id=\"" + div_cont_form + "\" frameborder=\"0\" ></iframe>";
		contenido_iframe = true ;
	}
	//manipular el formulario
	var arr_guardar = arr_resp( recibe_texto( get_env["fm2"] ), recibe_texto( get_env["ad2[fn]"] ) );

	arr_guardar.ad.pfn = get_env["ad2[pfn]"];
	if( typeof(get_env["vi2"]) != "undefined" )
	{
		arr_guardar.vi = get_env["vi2"];
	}
	if( typeof(get_env["ln"]) != "undefined" )
	{
		arr_guardar.ln = get_env["ln"];
	}
	arr_guardar.estado_pet = "guardar";
	arr_guardar.formulario = form_modal;
	arr_guardar.complemento = complemento_id;

	arr_guardar.accJq = function(resp){
		procesa_respuesta_guardar( resp, entidad, form_modal , recibe_texto( get_env["cont"] ),arr_consulta,arr_guardar,opciones);
		if( opciones.oculta_respuesta )
		{
			setTimeout("$(\"#resp_"+form_modal+"\").fadeOut('slide')",recibe_entero( opciones.oculta_respuesta ));
		}
	};

	if( typeof(get_env["control[ag]"]) != "undefined" )
		arr_guardar["control[ag]"] = get_env["control[ag]"];
	if( typeof(get_env["control[fn]"]) != "undefined" )
		arr_guardar["control[fn]"] = get_env["control[fn]"];
	if( typeof(get_env["control[fm]"]) != "undefined" )
		arr_guardar["control[fm]"] = get_env["control[fm]"];

	if (opciones.agregado)
	{
		var jq_agregado = $("<div></div>").addClass("cont_agregado").html(contenido_form_modal)
		.attr("id","cont_"+form_modal+"_ag_"+contador_entidad).appendTo("#"+contenedor_embebido);
		if(opciones.icono_elimina_gregado)
		{
			var boton_el = $("<button>&nbsp;</button>").addClass("ui-icon-only-qn").button({
				icons: {
					primary:"ui-icon-trash"
				},
				text: false
			}).click( function(){
				$(jq_agregado).remove();
			});
			$("<div></div>").addClass("quitar_agregado").append(boton_el).prependTo(jq_agregado);
		}
	}
	else
	{
		if( opciones.embebido )
		{
			if( contenedor_embebido != "")
			{
				if( contenido_iframe )
				{
					$("#"+contenedor_embebido).html(contenido_form_modal);
				}
				else
				{
					arr_consulta.div_principal = contenedor_embebido ;
					arr_consulta.pre_accJq = function( ){
						$("#"+contenedor_embebido).html(contenido_form_modal).css( {
							position :"relative"
						}) ;
						var contenido_botones = '<div class="buttonpane-qn" id="botones_'+form_modal+'" style="padding-top: 7px;"></div>';
						$("#cont_"+form_modal).after(contenido_botones);
						botones_qn( $("#botones_" + form_modal) , opciones.botones_qn );
					}
				}
			}
		}
		else
		{
			dialog_qn(div_modal,opciones);
			$('#'+div_modal).html(contenido_form_modal);
		}
	}
	if( opciones.validate !== false  )
	{
		opciones.validate = {
			submitHandler: function()
			{
				if ( $.isFunction(opciones.funcion_guardar) )
				{
					opciones.funcion_guardar(form_modal,div_modal,arr_guardar,liga_origen);
				}
				else
				{
					inhabilita_form(form_modal,div_modal);
					pet_interfaz(arr_guardar);
				}
			},
			errorClass: opciones.errorClass
		};
	}
	var nombre_funcion = "prepara_formulario_" + entidad;
	var funcion_prepara = new Function("form_modal","div_cont_form","liga_origen", "if(typeof(" + nombre_funcion + ")=='function') " + nombre_funcion +" (form_modal,div_cont_form,liga_origen);");
	if(!contenido_iframe)
	{
		arr_consulta.accJq = function( ){
			$("#"+form_modal+"").placeholder_submit_qn(); // @@ SI VA, VZ
			$("#"+form_modal+"").validate(opciones.validate);
			funcion_prepara(form_modal,div_cont_form,liga_origen);
			if(opciones.botones)
			{
				libera_botones_modal(form_modal,entidad);
			}
		};
		pet_interfaz(arr_consulta);
	}
	else
	{
		opciones.validate.submitHandler = function(){
			this.submit();
		}
		$('#'+div_cont_form).css({
			width: opciones.width,
			height: opciones.height,
			opacity : "hidden"
		})
		.load(function(){
			$(this).animate({
				"opacity": "show"
			}, "slow",funcion_prepara);
		//$(this).contents().find( "form" ).validate(opciones.validate);
		})
		.attr("src",$(liga_origen).attr("href")+"&nfz=0");
	}
	if( !opciones.embebido || contenedor_embebido == "" )
	{
		$('#'+div_modal).dialog('open');
	}
	if( obj_retorno === true )
	{
		return {
			mostrar:arr_consulta,
			guardar : arr_guardar
		}
	}
	return false;
}

function inhabilita_form(form_modal,div_modal)
{
	$("#resp_"+form_modal).html(cont_procesando()).show().css({
		marginLeft : (recibe_entero($("#cont_"+form_modal).css("width"))/2) - 150,
		height : 70,
		width : 300,
		position:"absolute",
		zIndex:10000
	});
	$("<div></div>").addClass("ui-widget-overlay").attr("id","contfin_"+form_modal).appendTo('#cont_'+form_modal);
	$("#btn_guardar_"+form_modal).button( "option", "disabled", true );
	$("#"+div_modal).css({
		overflow : "hidden"
	});
}
function recupera_relogueo( opciones_rr )
{
	if( typeof opciones_rr.respuesta != undefined )
	{
		if( opciones_rr.respuesta.resultado == 0 && typeof opciones_rr.respuesta.mensaje_metodo != "undefined")
		{
			mensaje_resp = forma_relogueo( opciones_rr.respuesta.mensaje_metodo, opciones_rr.respuesta.respuesta,"", function( accion){
				if( accion != "cancel" && typeof opciones_rr.funcion_reincorpora == "function" )
				{
					opciones_rr.funcion_reincorpora()
				}
			} );
			alert_(mensaje_resp,"","",{
				width:500,
				height:350
			} );
		}
		else
		{
			if( typeof opciones_rr.funcion == "function" )
			{
				opciones_rr.funcion();
			}
		}
	}
}
function forma_relogueo( mensaje_metodo_fr, respuesta_fr, arr_pet_fr, callback_fr_per )
{
	var mensaje_resp_fr =  leyenda["formulario_guardar_error"] + "<br />" + recibe_texto(respuesta_fr);
	var liga_forma_fr, funcion_alterna_fr, titulo_fr;
	//investigar el tipo de formulario a procesar
	if( typeof mensaje_metodo_fr.forma_liga != "undefined") //formulario de logueo
	{
		liga_forma_fr = recibe_texto( mensaje_metodo_fr.forma_liga ); //liga para el popup
		titulo_fr = leyenda["forma_logueo_requerido"]; //titulo del popup
		//funcion alterna; mostrar el formulario traido con ajax segun la informacion de la liga que recibimos
		funcion_alterna_fr = function(){
			carga_js("/funciones/jq/qn/logueo_modal.js",function(){
				opciones_form.logueo_modal.respuesta_servidor = respuesta_fr;  //mensaje de error, se mustra en el formulario de logueo
				//construccion, configuracion y ejecucion de la peticion
				var obj_fl = interpreta_liga_edicion( liga_forma_fr  );
				obj_fl.get_env.titulo = leyenda["forma_logueo_requerido"];  //titulo del modal
				ejecuta_liga_edicion( obj_fl );
			});
		}
	}
	if( typeof mensaje_metodo_fr.forma_capcha != "undefined") //formulario de capcha
	{
		liga_forma_fr = recibe_texto( mensaje_metodo_fr.forma_capcha ); //liga para el popup
		titulo_fr = leyenda["forma_capcha_titulo"];
		//funcion alterna; mostrar en un modal el formulario recibido en la respuesta del servidor (mensaje_resp_fr)
		funcion_alterna_fr = function(){
			dialog_qn(nombre_div_modal+"capcha",{
				title: leyenda["forma_capcha_titulo"],
				autoOpen : true,
				width:500,
				height:220,
				botones_qn : {
					botones : {
						cerrar : {
							texto: leyenda["dialog_qn_cerrar"],
							icono:"ui-icon-circle-close",
							fn_click: function(){
								$("#"+nombre_div_modal+"capcha").dialog("close");
							}
						},
						guardar : {
							texto : leyenda["formulario_guardar"],
							icono : "ui-icon-disk",
							id : "btn_guardar_" + nombre_form_modal+"capcha",
							fn_click : function(){
								$("#"+nombre_form_modal+"capcha").submit();
								return false;
							}
						}
					}
				}
			});
			$("#"+nombre_div_modal+"capcha").html("<form action=\""+liga_forma_fr+"\" method=\"post\" target=\"_blank\" id=\""+nombre_form_modal+"capcha\" > "+mensaje_resp_fr+"</form>");
		}
	}
	callback_firma = "";
	function_carga_relogueo = function() //funcion para mostrar de nuevo el formulario en caso de ser necesario
	{
		forma_relogueo( mensaje_metodo_fr, respuesta_fr, arr_pet_fr );
	}
	if( recibe_texto( liga_forma_fr ) != "")
	{
		//configurar el envio de la peticion de nuevo al recibir respuesta del envio correcto del formulario
		callback_firma = function( accion ){
			$("#alert_jq").dialog("close");
			$("#"+nombre_div_modal+"logueo_modal").dialog("close");
			$("#"+nombre_div_modal+"capcha").dialog("close");
			if( accion != "cancel" )
			{
				if( typeof callback_fr_per == "function" )//si se recibio un callback personalizado (listado_jq.js)
				{
					callback_fr_per( accion );
				}
				else
				{
					if( $.isPlainObject( arr_pet_fr ) )
					{
						pet_interfaz(arr_pet_fr);
					}
					else
					{
						alert_(leyenda["error_recarga"]);
					}
				}
			}
			callback_firma = "";
		}

		var protocolo_https = ( window.location.protocol == "https:" )
		if( !protocolo_https )
		{
		//tratar de mostrar el formulario en un popup
		var width="500", height="350";
		var left = (screen.width/2) - width/2;
		var top = (screen.height/2) - height/2;
		if( msg_callback_firma && !msg_callback_firma.closed)
		{
			msg_callback_firma.close();
		}

		msg_callback_firma = open(liga_forma_fr, '', 'toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=yes,width='+width+',height='+height+',left='+left+', top='+top+',screenX='+left+',screenY='+top+'');

		}
		//mostrar el formulario
		if( !protocolo_https && msg_callback_firma )// si se pudo mostrar el formualario en un popup se bloquea la pagina con un alert_
		{
			alert_(
				leyenda["forma_relogueo_espera"].replace("{","<a style=\"text-decoration:underline\" href=\"javascript:function_carga_relogueo();\">").replace("}","</a>") ,
				titulo_fr,
				"locked",
				{
					width:400,
					height:150,
					botones_qn : {},
					buttons: false
				}
				);
			msg_callback_firma.focus();
		}
		else //si falla abrir el popup se ejecuta la funcion alterna
		{
			funcion_alterna_fr();
		}
		mensaje_resp_fr = ""
	}
	return mensaje_resp_fr;
}

//despues de guardar un formulario  se procesa la respuesta y se vuelve a cargar el formulario con los datos nuevos
function procesa_respuesta_guardar(arr_resp_json,entidad_pr,form_modal_pr,listado_act_pr,arr_consulta_pr,arr_guardar_pr,opciones_pr)
{
	var mensaje_resp = "";
	opciones_pr = $.extend({
		growl_guardar : true
	},opciones_pr);
	arr_resp_json.respuesta = recibe_texto( arr_resp_json.respuesta );
	listado_act_pr = recibe_texto( listado_act_pr );
	if (!arr_resp_json)
	{
		return false;
	}
	switch( recibe_texto( arr_resp_json.resultado ) )
	{
		case "0":
			if( $.isPlainObject( arr_resp_json.mensaje_metodo ) )
			{
				mensaje_resp = forma_relogueo( arr_resp_json.mensaje_metodo, arr_resp_json.respuesta, arr_guardar_pr );
			}
			else
			{
				mensaje_resp = arr_resp_json.respuesta;
			}

			break;
		case "1":
			mensaje_resp =  mensaje_ok() ;
			if( listado_act_pr != "")
			{
				setTimeout("actualiza_listado('"+listado_act_pr+"','"+entidad_pr+"'); ",500);
			}
			if( $.isFunction( opciones_pr.callback_guardar ) )
			{
				opciones_pr.callback_guardar( arr_resp_json );
			}
			if( opciones_pr.cerrar_guardar )
			{
				$("#"+nombre_div_modal + entidad_pr + arr_guardar_pr.complemento ).dialog("close");
			}
			else
			{
				//solo entraria aqui si es formulario de agregar
				if ( typeof arr_resp_json.control != "undefined" && arr_resp_json.respuesta != "" )
				{
					//alert(arr_resp_json["control"]["ag"] +":"+arr_consulta_pr[arr_resp_json["control"]["ag"]] )
					//solo la primera vez
					if ( typeof arr_consulta_pr[arr_resp_json.control.ag] == "undefined" )
					{
						//agregar el id inicial
						arr_consulta_pr[arr_resp_json.control.ag] = arr_resp_json.respuesta;
						if( typeof arr_guardar_pr[arr_resp_json.control.ag] == "undefined" )
						{
							arr_guardar_pr[arr_resp_json.control.ag] = arr_resp_json.respuesta;
						}
						//cambiar el metodo
						if( typeof arr_resp_json.control.fn != "undefined" )
						{
							arr_guardar_pr.ad.fn = arr_resp_json.control.fn;
						}
						//cambiar la clase
						if( typeof arr_resp_json.control.fm != "undefined" )
						{
							arr_guardar_pr.fm = arr_resp_json.control.fm;
						}
						pet_interfaz(arr_consulta_pr);
					}
				}
			}
			break;
		default:
			mensaje_resp += mensaje_error( leyenda["formulario_error_respuesta"] );
			break;
	}
	if( opciones_pr.growl_guardar )
	{
		if( arr_resp_json.resultado == 1)
		{
			mensaje_growl( mensaje_resp );
		}
		else
		{
			alert_(mensaje_resp,"","",{
				width:500,
				height:350
			} );
		}
	}
	else
	{
		$('#resp_'+form_modal_pr).html( mensaje_resp );
	}
	if(opciones_pr.botones)
	{
		libera_botones_modal(form_modal_pr,entidad_pr);
		$("#btn_cancelar_"+form_modal_pr)
		.button("option", "label", leyenda["formulario_continuar"])
		.button("option", "icons", {
			primary:'ui-icon-check'
		})
		.button("refresh");
	}
	$("#contfin_"+form_modal_pr).remove();
	$("#resp_"+form_modal_pr).hide();
	return true;
}

function mensaje_growl(mensaje_mg,obj_mg)
{
	mensaje_mg = recibe_texto(mensaje_mg);
	if( mensaje_mg != "" )
	{
		mensaje_mg = mensaje_mg.replace("ui-state-highlight","");
		var obj_msgrowl = $.extend({
			//theme: 'manilla',
			speed: 'slow',
			life:2000
		},obj_mg);
		var id_msg = null;
		if( obj_msgrowl.referenciado )
		{
			id_msg = arr_mensajes_jgrowl.length;
			arr_mensajes_jgrowl[id_msg] = null ;
		}
		carga_js("/funciones/jq/jquery.jgrowl.js",function(){
			$.jGrowl.defaults.closer = false;
			if( obj_msgrowl.referenciado )
			{
				obj_msgrowl.open = function ()
				{
					arr_mensajes_jgrowl[id_msg] = this ;
				}
				obj_msgrowl.sticky = true
			}
			$.jGrowl(mensaje_mg,obj_msgrowl );
		});
		carga_css("/funciones/jq/css/jquery.jgrowl.css");
		return id_msg;
	}
	return false;
}
function cierra_growl( id_growl_cg, espera_cg )
{
	id_growl_cg = recibe_entero(id_growl_cg);
	if( typeof arr_mensajes_jgrowl[id_growl_cg] != "undefined")
	{
		if( arr_mensajes_jgrowl[id_growl_cg] != null )
		{
			$(arr_mensajes_jgrowl[id_growl_cg]).trigger("jGrowl.beforeClose");
		}
		else
		{
			if( recibe_entero( espera_cg ) < 10 )
			{
				setTimeout("cierra_growl("+ id_growl_cg +","+ (recibe_entero(espera_cg)+1)+")",500);
			}
		}
	}
}
//sustituto del alert tradicional
function alert_(mensaje_al,titulo_al,icono_al,obj_alert_rec)
{
	mensaje_al = recibe_texto( mensaje_al ) ;
	if( mensaje_al != "")
	{
		titulo_al = recibe_texto( titulo_al ) == "" ? titulo_al = leyenda["formulario_titulo_alert"] : recibe_texto( titulo_al );
		icono_al = recibe_texto( icono_al ) == "" ? "alert" : recibe_texto( icono_al );
		var obj_alert = $.extend({
			show : "",
			hide : "",
			height : 160,
			width : 380,
			modal : true,
			buttons : {
				"":""
			},
			botones_qn : {
				botones : {
					cerrar : {
						texto: leyenda["dialog_qn_cerrar"],
						icono:"ui-icon-circle-close",
						fn_click: function(){
							$("#alert_jq").dialog("close");
						}
					}
				}
			},
			autoOpen : true,
			title : titulo_al
		}, obj_alert_rec);
		var cont_alert = '';//'<p>';
		var estilos_mensaje = '';
		if( mensaje_al.indexOf("ui-icon-")==-1 )
		{
			cont_alert += '<span class="ui-icon ui-icon-' + icono_al + '" style="float:left;">&nbsp;</span>';
			estilos_mensaje = " style=\"width:"+recibe_entero( obj_alert.width-45 )+"px; float:right;\" ";
		}
		cont_alert += "<div"+estilos_mensaje+">" + mensaje_al + "</div>";
		//cont_alert += '</p>';
		dialog_qn("alert_jq",obj_alert);
		$("#alert_jq").html(cont_alert);
	}
}
//sustituto del confirm tradicional
function confirmar(titulo_c,mensaje_c,funcion_c,obj_confirm_rec)
{
	var cont_confirm  = '<p>';
	cont_confirm += '<span class="ui-icon ui-icon-info" style="float:left; margin:0 7px 20px 0;">&nbsp;</span>';
	cont_confirm += "<div>" + mensaje_c + "</div>";
	cont_confirm += '</p>';
	var obj_confirm= $.extend({
		show: "",
		hide: "",
		height: 150,
		width: 380,
		buttons : {
			"":""
		},
		botones_qn : {
			botones : {
				cancelar : {
					texto: leyenda["formulario_cancelar"],
					icono: "ui-icon-circle-close",
					fn_click: function(){
						$("#confirm_recarga").dialog("close");
					}
				},
				continuar : {
					texto: leyenda["formulario_continuar"],
					icono: "ui-icon-circle-check",
					fn_click: function(){
						funcion_c();
						$("#confirm_recarga").dialog("close");
					}
				}
			}
		},
		autoOpen: true,
		title: titulo_c
	},obj_confirm_rec);
	dialog_qn("confirm_recarga", obj_confirm);
	$("#confirm_recarga").html(cont_confirm);
}
function prepara_botones(css_object_pb)
{
	$(".btn-qn").each(function (){
		var css_object = {
			fontWeight : "normal"
		};
		var boton_object = {
			icons: {},
			text: true
		};
		var nombre_icono = "";
		var pos = "izq";
		$.each($(this).attr("class").split(/[ ]+/), function(id_c, clase) {
			if( this.match(/btn-qn-pos-icon-(.*)/,'') )
			{
				pos = RegExp.$1;
			}
			else if( this.match(/btn-qn-(.*)/,'') )
			{
				nombre_icono = "ui-icon-"+ RegExp.$1;
			}
		});
		switch(pos)
		{
			case "solo":
				boton_object.text = false;
				$(this).addClass("ui-icon-only-qn");
			case "izq":
				boton_object.icons.primary = nombre_icono;
				break;
			case "der":
				boton_object.icons.secondary = nombre_icono;
				break;
		}
		$(this).css($.extend(css_object,css_object_pb)).button( boton_object ).removeClass("btn-qn");
	});
}
//carga el listado desde donde abrimos el modal, solo si aplica
function actualiza_listado(id_div_al,entidad_al,callback_al)
{
	id_div_al = recibe_texto( id_div_al );
	entidad_al = recibe_texto( entidad_al )
	if( id_div_al != ""  )
	{
		var datos_peticion = recibe_texto( $("#"+id_div_al).attr("dlist") ).split("||");
		if ( datos_peticion.length == 5)
		{
			//con la implementacion de permisos puede ser que no lleguen el metodo o la clase con la que se va a a ejecutar la peticion
			if( datos_peticion[0] != "" &&  datos_peticion[1]!="")
			{
				var arr_pet_al = arr_resp(datos_peticion[0],datos_peticion[1],id_div_al);
				arr_pet_al.vi = datos_peticion[2];
				arr_pet_al.ln = datos_peticion[4];
				arr_pet_al.pf = {};
				$.each( datos_peticion[3].split("|_|") ,function( ){
					if( this.match(/([^=]+)=(.*)/,'') )
					{
						arr_pet_al.pf[RegExp.$1] = RegExp.$2;
					}
				});
				arr_pet_al.accJq = function(){
					prepara_ligas();
					if( $.isPlainObject( opciones_form[entidad_al] ) )
					{
						if ( $.isFunction( opciones_form[entidad_al].funcion_listado ) )
						{
							opciones_form[entidad_al].funcion_listado( );
						}
					}
					if( $.isFunction(callback_al) )
					{
						callback_al();
					}
				}
				pet_interfaz(arr_pet_al) ;
			}
		}
	}
	return false;
}

function prepara_paginado(id_cont_paginado,funcion_procesa_pp,ancla_paginado,obj_p_rec)
{
	ancla_paginado = recibe_texto( ancla_paginado );
	var obj_p = $.extend({
		prefijo : "pag_",
		pagina : "pagina"
	},obj_p_rec);
	if( $.isFunction( funcion_procesa_pp ) )
	{
		$("."+obj_p.prefijo+"navega_parcial_sel", "#"+id_cont_paginado).each(function(){
			var cont_paginado = this;
			var obj_paginado_ext = {};
			$(this).removeClass(obj_p.prefijo+"navega_parcial_sel");
			$(cont_paginado).find("a").each(function(){
				var obj_paginado = {};
				var partes_href = $(this).attr("href").split("?");
				if( partes_href.length == 2 )
				{
					$.each( partes_href[1].split("&"), function( get_id, get_cont ){
						if( get_cont.match(/([^=]+)=(.*)/,'') )
						{
							obj_paginado[RegExp.$1] = RegExp.$2;
						}
					});
				}
				$(this).click( function ()
				{
					funcion_procesa_pp(obj_paginado,id_cont_paginado);
					return (ancla_paginado != "");
				});
				if( ancla_paginado != "" )
				{
					$(this).attr("href","#"+ancla_paginado);
				}
				obj_paginado_ext = copy(obj_paginado);
			});
			var select_paginado = $("."+obj_p.prefijo+"select", "#"+id_cont_paginado);
			var pagina_actual = $(cont_paginado).find("."+obj_p.prefijo+"pagina_actual").html();
			if ( select_paginado.length > 0)
			{
				var input = $("<input value='"+pagina_actual+"' name='"+select_paginado.attr("name")+"'>")
				.addClass("ui-widget ui-widget-content").css({
					padding:"5px",
					width:"35px"
				}).autocomplete({
					source: function(request, response) {
						var matcher = new RegExp(request.term, "i");
						response(select_paginado.children("option").map(function() {
							var text = $(this).text();
							if (!request.term || matcher.test(text))
								return {
									id: $(this).val(),
									value: text
								};
						}));
					},
					delay: 0,
					select: function(e, ui) {
						if( pagina_actual != ui.item.value )
						{
							obj_paginado_ext[obj_p.pagina] = ui.item.value;
							funcion_procesa_pp(obj_paginado_ext,id_cont_paginado);
						}
						$(this).focus();
						return false;
					},
					minLength: 0
				}).keydown(function(event){
					if (event.keyCode == 13) {
						input.autocomplete("close");
						obj_paginado_ext[obj_p.pagina] = $(this).val();
						funcion_procesa_pp(obj_paginado_ext,id_cont_paginado);
						return false;
					}
				});
				$(cont_paginado).append(input);
				select_paginado.remove();
				$("<button>&nbsp;</button>")
				.insertAfter(input)
				.button({
					icons: {
						primary: "ui-icon-circle-triangle-s"
					},
					text: false
				}).removeClass("ui-corner-all")
				.addClass("ui-corner-right ui-button-icon")
				.position({
					my: "left center",
					at: "right center",
					of: input,
					offset: "-1 0"
				}).css("top", "")
				.click(function() {
					if (input.is(":visible")) {
						input.autocomplete("close");
						input.val(pagina_actual);
						input.hide();
						return false;
					}
					input.show();
					input.autocomplete("search", "");
					input.autocomplete("widget").css({
						height:"100px",
						overflow:"auto",
						width:"55px",
						position:"absolute"
					});
					input.focus();
					return false;
				});
				input.css({
					display:"none"
				});
			}
			$(cont_paginado).find("."+obj_p.prefijo+"pagina_actual").wrap("<button disabled=''>");
			$(cont_paginado).find("."+obj_p.prefijo+"pagina_actual").parents("button").addClass("ui-state-highlight").css({
				borderColor:""
			});

			$(cont_paginado).find("."+obj_p.prefijo+"inactivo").each(function () {
				$(this).wrap("<button disabled=''>").addClass("ui-icon-only-qn");
			});
			$(cont_paginado).buttonset();
			$(cont_paginado).find("."+obj_p.prefijo+"pagina_actual").parents("button").removeClass("ui-state-disabled");

			$(cont_paginado).find("."+obj_p.prefijo+"anterior").button( {
				icons : {
					primary:'ui-icon-seek-prev'
				},
				text : false
			} );
			$(cont_paginado).find("."+obj_p.prefijo+"anterior").parents("button").button(
			{
				icons : {
					primary:'ui-icon-seek-prev'
				},
				text : false
			} );

			$(cont_paginado).find("."+obj_p.prefijo+"siguiente").button( {
				icons : {
					primary:'ui-icon-seek-next'
				},
				text : false
			});
			$(cont_paginado).find("."+obj_p.prefijo+"siguiente").parents("button").button({
				icons : {
					primary:'ui-icon-seek-next'
				},
				text : false
			});

			$(cont_paginado).find("."+obj_p.prefijo+"inicio").button({
				icons : {
					primary:'ui-icon-seek-first'
				},
				text : false
			});
			$(cont_paginado).find("."+obj_p.prefijo+"inicio").parents("button").button({
				icons : {
					primary:'ui-icon-seek-first'
				},
				text : false
			});

			$(cont_paginado).find("."+obj_p.prefijo+"fin").button({
				icons : {
					primary:'ui-icon-seek-end'
				},
				text : false
			});
			$(cont_paginado).find("."+obj_p.prefijo+"fin").parents("button").button({
				icons : {
					primary:'ui-icon-seek-end'
				},
				text : false
			});
		});
	}
}

//funciones complementarias
function recibe_json( cadena_json )
{
	try{
		if( cadena_json.match(/^[^\{]+(\{.*\})[^\}]+$/,'') )
		{	
			cadena_json = RegExp.$1;
		}
		var arr_json = $.parseJSON( cadena_json );
		return arr_json;
	}
	catch( err ){
		alert( cadena_json );
		return false;
	}
}
//se asegura que las variables recibidas sean texto
function recibe_texto( var_rec )
{
	return ( typeof( var_rec ) == "undefined" ) ? "" :  "" + var_rec;
}
function recibe_entero( num_entero , base_num )
{
	if( typeof( base_num ) == "undefined" )
	{
		base_num= 10;
	}
	return isNaN( parseInt( num_entero, base_num ) ) ? 0 : parseInt( num_entero, base_num );
}
function recibe_flotante( num_entero )
{
	return isNaN( parseFloat( num_entero ) ) ? 0 : parseFloat(num_entero);
}
function html_entity_decode (str)
{
	var tarea=$("<textarea></textarea>");
	tarea.html(str);
	var str_ret = tarea.html();
	tarea.remove();
	return str_ret;
}
function cambia_titulo_pagina( titulo_p )
{
	var nuevo_titulo = recibe_texto( titulo_p );
	if( nuevo_titulo != "" )
	{
		titulo_p = html_entity_decode( unescape( titulo_p ) );
		titulo_p = titulo_p + ( titulo_pagina != "" ?  " | " : "" ) + titulo_pagina;
	}
	else
	{
		titulo_p = titulo_pagina;
	}
	document.title = titulo_p ;
}

/*interfaz*/

var cont_procesando =  function (){
	var txt_procesando = '<div style="padding: 0px 5px;  margin:10px; overflow:hidden" class="ui-state-highlight ui-corner-all">';
	txt_procesando += '<p><span style="float: left; margin-right: 0.3em; margin-left: 0.3em;" class="ui-icon ui-icon-gear" />';
	txt_procesando += "<span style='font-size:11px; padding: 3px 3px 3px 25px;'>"+leyenda["formulario_procesando"]+"</span>";
	txt_procesando += "<img src='"+host_i()+"/util/procesando.gif' />";
	txt_procesando += '</p></div>';
	return txt_procesando;
}

function mensaje_error(mensaje_resp)
{
	if( typeof(mensaje_resp) == "undefined" )
	{
		mensaje_resp = "<br>"+leyenda["formulario_guardar_error"];
	}
	var cont_error =  '<div style="padding: 0px 5px;" class="ui-state-error ui-corner-all">';
	cont_error += '<p><span style="float: left; margin-right: 0.3em;" class="ui-icon ui-icon-closethick"/>';
	cont_error += mensaje_resp+'.</p>';
	cont_error += '</div>';
	return cont_error;
}

function mensaje_ok()
{
	var cont_ok =  '<div style="padding: 0px 5px;" class="ui-state-highlight ui-corner-all">';
	cont_ok += '<p><span style="float: left; margin-right: 0.3em;" class="ui-icon ui-icon-check"/>';
	cont_ok += leyenda["formulario_guardar_ok"]+'.</p>';
	cont_ok += '</div>';
	return cont_ok;
}

function libera_botones_modal(form_modal_lbm, entidad_lbm)
{
	if(typeof entidad_lbm!="undefined")
	{
		var div_modal_lbm = nombre_div_modal + entidad_lbm;
		$("#botones_"+div_modal_lbm).fadeIn(1500);
	}
	$("#btn_guardar_"+form_modal_lbm).button( "option", "disabled", false );
	$("#btn_cancelar_"+form_modal_lbm).button( "option", "disabled", false );
	$("#btn_recargar_"+form_modal_lbm).button( "option", "disabled", false );
}

function prepara_autocomplete(obj_jq, conf_ac_pa)
{
	if( typeof conf_ac_pa.source== "undefined" )
		alert("Autocomplete Error: undefined source");

	var conf_autocomplete= $.extend({
		delay: 0 ,
		minLength: 0 ,
		height : 150,
		width : obj_jq.innerWidth()+2,
		keydown : function(event){
			if (event.keyCode == 13) {
				obj_jq.autocomplete("close");
				$(this).removeClass("ui-autocomplete-loading");
			}
		}
	} , conf_ac_pa);
	if( typeof conf_ac_pa.select=="function" )
	{
		conf_autocomplete.select= function(event, ui){
			setTimeout(function(){
				conf_ac_pa.select(event, ui);
			},120);
		}
	}

	obj_jq.attr({
		"data-ac_width" : conf_autocomplete.width,
		"data-ac_height" : conf_autocomplete.height
	}).autocomplete(conf_autocomplete);

	obj_jq
		.bind("keydown.autocomplete", conf_autocomplete.keydown)
		.autocomplete("widget").css({
			overflow : "auto"
		});
	return obj_jq;
}
// se sobreescribe para poder controlar las respuestas que indican que ya perdio la sesion
$.ui.autocomplete.prototype._response= function( content )
{
	var this_ = this;
	recupera_relogueo( {
		respuesta : content,
		funcion : function(){
			if ( content && content.length ) {
				content = this_._normalize( content );
				this_._suggest( content );
				this_._trigger( "open" );
			} else {
				this_.close();
			}
			this_.element.removeClass( "ui-autocomplete-loading" );
		},
		funcion_reincorpora : function(){
			this_.search();
			this_.element.focus();
		}
	} );
};
// Se sobreescribe para poder controlar el ancho de las sugerencias
$.ui.autocomplete.prototype._suggest= function( items ) {
	var ul = this.menu.element
			.empty()
			.zIndex( this.element.zIndex() + 1 ),
		width = parseInt(this.element.attr("data-ac_width")),
		height = parseInt(this.element.attr("data-ac_height")),
		menuWidth,
		textWidth,
		menuHeight,
		ul_width,
		ul_height;
	this._renderMenu( ul, items );
	// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
	this.menu.deactivate();
	this.menu.refresh();
	this.menu.element.show().position({
		my: "left top",
		at: "left bottom",
		of: this.element,
		collision: "none"
	});
	if(width == "")
	{
		menuWidth = ul.width( "" ).width();
		textWidth = this.element.width();
		ul_width = Math.max( menuWidth, textWidth );
	}
	else
	{
		ul_width = width + 18;
	}
	menuHeight = ul.height( "" ).height();
	ul_height = Math.min( height, menuHeight );
	ul.width( ul_width );
	ul.height( ul_height );
};
// Se sobreescribe para poder capturar las palabras buscadas
$.ui.autocomplete.prototype._renderMenu = function( ul, items ) {
	this.palabrasBuscar= this.term.split(/[\s]+/g);
    var self = this;
    $.each( items, function( index, item ) {
        self._renderItem( ul, item );
    });
};
// Se sobreescribe para poder controlar los estilos de las sugerencias
$.ui.autocomplete.prototype._renderItem = function( ul, item) {
	var attr_class= ($(ul).children().length%2==0)? "" : " class=\"ui-menu-item-par\"";
	var texto_final= new String(item.label);
	var indice_palabra, regex, width = this.element.attr("data-ac_width");

	for(indice_palabra in this.palabrasBuscar)
	{
		regex = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+ this.palabrasBuscar[indice_palabra] +")(?![^<>]*>)(?![^&;]+;)", "gi");
		texto_final= texto_final.replace(regex, "<strong>$1</strong>");
	}
	return $( "<li"+attr_class+" " + ((width == "")? "" : "style=\"width:" + width + "px;\"") + "></li>" )
		.data( "item.autocomplete", item )
		.append( "<a>" + texto_final + "</a>" )
		.appendTo( ul );
};

function clases_ordenar()
{
	if( $.browser.mozilla )
	{
		return {
			up:"elemento_up_moz",
			down:"elemento_down_moz"
		}
	}
	if( $.browser.msie )
	{
		return {
			up:"elemento_up_ie",
			down:"elemento_down_ie"
		}
	}
	if( $.browser.safari )
	{
		return {
			up:"elemento_up_safari",
			down:"elemento_down_safari"
		}
	}
}

function ordenar_dinamicamente(div_principal,obj_ord_rec,cont_icono)
{
	var selector = ( div_principal[0] == '#' || div_principal[0] == '.' ) ? div_principal : "#" + div_principal;
	if( $(selector).length > 0)
	{
		var obj_ord = $.extend({
			opacity : 0.7,

			placeholder : "ordenar_placeholder",
			forcePlaceholderSize : true,
			axis : "y",
			items : " div ",
			update : function(event, ui){
				if( typeof(obj_ord.funcion_guardar) != "undefined" )
				{
					obj_ord.funcion_guardar();
				}
			},
			funcion_activar : function () {
				iconos_ordenar(selector);
				$(selector + " "+ obj_ord.items).each(function(){
					$(this).addClass("ordenar_elemento ");
					$(this).addClass("ui-helper-clear");
				});
				if( typeof( cont_icono ) != "undefined" )
				{
					$(selector + " " + cont_icono).each(function(){
						$('<a class="tooltip_jqt bt_ordenar" title="'+leyenda['ordenar_elemento']+'">&nbsp;</a>')
						.css({
							height:18,
							width:18
						})
						.button({
							icons:{
								primary:"ui-icon-arrowthick-2-n-s"
							},
							text:false
						})
						.appendTo(this );
					});
				}

			}
		}, obj_ord_rec);
		iconos_ordenar($(".bt_ordenar"));
		$(".bt_ordenar").removeClass( "bt_ordenar" );
		obj_ord.funcion_activar();
		$(selector).sortable(obj_ord);
	}
}

function iconos_ordenar(selector_iconos)
{
	clases = clases_ordenar();
	$(selector_iconos).addClass( clases.up);

	$(selector_iconos).mouseup(function(){
		$(this).addClass( clases.up);
		$(this).removeClass( clases.down);
	});
	$(selector_iconos).mousedown(function(){

		$(this).addClass( clases.down );
		$(this).removeClass( clases.up );
	});
}
// Placeholder, CN
jQuery.fn.placeholder_qn= function(args){
	options= jQuery.extend({
		etiqueta: "",
		title: "" // null=> no le pone title, ""=> pone el mismo que la etiqueta
	}, args);
	if( options.etiqueta!="" )
	{
		this.attr("placeholder", options.etiqueta);
		if( options.title!==null )
		{
			if( options.title=="" )
				this.attr("title", options.etiqueta);
			else
				this.attr("title", options.title);
		}
	}
	// VZ, 2010-12-13
	var input_test = document.createElement('input'); // para verificar si el browser sabe soporta el "placeholder" nativamente
	if( typeof (this.attr("placeholder")) =="undefined" || ('placeholder' in input_test) )
		return this;

	var input = $(this);
	this.bind("focus.placeholder_qn",function() {
		if (input.val() == input.attr('placeholder'))
		{
			input.val('').removeClass('mk-placeholder');
		}
	}).bind("blur.placeholder_qn",function() {
		if (input.val() == '')
		{
			input.addClass('mk-placeholder').val(input.attr('placeholder'));
		}
	}).trigger("blur.placeholder_qn");
	return this; // Retornar el objeto jQuery original
};

jQuery.fn.placeholder_submit_qn= function(args){
	var input_test = document.createElement('input'); //VZ 2010-12-13 para verificar si el browser sabe soporta el "placeholder" nativamente
	if( !this.is("form") || ('placeholder' in input_test) )
		return this;

	this.bind("submit.placeholder_qn",function(event) {
		$(this).find('[placeholder]').each(function() {
			var input = $(this);
			if (input.val() == input.attr('placeholder'))
			{
				input.val('').removeClass('mk-placeholder');
			}
		});
	});
	return this; // Retornar el objeto jQuery original
};
/*interfaz*/
var pila_pet = new Array();
var estado_pet = 0;
if (typeof(mensaje_espera_recurso_interfaz) == "undefined")
{
	var mensaje_espera_recurso_interfaz =   '<div style="padding: 0px 5px;  margin:10px; overflow:hidden" class="ui-state-highlight ui-corner-all">';
	mensaje_espera_recurso_interfaz += '<p><span style="float: left; margin-right: 0.3em; margin-left: 0.3em;" class="ui-icon ui-icon-gear" />';
	mensaje_espera_recurso_interfaz += "<span style='font-size:11px; padding: 3px 3px 3px 25px;'>Esperando</span>";
	mensaje_espera_recurso_interfaz += "<img src='"+host_i()+"/util/procesando.gif' />";
	mensaje_espera_recurso_interfaz += '</p></div>';
}
function pet_interfaz(obj_pet_interfaz)
{
	if( typeof obj_pet_interfaz != "undefined" )
	{
		pila_pet.push(obj_pet_interfaz);
		mensaje_carga(obj_pet_interfaz.div_default,obj_pet_interfaz.div_principal,mensaje_espera_recurso_interfaz);
	}
	if( estado_pet == 0 && pila_pet.length > 0 )
	{
		pet_interfaz_unica( pila_pet.shift() );
		estado_pet = 1;
	}
}
function pet_interfaz_unica(obj_pet_rec)
{
	mensaje_carga( obj_pet_rec.div_default, obj_pet_rec.div_principal, cont_procesando() );
	if( !$.isFunction( obj_pet_rec.callback ) )
	{
		obj_pet_rec.callback = function ( resp_interfaz ){
			if( recibe_texto( resp_interfaz.echo_metodo ) )
			{
				/*mensaje_growl( resp_interfaz.echo_metodo,{
					sticky:true,
					position:"center"
				} );*/
				alert_( resp_interfaz.echo_metodo );
			}
			if( $.isFunction( obj_pet_rec.pre_accJq ) )
			{
				obj_pet_rec.pre_accJq( resp_interfaz );
			}
			if( $.isFunction( obj_pet_rec.funcion_mostrar ) )
			{
				obj_pet_rec.funcion_mostrar( resp_interfaz, obj_pet_rec );
			}
			else
			{
				if( recibe_texto( obj_pet_rec.estado_pet ) != "guardar" && resp_interfaz.resultado == 0 )
				{
					var mensaje_resp_mostrar;
					if( $.isPlainObject( resp_interfaz.mensaje_metodo ) )
					{
						mensaje_resp_mostrar = forma_relogueo( resp_interfaz.mensaje_metodo , resp_interfaz.respuesta, obj_pet_rec );
					}
					else
					{
						mensaje_resp_mostrar = resp_interfaz.respuesta;
					}
					alert_(mensaje_resp_mostrar  ,"","",{
						width:500,
						height:350
					});
					return false;
				}
				var contenedor = recibe_texto( obj_pet_rec.div_default );
				if( contenedor != "" && resp_interfaz.resultado == 1 )
				{
					$("#"+contenedor).html(resp_interfaz.respuesta);
				}
				if( $.isFunction( obj_pet_rec.accJq ) )
				{
					obj_pet_rec.accJq( resp_interfaz );
				}
				prepara_ligas();
				prepara_botones();
				//tmp_ayuda
				if( typeof ( prepara_ligas_ayuda ) == "function" )
				{
					prepara_ligas_ayuda();
				}
			}
		};
	}
	funcion_pet(obj_pet_rec);
}
function mensaje_carga(dv_default,dv_principal,mensaje_mc)
{
	dv_default = recibe_texto(dv_default);
	dv_principal = recibe_texto(dv_principal);
	var div_cont_mensaje = ( dv_principal == "" ) ? dv_default : dv_principal;
	if( dv_default != "" )
	{
		$('#'+dv_default+'_espera').remove();
		$('#'+dv_default+'_overlay').remove();
		$('#'+dv_default).css({
			position:"relative"
		}).append("<div id=\""+dv_default+'_overlay'+"\" class=\"ui-widget-overlay\"></div>");
	}
	if( div_cont_mensaje != "")
	{
		obj_dcm = $('#'+div_cont_mensaje).get(0);
		if( typeof obj_dcm != "undefined")
		{
			var offsetWidth = recibe_entero(obj_dcm.offsetWidth);
			var msg_espera = $("<div id=\""+dv_default+'_espera'+"\"></div>").html(mensaje_mc).css({
				marginLeft : offsetWidth > 0 ? ( offsetWidth / 2 ) - 150 : 20,
				height : 70,
				width : 300,
				position:"absolute",
				zIndex: obj_dcm.style.zIndex +1 //10000
			});
			$('#'+div_cont_mensaje).prepend(msg_espera);
		}
	}
}
function funcion_pet(obj_pet)
{
	$.ajax({
		url: ajaxd, //tmp_ayuda?edicion_ayudas=2121
		global: false,
		type: "POST",
		data: serialize_arr( obj_pet ) + "&" + ( recibe_texto(obj_pet["formulario"])!= "" ? $("#"+obj_pet["formulario"]).serialize( ) : "") ,
		dataType: "html",
		success: function(data, textStatus, XMLHttpRequest){
			estado_pet = 0;
			var arr_resp_interfaz = new Array();
			pet_interfaz();
			try{
				arr_resp_interfaz = $.parseJSON(data);
			}
			catch( e ){
				alert_("respuesta corrupta <br> "+data);
			}
			obj_pet.callback(arr_resp_interfaz);
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			alert( textStatus + "\n" + errorThrown);
		}
	});
}
//function copy(obj_copy)
//{
//	return( $.isPlainObject( obj_copy ) )? $.extend({},obj_copy) : null ;
//}
function copy(o) {
	if (typeof o != "object" || o === null) return o;
	var r = o.constructor == Array ? [] : {};
	for (var i in o) {
		r[i] = copy(o[i]);
	}
	return r;
}
function serialize_arr(arr,prefijo)
{
	prefijo = recibe_texto(prefijo);
	var salida=new Array();
	var sufijo="";
	if (prefijo!="")
	{
		prefijo+="[";
		sufijo="]";
	}
	for(id in arr)
	{
		cont_arr = arr[id];
		switch( typeof( cont_arr ) )
		{
			case "string":
			case "number":
				salida.push( prefijo + id + sufijo + "=" + cont_arr );
				break;
			case "object":
				salida.push( serialize_arr( cont_arr, prefijo + id + sufijo ) );
				break;
			case "boolean":
			case "function":
				break;
			default:
				alert("funcion serialize_arr, caso no contemplado: "+typeof(cont_arr))
		}
		if (salida.length==0)
		{
			salida.push( prefijo + sufijo + "=" );
		}
	}
	return salida.join("&");
}
function arr_resp(cl,fn,div_default,callback)
{
	var obj_resp = {
		pf : "",
		fm : recibe_texto( cl ),
		ad : {
			fn : recibe_texto( fn )
		},
		div_default : recibe_texto(div_default),
		accJq : callback
	};
	return obj_resp;
}
function nombre_campo_jq(nombre)
{
	reg= new RegExp(/(\[)([^\]]*)(\])/g);
	rep= "\\$1$2\\$3";
	return new String(nombre).replace(reg,rep);
}

function tag_idioma_jq(idioma, minusculas)
{
	if(recibe_entero(idioma) <= 0)
	{
		idioma = idioma_jq
	}
	var tag_idioma;
	switch(idioma){
		case 2:
			tag_idioma = 'en';
			break;
		case 3:
			tag_idioma = 'pt-BR';
			break;
		case 4:
			tag_idioma = 'de';
			break;
		default:
			tag_idioma = 'es';
	}
	return ( minusculas == true )? tag_idioma.toLowerCase() : tag_idioma;
}
function urlencode (str) {
	str = recibe_texto(str);
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
	replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}
function enfoca_1er_vacio(id_form_apv)
{
	$("#"+id_form_apv + " :input[value='']:first").focus();
}
//RAEG 21/06/2011
//funcion para guardar un formulario con una liga_edicion_clase
function guarda_liga_edicion( datos_gfl )
{
	if( $.isPlainObject( datos_gfl ) )
	{
		if( typeof( datos_gfl.liga ) != "undefined" )
		{
			datos_gfl.obj_guardar = interpreta_liga_edicion( datos_gfl.liga )
		}		
		if( typeof( datos_gfl.obj_guardar ) != "undefined" )
		{	
			var obj_guardar = copy( datos_gfl.obj_guardar );
			//objeto para procesar la respuesta
			opciones_form.obj_guarda_liga_edicion = $.extend({
				embebido : true,
				botones : false,
				incluir_form : false
			},opciones_form[datos_gfl.obj_guardar.entidad]);
	
			opciones_form.obj_guarda_liga_edicion.funcion_mostrar = function ( respuesta_serv , obj_pet ){
				procesa_respuesta_guardar(respuesta_serv,"obj_guarda_liga_edicion","","","",obj_pet,opciones_form.obj_guarda_liga_edicion);
			}
			
			obj_guardar.entidad = "obj_guarda_liga_edicion";
			obj_guardar.get_env.fm = obj_guardar.get_env.fm2;
			obj_guardar.get_env.vi = obj_guardar.get_env.vi2;
			obj_guardar.get_env["ad[fn]"] = obj_guardar.get_env["ad2[fn]"];		
			//recibe los datos para enviar
			if( typeof( datos_gfl.datos ) != "undefined" )
			{
				obj_guardar.pf = datos_gfl.datos;
			}
			else
			{
				if( typeof( datos_gfl.formulario_id ) != "undefined" )
				{
					datos_gfl.formulario = $("#"+datos_gfl.formulario_id);
				}				
				if( typeof( datos_gfl.formulario ) != "undefined" )
				{
					obj_guardar.pf = [];
					//leer los inputs y convertirlos en un objeto para enviar 
					$.each(datos_gfl.formulario.serializeArray(),function( indice , campo_form){
						if( campo_form.name.match(/[^\[]\[(.*)\]/,'') )
						{	
							obj_guardar.pf[ RegExp.$1 ] = campo_form.value ;
						}
						else
						{
							obj_guardar.pf[ campo_form.name ] = campo_form.value ;
						}
						
					})
				}
			}
			ejecuta_liga_edicion(obj_guardar);
		}
	}
}

