reglo con los Resultados para ColumnasVisibles, NumerosColumnasOcultas y NumeroColumnas\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_GenerarEtiquetasConsulta($ConsultaSQL=\"\",$informe)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n\n		// Busca datos del informe\n		if ($informe!=\"\")\n			$registro_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\")->fetch();\n\n		//Si encuentra que el informe usa conexion alterna accesa la variable de conexion como global\n		if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n			global ${$registro_informe[\"conexion_origen_datos\"]};\n\n		//Averigua cuales columnas estan definidas como ocultas\n		if ($informe!=\"\")\n			$ColumnasOcultas=PCO_DeterminarCamposOcultos($informe);\n\n		//Si se recibe un query sigue adelante\n		if ($ConsultaSQL!=\"\")\n			{\n				// Imprime encabezados de columna si encuentra al menos un registro\n				//Si el informe usa una conexion externa usa su configuracion\n				if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n					$resultado_columnas=@PCO_EjecutarSQL($ConsultaSQL,\"\",${$registro_informe[\"conexion_origen_datos\"]},1); //${$registro_informe[\"conexion_origen_datos\"]}\n				else\n					$resultado_columnas=@PCO_EjecutarSQL($ConsultaSQL);\n\n				//Procesa resultados solo si es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch(), rowCount() y demas metodos\n				if ($resultado_columnas!=\"1\")\n					$ConteoRegistros=$resultado_columnas->rowCount();\n\n				//Si se tienen registros para mirar las columnas las agrega\n				if ($ConteoRegistros>0)\n					{\n						$numero_columnas=0;\n						foreach($resultado_columnas->fetch(PDO::FETCH_ASSOC) as $key=>$val)\n							{\n								//Imprime el encabezado siempre y cuando no se trate de un campo que se desea ocultar\n								if (!in_array($key,$ColumnasOcultas))\n									{\n										$PCO_ColumnasVisibles[]=$key;\n									}\n								else\n									{\n										//Agrega la columna al indice de columnas ocultas para no mostrarla luego\n										$PCO_NumerosColumnasOcultas[]=$numero_columnas;\n									}\n								$numero_columnas++;\n							}\n					}\n			}\n		@$Resultados[]=array(ColumnasVisibles => $PCO_ColumnasVisibles, NumerosColumnasOcultas=>$PCO_NumerosColumnasOcultas	,NumeroColumnas => $numero_columnas);\n		return $Resultados;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CamposRealesInforme\n	Retorna un arreglo con nombres de campos completos, sus nombres reales en base de datos y los nombres de las tablas correspondientes\n\n	Variables de entrada:\n\n		informe - ID de informe lo usa para conocer todas sus columnas\n\n	Salida:\n\n		* Variable de tipo arreglo con los Resultados\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_CamposRealesInforme($informe)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore;\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas;\n\n		// Busca datos del informe\n		if ($informe!=\"\")\n			{\n				$consulta_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\");\n				$registro_informe=$consulta_informe->fetch();\n\n				if ($registro_informe[\"conexion_origen_datos\"]!=\"\")\n					global ${$registro_informe[\"conexion_origen_datos\"]};\n			}\n\n			//Busca los CAMPOS definidos para el informe y sus TABLAS correspondientes\n			$ListaCampos_NombreCompleto=array();	//Nombre completo del campo\n			$ListaCampos_NombreSimple=array();		//Lado izquierdo solamente cuando se cuenta con Alias\n			$ListaTablas_NombreSimple=array();		//Nombre de la tabla de donde sale el campo\n			$ListaCampos_PermitirEdicion=array();	//Guarda los estados de edicion en linea para el campo\n			$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_campos.\" FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso,id\",\"$informe\");\n			while ($registro_campos = $consulta_campos->fetch())\n				{\n					//Si tiene alias definido lo agrega\n					$posfijo_campo=\"\";\n					if ($registro_campos[\"valor_alias\"]!=\"\") $posfijo_campo=\" as \".$registro_campos[\"valor_alias\"];\n					$nombre_campo=$registro_campos[\"valor_campo\"].$posfijo_campo;\n\n					//Agrega el campo a la lista de nombres completos\n					$ListaCampos_NombreCompleto[]=$nombre_campo;\n\n					//Agrega el estado de edicion o no para el campo\n					$ListaCampos_PermitirEdicion[]=$registro_campos[\"editable\"];\n\n					//Establece el nombre del campo simple (el real en base de datos)\n						//Elimina la posibilidad de un alias \" as \" tomando la primera parte solamente\n						$PartesListaCampos_NombreCompleto=explode(\" as \",$nombre_campo);\n						$nombre_campo_simple=$PartesListaCampos_NombreCompleto[0];\n						//Elimina la posibilidad de un punto \" . \" indicando la tabla\n						if (strpos($nombre_campo_simple,\".\"))\n							{\n								$PartesListaCampos_NombreCompleto=explode(\".\",$nombre_campo_simple);\n								$nombre_campo_simple=$PartesListaCampos_NombreCompleto[1];\n							}\n\n					//Agrega el campo a la lista de nombres simples\n					$ListaCampos_NombreSimple[]=$nombre_campo_simple;\n\n					//Determina la tabla a la que pertenece el campo\n					//Se verifica inicialmente si el campo ya indica la tabla para evitar ambiguedades en consultas de varias tablas\n					$PartesListaCampos_NombreCompleto=explode(\" as \",$nombre_campo);\n					$nombre_campo_simple=$PartesListaCampos_NombreCompleto[0];\n					//Si el campo tiene puntos indica la tabla, sino la buscamos\n					if (strpos($nombre_campo_simple,\".\"))\n						{\n							$PartesListaCampos_NombreCompleto=explode(\".\",$nombre_campo_simple);\n							$nombre_tabla_simple=$PartesListaCampos_NombreCompleto[0];\n							$ListaTablas_NombreSimple[]=$nombre_tabla_simple;\n						}\n					else\n						{\n							$nombre_tabla_simple=\"\";\n							//Busca en las TABLAS definidas para el informe\n							$consulta_tablas=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_tablas.\" FROM \".$TablasCore.\"informe_tablas WHERE informe=? \",\"$informe\");\n							while ($registro_tablas = $consulta_tablas->fetch())\n								{\n									$tabla_actual=$registro_tablas[\"valor_tabla\"];\n									//Si la tabla tiene alias lo ignora\n									if (strpos($tabla_actual,\" as \"))\n										{\n											$PartesTablaActual=explode(\" as \",$tabla_actual);\n											$tabla_actual=$PartesTablaActual[0];\n										}\n									//Si no se ha encontrado la tabla entra a comparar frente a la actual\n									if ($nombre_tabla_simple==\"\")\n										{\n											//Si el informe usa una conexion externa usa su configuracion\n											if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n												{\n													if (@PCO_ExisteCampoTabla($nombre_campo_simple,$tabla_actual,${$registro_informe[\"conexion_origen_datos\"]},$registro_informe[\"motorbd\"],$registro_informe[\"basedatos\"]))\n														$nombre_tabla_simple=$tabla_actual;\n												}\n											else\n												{\n													if (PCO_ExisteCampoTabla($nombre_campo_simple,$tabla_actual))\n														$nombre_tabla_simple=$tabla_actual;\n												}\n										}\n								}\n							$ListaTablas_NombreSimple[]=$nombre_tabla_simple;\n						}\n				}\n\n		@$Resultados[]=array(ListaCampos_NombreCompleto => $ListaCampos_NombreCompleto, ListaCampos_NombreSimple=>$ListaCampos_NombreSimple	,ListaTablas_NombreSimple => $ListaTablas_NombreSimple, ListaCampos_PermitirEdicion => $ListaCampos_PermitirEdicion);\n		return $Resultados;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarInforme\n	Genera el codigo HTML correspondiente a un informe de la aplicacion y hace los llamados necesarios para la diagramacion por pantalla de los diferentes objetos que lo componen.\n\n	Variables de entrada:\n\n		informe - ID unico del informe que se desea cargar\n		en_ventana - Indica si el informe debe ser cargado en una ventana o directamente sobre el escritorio de aplicacion\n		formato - Determina el formato en el cual es generado el informe como HTM o XLS (Alpha)\n		estilo - Determina el estilo CSS utilizado para presentar el informe, debe existir dentro de las hojas de estilo de la plantilla\n		embebido - Determina si el informe es presentado dentro de otro objeto o no, como por ejemplo un formulario\n\n	(start code)\n		SELECT * FROM \".$TablasCore.\"informe WHERE id=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_campos WHERE informe=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_tablas WHERE informe=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_condiciones WHERE informe=\'$informe\' ORDER BY peso\n	(end)\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario> | <PCO_ConstruirConsultaInforme>\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function cargar_informe($informe,$en_ventana=1,$formato=\"htm\",$estilo=\"Informes\",$embebido=0)\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework cargar_informe().  En su lugar utilice PCO_CargarInforme() \"; }\nfunction PCO_CargarInforme($informe,$en_ventana=1,$formato=\"htm\",$estilo=\"Informes\",$embebido=0,$anular_acciones=0,$anular_piepagina=0,$anular_encabezado=0,$SQLPuro=\"\")\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$Nombre_Aplicacion,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $PCOSESS_LoginUsuario,$Nombre_usuario,$Descripcion_usuario,$Nivel_usuario,$Correo_usuario,$LlaveDePasoUsuario,$PCO_FechaOperacion;\n		// Carga variables de definicion de tablas\n		global $ListaCamposSinID_replicasbd,$ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n		global $MULTILANG_Editar,$MULTILANG_Informes,$MULTILANG_Exportar,$MULTILANG_TotalRegistros,$MULTILANG_ContacteAdmin,$MULTILANG_ObjetoNoExiste,$MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Informes,$MULTILANG_IrEscritorio,$MULTILANG_ErrorDatos,$MULTILANG_InfErrTamano,$MULTILANG_MonCommSQL;\n		global $IdiomaPredeterminado;\n		global $PCO_InformesListaColumnasDT,$PCO_InformesRecuperacionAJAX,$PCO_InformesIdCache,$PCO_InformesDataTable,$PCO_InformesDataTablePaginaciones,$PCO_InformesDataTableTotales,$PCO_InformesDataTableFormatoTotales,$PCO_InformesDataTableExrpotaCLP,$PCO_InformesDataTableExrpotaCSV,$PCO_InformesDataTableExrpotaXLS,$PCO_InformesDataTableExrpotaPDF,$PCO_InformesDataTableDefineCOLS,$PCO_InformesDataTable_pane_activado,$PCO_InformesDataTable_pane_cascada,$PCO_InformesDataTable_pane_colapsado,$PCO_InformesDataTable_pane_columnas,$PCO_InformesDataTable_pane_subtotalesrelativos,$PCO_InformesDataTable_pane_conteos,$PCO_InformesDataTable_pane_controles,$PCO_InformesDataTable_pane_control_colapsar,$PCO_InformesDataTable_pane_control_ordenar;\n		global $ModoDepuracion,$ModoDesarrolladorPractico;\n		global $PCO_InformesGraficosSinDatos,$PCOVAR_ConteoRegistrosUltimoInforme;\n		global $PCO_FuncionesJSInternasFORM;\n		\n		//Determina si el usuario es un disenador de aplicacion para mostrar el ID de objeto a manera informativa y un boton de salto a edicion\n		$BotonSaltoEdicion=\'\n					<a class=\"btn btn-default btn-xs\" href=\"index.php?PCO_Accion=PCO_EditarInforme&informe=\'.$informe.\'\">\n						<div><i class=\"fa fa-pencil-square\"></i> \'.$MULTILANG_Editar.\' \'.$MULTILANG_Informes.\' <i>[ID=\'.$informe.\']</i></div>\n					</a>\';\n\n		if ($SQLPuro==\"\")\n			{\n				if (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $informe>=0)\n					$ComplementoIdObjetoEnTitulo=\"  $BotonSaltoEdicion\";\n\n				// Busca datos del informe\n				$consulta_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\");\n				$registro_informe=$consulta_informe->fetch();\n				$Identificador_informe=$registro_informe[\"id\"];\n\n				//Carga cualquier script PRE para el informe\n				if ($registro_informe[\"pre_script\"]!=\"\")\n					{\n						//Evalua si el codigo ya inicia con <?php y sino lo agrega\n						$ComplementoInicioScript=\"\";\n						if (substr(trim($registro_informe[\"pre_script\"]),0,5)!=\'<?php\')\n							$ComplementoInicioScript=\"<?php\\n\";\n						PCO_EvaluarCodigo($ComplementoInicioScript.$registro_informe[\"pre_script\"],1,\"Detalles: PRE-Code Rep ID=\".$informe);\n					}\n\n				//Prepara script POST para el informe (se carga mas abajo pero deja la cadena lista)\n				if ($registro_informe[\"post_script\"]!=\"\")\n					{\n						//Evalua si el codigo ya inicia con <?php y sino lo agrega\n						$ComplementoInicioScript=\"\";\n						if (substr(trim($registro_informe[\"post_script\"]),0,5)!=\'<?php\')\n							$ComplementoInicioScript=\"<?php\\n\";\n						$CadenaPOSTScriptPHP=$ComplementoInicioScript.$registro_informe[\"post_script\"];\n					}\n\n				//Prepara JavaSCRIPT para el informe (se carga mas abajo pero deja la cadena lista)\n				if (trim($registro_informe[\"javascript\"])!=\"\")\n					{\n						$JavaScriptInforme=PCO_ReemplazarVariablesPHPEnCadena(trim($registro_informe[\"javascript\"]));\n					}\n			}\n\n		//Determina si se deben ocultar elementos por banderas o porque el informe asi lo obliga\n		$ComplementoAnulacionPiePagina=\'\';\n		if ($anular_piepagina==1 || $registro_informe[\"ocultar_piepagina\"]==1) $ComplementoAnulacionPiePagina=\' style=\"display:none; visibility:hidden;\" \';\n		$ComplementoAnulacionEncabezado=\'\';\n		if ($anular_encabezado==1 || $registro_informe[\"ocultar_encabezado\"]==1) $ComplementoAnulacionEncabezado=\' style=\"display:none; visibility:hidden;\" \';\n		if ($anular_acciones==0 && $registro_informe[\"anular_acciones\"]==1) $anular_acciones=1;\n\n		if ($SQLPuro==\"\")\n			{\n				//Si el informe usa una conexion externa busca su configuracion\n				if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n					{\n						$registro_conexiones=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_replicasbd.\" FROM \".$TablasCore.\"replicasbd WHERE nombre=\'\".$registro_informe[\"conexion_origen_datos\"].\"\' \")->fetch();\n						global ${$registro_conexiones[\"nombre\"]};\n						$NombreConexionExtra=${$registro_conexiones[\"nombre\"]};\n					}\n				//Si no encuentra informe presenta error\n				if ($registro_informe[\"id\"]==\"\") PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$MULTILANG_ObjetoNoExiste.\" \".$MULTILANG_ContacteAdmin.\"<br>(\".$MULTILANG_Informes.\" $informe)\", \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n			}\n\n		//Identifica si el informe requiere un formulario de filtrado previo\n		if ($registro_informe[\"formulario_filtrado\"]!=\"\")\n			{\n				//Determina si solicita el informe desde el formulario de filtrado apropiado, sino redirecciona a este\n				global $PCO_FormularioActivo;\n				if ($registro_informe[\"formulario_filtrado\"]!=$PCO_FormularioActivo)\n					{\n						echo \'<form name=\"precarga_form_filtro\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\" target=\"_self\">\n							<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_CargarObjeto\">\n							<input type=\"Hidden\" name=\"PCO_InformeFiltro\" value=\"\'.$registro_informe[\"id\"].\'\">\n							<input type=\"Hidden\" name=\"PCO_Objeto\" value=\"frm:\'.$registro_informe[\"formulario_filtrado\"].\':1\">\n							<input type=\"Hidden\" name=\"Presentar_FullScreen\" value=\"\'.@$Presentar_FullScreen.\'\">\n							<input type=\"Hidden\" name=\"Precarga_EstilosBS\" value=\"\'.@$Precarga_EstilosBS.\'\">\n							</form>\n						<script type=\"\" language=\"JavaScript\"> document.precarga_form_filtro.submit();  </script>\';\n						die();\n					}\n			}\n\n		//Si hay variables de filtro definidas busca su valor en el contexto global\n		if($registro_informe[\"variables_filtro\"]!=\"\")\n			{\n				$arreglo_variables_filtro = @explode(\",\",$registro_informe[\"variables_filtro\"]);\n				//Busca y convierte cada variable recibida en global\n				foreach ($arreglo_variables_filtro as $nombre_variable_filtro)\n					{\n						//if (isset(${$nombre_variable_filtro}))  // {Deprecated}\n							global ${$nombre_variable_filtro};\n					}\n			}\n\n		//Si no hay SQL explicito entonces Genera la consulta en SQL para el informe a partir de los parametros\n		if (strlen($registro_informe[\"consulta_sql\"])<5)\n			{\n				if ($SQLPuro==\"\")\n					$consulta=PCO_ConstruirConsultaInforme($informe,0); //Construye query del informe sin evitar campos ocultos (0)\n				else\n					$consulta=PCO_ReemplazarVariablesPHPEnCadena($SQLPuro);\n			}\n		else\n			$consulta=PCO_ReemplazarVariablesPHPEnCadena($registro_informe[\"consulta_sql\"]);\n\n		// Si el informe tiene formato_final = T (tabla de datos)\n		if ($registro_informe[\"formato_final\"]==\"T\" || $SQLPuro!=\"\")\n			{\n				$SalidaFinalInforme=\'\';\n				if ($en_ventana)\n					{\n						//Cuando es embebido (=1) no imprime el boton de retorno pues se asume dentro de un formulario\n						if (!$embebido)\n							echo \'<div align=center id=\"PCOContenedor_BotonEscritorio\"><button type=\"Button\" onclick=\"document.PCO_FormVerMenu.submit()\" class=\"btn btn-warning\"><i class=\"fa fa-home fa-fw\"></i> \'.$MULTILANG_IrEscritorio.\'</button></div><br>\';\n\n						$TituloVentanaInforme=PCO_ReemplazarVariablesPHPEnCadena($registro_informe[\"titulo\"]);\n						//Define si requiere o no boton de exportacion en la barra de titulo\n						if ($registro_informe[\"genera_pdf\"]!=\'N\' && $embebido!=1)\n							{\n								//Formato nativo\n								if ($registro_informe[\"genera_pdf\"]==\'S\' || $registro_informe[\"genera_pdf\"]==\'A\')\n									{\n										$TituloVentanaInforme=\'\n										<a class=\"btn btn-primary btn-xs pull-right\" data-toggle=\"modal\" href=\"#myModalEXPORTACION\">\n											<div><i class=\"fa fa-floppy-o fa-fw\"></i> \'.$MULTILANG_Exportar.\'</div>\n										</a>\'.$TituloVentanaInforme;\n									}\n							}\n\n						//Define si requiere o no boton de exportacion en la barra de titulo\n						//Formato CSV por AJAX - Solo genera el marco, el boton se agrega luego cuando se conozca el ID de la cache de informe (mas abajo)\n						if ($registro_informe[\"genera_pdf\"]==\'C\' || $registro_informe[\"genera_pdf\"]==\'A\')\n							{\n								$TituloVentanaInforme=\'<div id=\"PCO_MarcoBotonCSVInforme\'.$informe.\'\" class=\"pull-right\" style=\"margin-left:5px;\"></div>\'.$TituloVentanaInforme;\n							}\n\n						//Carga la ventana con el informe\n						PCO_AbrirVentana($TituloVentanaInforme.$ComplementoIdObjetoEnTitulo,\'panel panel-info\',$registro_informe[\"ancho\"]);\n\n						//Agrega la descripcion del informe en caso de contar con ella\n						if ($registro_informe[\"descripcion\"]!=\'\')\n							{\n								 PCO_Mensaje(\'<i class=\"fa fa-flag fa-fw\"></i>\',PCO_ReemplazarVariablesPHPEnCadena($registro_informe[\"descripcion\"]), \'\', \'\', \'alert alert-success alert-dismissible\');\n							}\n					}\n\n				// Si se ha definido un tamano fijo entonces crea el marco\n				if ($registro_informe[\"ancho\"]!=\"\" && $registro_informe[\"alto\"]!=\"\")\n					echo \'<DIV style=\"DISPLAY: block; OVERFLOW: auto; POSITION: relative; WIDTH: \'.$registro_informe[\"ancho\"].\' !important; HEIGHT: \'.$registro_informe[\"alto\"].\' !important\">\';\n\n				//Genera enlaces a las opciones de descarga\n				if (($registro_informe[\"genera_pdf\"]==\'S\' || $registro_informe[\"genera_pdf\"]==\'A\')  && $embebido!=1)\n					include_once(\"core/marco_export.php\");\n\n					//DEPRECATED echo \'	<html>		<body leftmargin=\"0\" topmargin=\"0\" rightmargin=\"0\" bottommargin=\"0\" marginwidth=\"0\" marginheight=\"0\" style=\"font-size: 12px; font-family: Arial, Verdana, Tahoma;\">\';\n\n					//Agrega titulo o encabezado si esta definido\n					if ( $registro_informe[\"encabezado_html\"] != \'\' )\n						$SalidaFinalInforme.= \'<div id=\"titulo-informe-ID\'.$registro_informe[\"id\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_informe[\"encabezado_html\"]).\'</div>\';\n\n					//Agrega clases para convertir la tabla a responsive si aplica\n					$ComplementoResponsiveTabla=\'\';\n					if ( $registro_informe[\"tabla_responsive\"] == \'S\' )\n						$ComplementoResponsiveTabla= \'responsive nowrap\';\n\n					$SalidaFinalInforme.= \'<!--<div class=\"table-responsive\">-->\n											<table width=\"100%\" class=\"btn-xs table table-condensed table-hover order-column table-striped table-unbordered  \'.$ComplementoResponsiveTabla.\'  \'.$estilo.\'\" id=\"TablaInforme_\'.$registro_informe[\"id\"].\'\"><thead id=\"PCO_EncabezadosInforme_\'.$registro_informe[\"id\"].\'\" \'.$ComplementoAnulacionEncabezado.\'>\';\n\n					//Busca si tiene acciones (botones) para cada registro y los genera\n					if (!$anular_acciones)\n						{\n							$cadena_generica_botones_principio=PCO_GenerarBotonesInforme($informe,1);\n							$cadena_generica_botones=PCO_GenerarBotonesInforme($informe);\n						}\n					else\n						{\n							$cadena_generica_botones_principio=\'\';\n							$cadena_generica_botones=\"\";\n						}\n\n					//Si el informe tiene botones al comienzo entonces agrega columna adicional\n					if ($cadena_generica_botones_principio!=\"\")\n						{\n							$SalidaFinalInforme.= \'<th></th>\';\n						}\n\n					//Determina si el informe tiene o no campos ocultos\n					$PCO_ColumnasOcultas=PCO_DeterminarCamposOcultos($informe);\n\n					//Obtiene ColumnasVisibles, NumerosColumnasOcultas, NumeroColumnas dentro de EtiquetasConsulta\n					$EtiquetasConsulta=PCO_GenerarEtiquetasConsulta($consulta,$informe); //Enviar el informe para que se determinen tambien sus columnas ocultas\n\n					//Genera HTML con las columnas\n					//Busca los campos definidos en el informe como visibles y luego determina si el campo tiene o no titulo arbitrario\n					$ListaCampos_TitutloArbitrario=array();\n					$consulta_titulosarbitrarios=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_campos.\" FROM \".$TablasCore.\"informe_campos WHERE informe=? AND visible=1 ORDER BY peso,id\",\"$informe\");\n					while ($registro_titulosarbitrarios = $consulta_titulosarbitrarios->fetch())\n							$ListaCampos_TitutloArbitrario[]=$registro_titulosarbitrarios[\"titulo_arbitrario\"];\n					$ConteoPosicionColumna=0;   //Utilizado para conocer la columna actual y luego buscar si tiene titulo arbitrario\n					$ListaColumnasInforme=\"\";   //Acumula las columnas para ser usadas luego en los DataTables (si aplica)\n					foreach($EtiquetasConsulta[0][\"ColumnasVisibles\"] as $EtiquetaColumna)\n						{\n							$TituloFinalColumna=$EtiquetaColumna;\n							//Si la columna actual tiene un titulo arbitrario definido entonces lo agrega\n							if (@$ListaCampos_TitutloArbitrario[$ConteoPosicionColumna]!=\"\")\n								$TituloFinalColumna=PCO_ReemplazarVariablesPHPEnCadena($ListaCampos_TitutloArbitrario[$ConteoPosicionColumna]);\n							$SalidaFinalInforme.= \'<th>\'.$TituloFinalColumna.\'</th>\';\n							$ListaColumnasInforme.=$TituloFinalColumna.\',\';\n							$ConteoPosicionColumna++;\n						}\n					$ListaColumnasInforme=substr($ListaColumnasInforme, 0, -1);//Elimina la coma sobrante del informe\n					//Si el informe tiene botones al final entonces agrega columna adicional\n					if ($cadena_generica_botones!=\"\")\n						{\n							$SalidaFinalInforme.= \'<th></th>\';\n						}\n					$SalidaFinalInforme.= \'</tr></thead><tbody>\';\n\n					//Busca los campos y tablas reales del informe para construir luego los ID unicos\n					$CamposReales=PCO_CamposRealesInforme($informe);\n\n					// Imprime registros del resultado\n					$numero_filas=0;\n\n					//Si el informe usa una conexion externa usa su configuracion\n					if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n						$consulta_ejecucion=PCO_EjecutarSQL($consulta,\"\",${$registro_conexiones[\"nombre\"]});\n					else\n						$consulta_ejecucion=PCO_EjecutarSQL($consulta);\n						\n					//Asigna el total dde registros a variable global para posible uso fuera de la funcion\n					$PCOVAR_ConteoRegistrosUltimoInforme=$consulta_ejecucion->rowCount();\n\n					//Lleva informe a la cache siempre y cuando no sea un informe interno del framework\n					$IdCacheInformes=0;\n					PCO_EjecutarSQLUnaria(\"INSERT INTO {$TablasCore}informe_cache (informe,usuario,conexion,script_sql,columnas) VALUES(\'{$informe}\',\'{$PCOSESS_LoginUsuario}\',\'{$NombreConexionExtra}\',?,\'{$ListaColumnasInforme}\') \",\"{$consulta}\");\n					$IdCacheInformes=PCO_ObtenerUltimoIDInsertado();\n\n					//Ahora que se tiene una cache, determina si se requiere boton de exportacion CSV por AJAX y lo agrega\n					if ($registro_informe[\"genera_pdf\"]==\'C\' || $registro_informe[\"genera_pdf\"]==\'A\')\n						{\n							echo \"<script language=\'JavaScript\'>\n								$(\'#PCO_MarcoBotonCSVInforme{$informe}\').html(\'<a class=\\\"btn btn-success btn-xs pull-right\\\" href=\\\"core/ajax.php?PCO_Accion=PCO_ExportacionQueryCacheCSV&amp;IdRegistro_CacheSQL={$IdCacheInformes}\\\"> <i class=\\\"fa fa-file-excel-o fa-fw\\\"></i> {$MULTILANG_Exportar} CSV </a>\');\n							</script>\";\n						}\n\n					//Si el informe va a soportar datatable entonces lo agrega a las tablas que deben ser convertidas en el pageonload\n					if ($registro_informe[\"soporte_datatable\"]==\"S\")\n						{\n							@$PCO_InformesDataTable.=\"TablaInforme_\".$registro_informe[\"id\"].\"|\";\n							@$PCO_InformesDataTablePaginaciones.=$registro_informe[\"tamano_paginacion\"].\"|\"; //Agrega tamano predefinido para la tabla\n							@$PCO_InformesDataTableTotales.=$registro_informe[\"subtotales_columna\"].\"|\";\n							@$PCO_InformesDataTableFormatoTotales.=$registro_informe[\"subtotales_formato\"].\"|\";\n							@$PCO_InformesDataTableExrpotaCLP.=$registro_informe[\"exportar_dtclp\"].\"|\";\n							@$PCO_InformesDataTableExrpotaCSV.=$registro_informe[\"exportar_dtcsv\"].\"|\";\n							@$PCO_InformesDataTableExrpotaXLS.=$registro_informe[\"exportar_dtxls\"].\"|\";\n							@$PCO_InformesDataTableExrpotaPDF.=$registro_informe[\"exportar_dtpdf\"].\"|\";\n							@$PCO_InformesDataTableDefineCOLS.=$registro_informe[\"definir_cols\"].\"|\";\n							@$PCO_InformesIdCache.=$IdCacheInformes.\"|\";\n							@$PCO_InformesListaColumnasDT.=$ListaColumnasInforme.\"|\";\n							@$PCO_InformesDataTable_pane_activado.=$registro_informe[\"pane_activado\"].\"|\";\n							@$PCO_InformesDataTable_pane_cascada.=$registro_informe[\"pane_cascada\"].\"|\";\n							@$PCO_InformesDataTable_pane_colapsado.=$registro_informe[\"pane_colapsado\"].\"|\";\n							@$PCO_InformesDataTable_pane_columnas.=$registro_informe[\"pane_columnas\"].\"|\";\n							@$PCO_InformesDataTable_pane_subtotalesrelativos.=$registro_informe[\"pane_subtotalesrelativos\"].\"|\";\n							@$PCO_InformesDataTable_pane_conteos.=$registro_informe[\"pane_conteos\"].\"|\";\n							@$PCO_InformesDataTable_pane_controles.=$registro_informe[\"pane_controles\"].\"|\";\n							@$PCO_InformesDataTable_pane_control_colapsar.=$registro_informe[\"pane_control_colapsar\"].\"|\";\n							@$PCO_InformesDataTable_pane_control_ordenar.=$registro_informe[\"pane_control_ordenar\"].\"|\";\n						}\n\n					if ($registro_informe[\"usar_ajax\"]==0)\n						{\n							//Define banderas para determinar si el informe se recupera por AJAX o no posteriormente en marco_abajo\n							if ($registro_informe[\"soporte_datatable\"]==\"S\")\n								$PCO_InformesRecuperacionAJAX.=\"0\".\"|\";\n		\n							//Procesa resultados solo si es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch(), rowCount() y demas metodos\n							while($consulta_ejecucion!=\"1\" && $registro_datos_informe=$consulta_ejecucion->fetch())\n								{\n									$SalidaFinalInforme.= \'<tr>\';\n		\n									//Si el informe tiene botones al comienzo los agrega\n									if ($cadena_generica_botones_principio!=\"\")\n										{\n											//Transforma la cadena generica con los datos especificos del registro, toma por ahora el primer campo (OCULTO O NO)\n											$cadena_botones_registro=str_replace(\"DELFRMVALVALOR\",$registro_datos_informe[0],$cadena_generica_botones_principio);\n											$cadena_botones_registro=str_replace(\"DETFRMVALBASE\",$registro_datos_informe[0],$cadena_botones_registro);\n											//Muestra los botones preparados para el registro\n											$SalidaFinalInforme.= \'<td>\'.$cadena_botones_registro.\'</td>\';\n										}\n		\n									for ($i=0;$i<$EtiquetasConsulta[0][\"NumeroColumnas\"];$i++)\n										{\n											//Muestra la columna solo si no se trata de una de las ocultas\n											if (@!in_array($i,$EtiquetasConsulta[0][\"NumerosColumnasOcultas\"]))\n												{\n													$ValorCampoIdentificador=$registro_datos_informe[0]; //Toma por ahora el primer campo (OCULTO O NO)\n													$Nombre_CampoLlave=@$CamposReales[0][\"ListaCampos_NombreSimple\"][0]; //Toma por ahora el primer campo (OCULTO O NO)\n													$Nombre_CampoEditable=@$CamposReales[0][\"ListaCampos_NombreSimple\"][$i];\n													$Nombre_TablaEditable=@$CamposReales[0][\"ListaTablas_NombreSimple\"][$i];\n													$IdentificadorDeCampoEditable=\"$Nombre_TablaEditable:$Nombre_CampoEditable:$Nombre_CampoLlave:$ValorCampoIdentificador\";\n		\n													//Determina la activacion o no de la cadena de edicion del campo\n													$CadenaActivadora_Edicion=\"\";\n													if (@$CamposReales[0][\"ListaCampos_PermitirEdicion\"][$i]==1)\n														$CadenaActivadora_Edicion=\' id=\"\'.$IdentificadorDeCampoEditable.\'\" contenteditable=\"true\" \';\n		\n													$ValorVisibleFinal=$registro_datos_informe[$i];\n													if ($ModoDesarrolladorPractico==1) $ValorVisibleFinal=PCO_ReemplazarVariablesPHPEnCadena($ValorVisibleFinal);\n		\n													$SalidaFinalInforme.= \'\n														<td \'.$CadenaActivadora_Edicion.\'>\'.$ValorVisibleFinal.\'</td>\';\n												}\n										}\n		\n									//Si el informe tiene botones al final los agrega\n									if ($cadena_generica_botones!=\"\")\n										{\n											//Transforma la cadena generica con los datos especificos del registro, toma por ahora el primer campo (OCULTO O NO)\n											$cadena_botones_registro=str_replace(\"DELFRMVALVALOR\",$registro_datos_informe[0],$cadena_generica_botones);\n											$cadena_botones_registro=str_replace(\"DETFRMVALBASE\",$registro_datos_informe[0],$cadena_botones_registro);\n											//Muestra los botones preparados para el registro\n											$SalidaFinalInforme.= \'<td>\'.$cadena_botones_registro.\'</td>\';\n										}\n		\n									$SalidaFinalInforme.= \'</tr>\';\n									$numero_filas++;\n								}\n						}\n					else\n						{\n							//Define banderas para determinar si el informe se recupera por AJAX o no posteriormente en marco_abajo\n							if ($registro_informe[\"soporte_datatable\"]==\"S\")\n								$PCO_InformesRecuperacionAJAX.=\"1\".\"|\";\n						}\n\n					$SalidaFinalInforme.= \'</tbody>\';\n\n					//Si se desea tabla responsive oculta el pie de pagina (libreria datatables no soporta responsive con tfooter ni recupareacion ajax con tfooter)\n					if ($registro_informe[\"tabla_responsive\"] == \'N\' &&  $registro_informe[\"usar_ajax\"]==\"0\")\n						{\n							$SalidaFinalInforme.= \'<tfoot id=\"PCO_PiePaginaInforme_\'.$registro_informe[\"id\"].\'\" \'.$ComplementoAnulacionPiePagina.\'>\';\n							//Cuando es embebido (=1) no agrega los totales de registro\n							//if (!$embebido)\n							$CantidadColumnasSpan=$ConteoPosicionColumna-1;\n							@$SalidaFinalInforme.= \'\n								<tr>\n									<th colspan=\'.$CantidadColumnasSpan.\'>\n										<b>\'.$MULTILANG_TotalRegistros.\': </b>\'.$numero_filas.\'\n									</th>\n								</tr>\';\n							//Cierra pie de pagina, tabla y marco responsive para la tabla\n							$SalidaFinalInforme.= \'</tfoot>\';\n						}\n					\n					$SalidaFinalInforme.= \'\n							</table>\n							<!--</div>-->\';\n				// DEPRECATED $SalidaFinalInforme.= \'</body></html>\';\n\n				//Imprime el HTML generado para el informe\n				echo $SalidaFinalInforme;\n\n				// Si se ha definido un tamano fijo entonces cierra el marco\n				if ($registro_informe[\"ancho\"]!=\"\" && $registro_informe[\"alto\"]!=\"\")\n					echo \'</DIV>\';\n\n			} // Fin si informe es T (tabla)\n\n/*\n		//Verifica si es un informe grafico sin dimensiones\n		if ($registro_informe[\"formato_final\"]==\"G\" && ( $registro_informe[\"ancho\"]==\"\" || $registro_informe[\"alto\"]==\"\" ))\n			{\n				echo \'<form name=\"cancelarXTamano\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\">\n					<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_VerMenu\">\n					<input type=\"Hidden\" name=\"PCO_ErrorTitulo\" value=\"\'.$MULTILANG_ErrorDatos.\'\">\n					<input type=\"Hidden\" name=\"PCO_ErrorDescripcion\" value=\"\'.$MULTILANG_InfErrTamano.\'\">\n					</form>\n					<script type=\"\" language=\"JavaScript\"> document.cancelarXTamano.submit();  </script>\';\n			}\n*/\n		// Si el informe tiene formato_final = G (grafico)\n		if ($registro_informe[\"formato_final\"]==\"G\")\n			{\n				// Si se ha definido un tamano fijo entonces crea el marco\n				if ($registro_informe[\"ancho\"]!=\"\" && $registro_informe[\"alto\"]!=\"\" && $registro_informe[\"ancho\"]!=\"0\" && $registro_informe[\"alto\"]!=\"0\")\n					echo \'<DIV style=\"DISPLAY: block; OVERFLOW: no; POSITION: relative; WIDTH: \'.$registro_informe[\"ancho\"].\' !important; HEIGHT: \'.$registro_informe[\"alto\"].\' !important\">\';\n\n				//Consulta el formato de grafico y datos de series para ponerlo en los campos\n				//Dado por: Tipo|Nombre1!NombreN|Etiqueta1!EtiquetaN|Valor1!ValorN|\n				$formato_base=explode(\"|\",$registro_informe[\"formato_grafico\"]);\n				$tipo_grafico=$formato_base[0];\n				$lista_nombre_series=explode(\"!\",$formato_base[1]);\n				$lista_etiqueta_series=explode(\"!\",$formato_base[2]);\n				$lista_valor_series=explode(\"!\",$formato_base[3]);\n				//Carga detalles extendidos para el formato de grafico y los corrige en el caso de graficos viejos\n				$barra_apilada=$formato_base[4];	if ($barra_apilada==\"\") $barra_apilada=\"false\";\n				$ocultar_grilla=$formato_base[5];   if ($ocultar_grilla==\"\") $ocultar_grilla=\"false\";\n				$ocultar_ejes=$formato_base[6];	 if ($ocultar_ejes==\"\") $ocultar_ejes=\"false\";\n				$unidades_pre=$formato_base[7];	 if ($unidades_pre==\"\") $unidades_pre=\"\";\n				$unidades_pos=$formato_base[8];	 if ($unidades_pos==\"\") $unidades_pos=\"\";\n				$barras_horizontales=\"false\";  //Asume barras verticales por defecto\n				if ($tipo_grafico==\"barrah\")  $barras_horizontales=\"true\";\n				$tipo_grafico_circular=\"donut\";  //Asume barras verticales por defecto\n				if ($tipo_grafico==\"torta\" || $tipo_grafico==\"tortap\")  $tipo_grafico_circular=\"pie\";\n				$presentar_porcentaje=\"false\";  //Asume que el grafico no es con porcentajes en tortas\n				if ($tipo_grafico==\"donap\" || $tipo_grafico==\"tortap\")  $presentar_porcentaje=\"true\";\n\n				$presentar_datalabels=\"false\";  //Asume que no se presentan las etiquetas con valores de datos\n				$cadenaubicacion_datalabels=\"\";\n				if($formato_base[9]!=\"false\" && $formato_base[9]!=\"\") $presentar_datalabels=\"true\";\n				if($formato_base[9]==\"true_outside\") $cadenaubicacion_datalabels=\"dataLabelsPosition: \'outside\',\";\n				if($formato_base[9]==\"true_inside\") $cadenaubicacion_datalabels=\"dataLabelsPosition: \'inside\',\";\n\n				$cadena_arreglo_colores=\"\";\n				if($formato_base[10]!=\"\") $cadena_arreglo_colores=\"colors: \".$formato_base[10].\",\";\n\n				//Elimina los nombres de tabla en caso de tener punto y usa los alias si los tiene\n				for ($i=0;$i<5;$i++)\n					{\n						//Elimina nombres de tabla encontrando el punto y seleccionando siguiente palabra\n						if (strpos($lista_etiqueta_series[$i], \".\"))\n							{\n								$tmp=explode(\".\",$lista_etiqueta_series[$i]);\n								$lista_etiqueta_series[$i]=$tmp[1];\n							}\n						if (strpos($lista_valor_series[$i], \".\"))\n							{\n								$tmp=explode(\".\",$lista_valor_series[$i]);\n								$lista_valor_series[$i]=$tmp[1];\n							}\n						// Prefiere los alias sobre los nombres de campo cuando encuentra un AS\n						if (strpos($lista_etiqueta_series[$i], \" AS \"))\n							{\n								$tmp=explode(\" AS \",$lista_etiqueta_series[$i]);\n								$lista_etiqueta_series[$i]=$tmp[1];\n							}\n						if (strpos($lista_valor_series[$i], \" AS \"))\n							{\n								$tmp=explode(\" AS \",$lista_valor_series[$i]);\n								$lista_valor_series[$i]=$tmp[1];\n							}\n					}\n				$nombre_serie_1=preg_replace(\'~[^a-zA-Z0-9_]~\', \'\', str_replace ( \" \" , \"_\", $lista_nombre_series[0] ) );\n				$nombre_serie_2=preg_replace(\'~[^a-zA-Z0-9_]~\', \'\', str_replace ( \" \" , \"_\", $lista_nombre_series[1] ) );\n				$nombre_serie_3=preg_replace(\'~[^a-zA-Z0-9_]~\', \'\', str_replace ( \" \" , \"_\", $lista_nombre_series[2] ) );\n				$nombre_serie_4=preg_replace(\'~[^a-zA-Z0-9_]~\', \'\', str_replace ( \" \" , \"_\", $lista_nombre_series[3] ) );\n				$nombre_serie_5=preg_replace(\'~[^a-zA-Z0-9_]~\', \'\', str_replace ( \" \" , \"_\", $lista_nombre_series[4] ) );\n				$campo_etiqueta_serie_1=$lista_etiqueta_series[0];\n				$campo_etiqueta_serie_2=$lista_etiqueta_series[1];\n				$campo_etiqueta_serie_3=$lista_etiqueta_series[2];\n				$campo_etiqueta_serie_4=$lista_etiqueta_series[3];\n				$campo_etiqueta_serie_5=$lista_etiqueta_series[4];\n				$campo_valor_serie_1=$lista_valor_series[0];\n				$campo_valor_serie_2=$lista_valor_series[1];\n				$campo_valor_serie_3=$lista_valor_series[2];\n				$campo_valor_serie_4=$lista_valor_series[3];\n				$campo_valor_serie_5=$lista_valor_series[4];\n				// CREA OBJETO SEGUN TIPO DE GRAFICO\n				$TipoObjetoGraficoMorris	 = \"Morris.Area\";  //Por defecto define tipo Area para cualquiera de los definidos sin compatibilidad conocida\n				if ($tipo_grafico==\"area\")\n					$TipoObjetoGraficoMorris = \"Morris.Area\";\n				if ($tipo_grafico==\"barra\" || $tipo_grafico==\"barrah\" || $tipo_grafico==\"barrav\" || $tipo_grafico==\"barrah_multiples\" || $tipo_grafico==\"barrav_multiples\")\n					$TipoObjetoGraficoMorris = \"Morris.Bar\";\n				if ($tipo_grafico==\"linea\" || $tipo_grafico==\"linea_multiples\")\n					$TipoObjetoGraficoMorris = \"Morris.Line\";\n				if ($tipo_grafico==\"dona\"  || $tipo_grafico==\"donap\" || $tipo_grafico==\"torta\" || $tipo_grafico==\"tortap\")\n					$TipoObjetoGraficoMorris = \"Morris.Donut\";\n\n				//Define la cadena de llaves para el grafico\n				$CadenaLlaves=\"\'$nombre_serie_1\'\";				//\'Operaciones\',\'Usuarios\',\'UsoAPI\'\n				if ($nombre_serie_2!=\"\") $CadenaLlaves.=\",\'$nombre_serie_2\'\";\n				if ($nombre_serie_3!=\"\") $CadenaLlaves.=\",\'$nombre_serie_3\'\";\n				if ($nombre_serie_4!=\"\") $CadenaLlaves.=\",\'$nombre_serie_4\'\";\n				if ($nombre_serie_5!=\"\") $CadenaLlaves.=\",\'$nombre_serie_5\'\";\n\n				//Define la cadena de etiquetas para el grafico\n				$CadenaEtiquetas=\"\'$nombre_serie_1\'\";	 //\'Operaciones\',\'Usuarios\',\'UsoAPI\'\n				if ($nombre_serie_2!=\"\") $CadenaEtiquetas.=\",\'$nombre_serie_2\'\";\n				if ($nombre_serie_3!=\"\") $CadenaEtiquetas.=\",\'$nombre_serie_3\'\";\n				if ($nombre_serie_4!=\"\") $CadenaEtiquetas.=\",\'$nombre_serie_4\'\";\n				if ($nombre_serie_5!=\"\") $CadenaEtiquetas.=\",\'$nombre_serie_5\'\";\n			?>\n			<?php\n				//Determina si se debe o no crear cadena para el tooltipo con titulo del informe\n				$CadenaComplementoToolTipTitulo=\"\";\n				if ( $registro_informe[\"tooltip_titulo\"] == \'S\' )\n					$CadenaComplementoToolTipTitulo=\'title=\"\'.PCO_ReemplazarVariablesPHPEnCadena($registro_informe[\"titulo\"]).\'\" data-toggle=\"tooltip\"\';\n\n				//Agrega titulo o encabezado si esta definido\n				if ( $registro_informe[\"encabezado_html\"] != \'\' )\n					echo \'<div id=\"titulo-informe-ID\'.$registro_informe[\"id\"].\'\">\'.$registro_informe[\"encabezado_html\"].\'</div>\';\n			?>\n				<div <?php echo $CadenaComplementoToolTipTitulo; ?> id=\"marco-informe-grafico-ID<?php echo $registro_informe[\"id\"]; ?>\" style=\"height: auto !important;\"></div>\n				<script language=\"JavaScript\">\n					//Genera el codigo Morris para el grafico\n					$(function() {\n						<?php echo $TipoObjetoGraficoMorris; ?>({\n							//Nombre del marco que tiene el grafico\n							element: \'marco-informe-grafico-ID<?php echo $registro_informe[\"id\"]; ?>\',\n							data: [\n							<?php\n								//Inicia la generacion del arreglo con los datos\n								//Si el informe usa una conexion externa usa su configuracion\n								if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n									$resultado_consulta=PCO_EjecutarSQL($consulta,\"\",${$registro_conexiones[\"nombre\"]});\n								else\n									$resultado_consulta=PCO_EjecutarSQL($consulta);\n\n								$cadena_datos=\"\";\n								while ($registro_consulta = $resultado_consulta->fetch())\n									{\n										//Crea series de datos para los graficos de Barra, Linea o area que utilizan los mismos parametros\n										if ($TipoObjetoGraficoMorris!=\"Morris.Donut\")\n											{\n												$cadena_datos.= \"\n													{\";\n												//Agrega datos al arreglo del grafico segun las series disponibles\n												if ($nombre_serie_1 != \"\")\n													{\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_1];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_1];\n														$cadena_datos.= \"\n														\".$nombre_serie_1.\": \".$ValorVisibleCampo.\",\n														etiqueta_ejex: \'$NombreVisibleCampo\'\";\n													}\n												if ($nombre_serie_2 != \"\")\n													{\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_2];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_2];\n														$cadena_datos.= \",\n														\".$nombre_serie_2.\": \".$ValorVisibleCampo;\n													}\n												if ($nombre_serie_3 != \"\")\n													{\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_3];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_3];\n														$cadena_datos.= \",\n														\".$nombre_serie_3.\": \".$ValorVisibleCampo;\n													}\n												if ($nombre_serie_4 != \"\")\n													{\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_4];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_4];\n														$cadena_datos.= \",\n														\".$nombre_serie_4.\": \".$ValorVisibleCampo;\n													}\n												if ($nombre_serie_5 != \"\")\n													{\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_5];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_5];\n														$cadena_datos.= \",\n														\".$nombre_serie_5.\": \".$ValorVisibleCampo;\n													}\n												$cadena_datos.= \"\n													},\";\n											}\n										//Crea series de datos para graficos tipo dona\n										if ($TipoObjetoGraficoMorris==\"Morris.Donut\")\n											{\n												$cadena_datos.= \"\n													{\";\n														$NombreVisibleCampo=$registro_consulta[$campo_etiqueta_serie_1];\n														$ValorVisibleCampo=$registro_consulta[$campo_valor_serie_1];\n														$cadena_datos.= \"\n														label: \'\".$NombreVisibleCampo.\"\', value: \".$ValorVisibleCampo;\n												$cadena_datos.= \"\n													},\";\n											}\n									}\n								$cadena_datos = substr($cadena_datos, 0, -1);\n								if ($cadena_datos!=\"\")\n									echo $cadena_datos;\n								if ($cadena_datos==\"\")\n									$PCO_InformesGraficosSinDatos.=\'marco-informe-grafico-ID\'.$registro_informe[\"id\"].\'|\'; //Si no tiene datos lo lleva al arreglo para cambiar luego su valor html y evitar el NaN\n							?>\n							],\n							xkey: [\'etiqueta_ejex\'],\n							ykeys: [<?php echo $CadenaLlaves; ?>],\n							labels: [<?php echo $CadenaEtiquetas; ?>],\n							pointSize: 2,\n							hideHover: \'auto\',\n							resize: true,\n							stacked: <?php echo $barra_apilada; ?>,\n							preUnits: \'<?php echo $unidades_pre; ?>\',\n							postUnits: \'<?php echo $unidades_pos; ?>\',\n							grid: <?php echo $ocultar_grilla; ?>,\n							horizontal: <?php echo $barras_horizontales; ?>,\n							<?php echo $cadena_arreglo_colores; ?>\n\n							dataLabels: <?php echo $presentar_datalabels; ?>,\n							<?php echo $cadenaubicacion_datalabels; ?>  // EJ: dataLabelsPosition: \'outside\', //inside\n\n							showPercentage: <?php echo $presentar_porcentaje; ?>,\n							donutType: \'<?php echo $tipo_grafico_circular; ?>\',\n							<?php\n								//Agrega las unidades para los tipos de grafico Donut\n								if ($TipoObjetoGraficoMorris==\"Morris.Donut\")\n									echo \"formatter: function (value, data) { return \'$unidades_pre\'+ (value) + \'$unidades_pos\'; },\";\n							?>\n							axes: <?php echo $ocultar_ejes; ?>\n						});\n					});\n				</script>\n			<?php\n			// Si se ha definido un tamano fijo entonces cierra el marco\n			if ($registro_informe[\"ancho\"]!=\"\" && $registro_informe[\"alto\"]!=\"\" && $registro_informe[\"ancho\"]!=\"0\" && $registro_informe[\"alto\"]!=\"0\")\n				echo \'</DIV>\';\n\n			} // Fin si informe es G (grafico)\n\n		if ($en_ventana) PCO_CerrarVentana();\n\n		//Si el usuario es admin le muestra el query generador.\n		if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario) && $ModoDepuracion)\n			PCO_Mensaje($MULTILANG_MonCommSQL, $consulta, \'\', \'fa fa-fw fa-2x fa-database\', \'alert alert-info alert-dismissible \');\n\n		//Ejecuta script POST para el informe\n		if ($CadenaPOSTScriptPHP!=\"\")\n			{\n				PCO_EvaluarCodigo($CadenaPOSTScriptPHP,1,\"Detalles: POST-Code Rep ID=\".$informe);\n			}\n\n		//Ejecuta script POST para el informe llevandolo a la misma cadena de formularios que se agrega en marco_abajo\n		if ($JavaScriptInforme!=\"\")\n			{\n				$PCO_FuncionesJSInternasFORM .= \'<script type=\"text/javascript\">\n				\'.$JavaScriptInforme.\'\n				</script>\';\n			}\n	}','A'),(229,'core/comunes.php','2023-05-17 23:50:00','rafael',9746,486500,'<?php\n/*\n	 _\n	|_) _ _  _ _|_. _ _					  	Copyright (C) 2012-2022\n	|  | (_|(_  | |(_(_) 				  	John F. Arroyave Gutiérrez\n	  www.practico.org					  	unix4you2@gmail.com\n											All rights reserved.\n	\n	 This program is free software: you can redistribute it and/or modify\n	 it under the terms of the GNU General Public License as published by\n	 the Free Software Foundation, either version 3 of the License, or\n	 (at your option) any later version.\n\n	 This program is distributed in the hope that it will be useful,\n	 but WITHOUT ANY WARRANTY; without even the implied warranty of\n	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n	 GNU General Public License for more details.\n\n	 You should have received a copy of the GNU General Public License\n	 along with this program.  If not, see <http://www.gnu.org/licenses/>\n	 \n				--- TRADUCCION NO OFICIAL DE LA LICENCIA ---\n\n	 Esta es una traducción no oficial de la Licencia Pública General de\n	 GNU al español. No ha sido publicada por la Free Software Foundation\n	 y no establece los términos jurídicos de distribución del software \n	 publicado bajo la GPL 3 de GNU, solo la GPL de GNU original en inglés\n	 lo hace. De todos modos, esperamos que esta traducción ayude a los\n	 hispanohablantes a comprender mejor la GPL de GNU:\n	 \n	 Este programa es software libre: puede redistribuirlo y/o modificarlo\n	 bajo los términos de la Licencia General Pública de GNU publicada por\n	 la Free Software Foundation, ya sea la versión 3 de la Licencia, o \n	 (a su elección) cualquier versión posterior.\n\n	 Este programa se distribuye con la esperanza de que sea útil pero SIN\n	 NINGUNA GARANTÍA; incluso sin la garantía implícita de MERCANTIBILIDAD\n	 o CALIFICADA PARA UN PROPÓSITO EN PARTICULAR. Vea la Licencia General\n	 Pública de GNU para más detalles.\n\n	 Usted ha debido de recibir una copia de la Licencia General Pública de\n	 GNU junto con este programa. Si no, vea <http://www.gnu.org/licenses/>\n*/\n\n	/*\n		Title: Libreria base\n		Ubicacion *[/core/comunes.php]*.  Archivo que contiene las funciones de uso global.\n	*/\n	/*\n		Section: Funciones asociadas a las operaciones con bases de datos - Ejecucion de consultas\n	*/\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EjecutarCodigoPOST\n	Evalua directamente el codigo asociado a la seccion POST de un formulario.  Esto permite llamados especificos a funciones encapsuladas que pueda contener un formulario asociado a su logica de negocio\n\n	Variables de entrada:\n	\n		Formulario - Id unico del formulario del cual se desea evaluar el codigo POST\n		Llave - Llave de paso que deberia coincidir con la llave del sistema para poder realizar la operacion\n		ByPassDie - Determina si se debe o no evitar un llamado a la funcion die() de PHP.  Por defecto SIEMPRE se hace el llamado.  Asigne un valor diferente de cero (ej. 1) para evitarlo.\n		Otros - Variables que puedan indicar la accion a realizar, los parametros requeridos o cualquier otro control de seguridad o verificacion requerida por el usuario\n\n	Salida:\n		Evaluacion y ejecucion del codigo\n\n	Vea tambien:\n		<PCO_EjecutarPostFormulario>\n*/\nfunction PCO_EjecutarCodigoPOST($Formulario,$Llave,$ByPassDie=0)\n	{\n		global $LlaveDePaso,$TablasCore;\n		if ($LlaveDePaso==$Llave && $Formulario!=\"\")\n			{\n				// Busca el registro del formulario\n				$RegistroFormulario=PCO_EjecutarSQL(\"SELECT id,post_script,titulo FROM \".$TablasCore.\"formulario WHERE id=? \",\"$Formulario\")->fetch();\n				//Si encuentra codigo lo ejecuta\n				if ($RegistroFormulario[\"id\"]!=\"\")\n					{\n						PCO_EvaluarCodigo($RegistroFormulario[\"post_script\"]);\n						//Lleva auditoria de la ejecucion\n						PCO_Auditar(\"Ejecucion post-accion formulario (Id={$Formulario}) \".PCO_ReemplazarVariablesPHPEnCadena($RegistroFormulario[\"titulo\"]),\"API.Practico\");\n					}\n			}\n		if ($ByPassDie==0)\n			die(); //Finaliza ejecucion despues de cualquier evaluacion\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_Minimizador_ObtenerSiguientePosicionMinimizacion\n	Dado el arrglo de secuencias minimizadas, busca la siguiente posicion de secuencia que se debe revisar\n\n	Salida:\n		Posicion objetivo\n\n	Vea tambien:\n		<PCO_Minimizador_OptimizarJS> <PCO_Minimizador_OptimizarCSS>\n*/\n$ArregloSecuenciasMinimizadas = array();\nfunction PCO_Minimizador_ObtenerSiguientePosicionMinimizacion()\n	{\n		global $ArregloSecuenciasMinimizadas;\n		return \'<-!!-\' . sizeof($ArregloSecuenciasMinimizadas) . \'-!!->\';\n	}\n\n\nabstract class PCO_Minimizador_BuscadorSecuenciasMinimizacion\n	{\n		public $IndiceInicial;\n		public $IndiceFinal;\n		public $Tipo;\n		abstract protected function ObtenerPrimerValor($Cadena);\n		\n		public function isValid()\n			{\n				return $this->IndiceInicial !== false;\n			}\n	}\n\n\nclass BuscadorSecuenciasCadenas extends PCO_Minimizador_BuscadorSecuenciasMinimizacion\n	{\n		protected $DelimitadorInicial;\n		protected $DelimitadorFinal;\n		\n		function __construct($DelimitadorInicial, $DelimitadorFinal)\n			{\n				$this->type = $DelimitadorInicial;\n				$this->start_delimiter = $DelimitadorInicial;\n				$this->end_delimiter = $DelimitadorFinal;\n			}\n			\n		public function ObtenerPrimerValor($Cadena)\n			{\n				$this->IndiceInicial = strpos($Cadena, $this->start_delimiter);\n				if ($this->isValid())\n					{\n						$this->IndiceFinal = strpos($Cadena, $this->end_delimiter, $this->IndiceInicial+1);\n						// sanity check for non well formed lines\n						$this->IndiceFinal = ($this->IndiceFinal === false ? strlen($Cadena) :\n						$this->IndiceFinal + strlen($this->end_delimiter));\n					}\n			}\n	}\n\n\nclass PCO_Minimizador_BuscadorSecuenciasCadenas extends PCO_Minimizador_BuscadorSecuenciasMinimizacion\n	{\n		function __construct($Tipo)\n			{\n				$this->type = $Tipo;\n			}\n			\n		public function ObtenerPrimerValor($Cadena)\n			{\n				$this->IndiceInicial = strpos($Cadena, $this->type);\n				if ($this->isValid())\n					{\n						// busque la primera comilla final que no haya escapado\n						$this->IndiceFinal = $this->IndiceInicial+1;\n						while ($this->IndiceFinal < strlen($Cadena))\n							{\n								// encontrar el número de escapes antes de la comilla final\n								if (preg_match(\'/(\\\\\\\\*)(\' . preg_quote($this->type) . \')/\', $Cadena, $ArregloEncontrados, PREG_OFFSET_CAPTURE, $this->IndiceFinal))\n									{\n										$this->IndiceFinal = $ArregloEncontrados[2][1] + 1;\n										// si un número impar de escapes antes de comilla, la comilla se escapa. Sigue adelante\n										if (!isset($ArregloEncontrados[1][0]) || strlen($ArregloEncontrados[1][0]) % 2 == 0)\n											{\n												return;\n											}\n									}\n								else\n									{\n										// no match, not well formed\n										$this->IndiceFinal = strlen($Cadena);\n										return;\n									}\n							}\n					}\n			}\n	}\n\n\nfunction PCO_Minimizador_ObtenerSiguienteSecuenciaEspecial($Cadena, $Secuencias)\n	{\n		// $ArregloIndices es una matriz del índice más cercano para todos los caracteres especiales\n		$ArregloIndices = array();\n		foreach ($Secuencias as $Buscador)\n			{\n				$Buscador->ObtenerPrimerValor($Cadena);\n				if ($Buscador->isValid())\n					{\n						$ArregloIndices[$Buscador->IndiceInicial] = $Buscador;\n					}\n			}\n		// Si no encuentra ninguno retorna\n		if (count($ArregloIndices) == 0) {return false;}\n		// Otiene el primer item que coincida\n		asort($ArregloIndices);\n		return $ArregloIndices[min(array_keys($ArregloIndices))];\n	}\n\n\nclass PCO_Minimizador_BuscadorSecuenciasExpRegularesJS extends PCO_Minimizador_BuscadorSecuenciasMinimizacion\n	{\n		function __construct()\n			{\n				$this->type = \'regex\';\n			}\n		\n		// verifica que este no sea el comienzo de un comentario o una división\n		public function BuscarPosibleInicio($Cadena, $Indice = 0)\n			{\n				$IndiceInicial = strpos($Cadena, \'/\', $Indice);\n				if ($IndiceInicial === false)\n					{\n						return false;\n					}\n				if (substr($Cadena, $IndiceInicial, 2) === \'//\' || substr($Cadena, $IndiceInicial, 2) === \'/*\')\n					{\n						// comentario encontrado, no patrón, no se moleste en continuar\n						return false;\n					}\n				$IndiceTemporal = $IndiceInicial - 1;\n				// obtener el primer carácter anterior no espacial\n				while ($IndiceTemporal > 0 && substr($Cadena, $IndiceTemporal, 1) == \' \') {$IndiceTemporal--;}\n				if ($IndiceTemporal > 0)\n					{\n						$Caracter = substr($Cadena, $IndiceTemporal, 1);\n						// si el carácter o el número es una división, ve más lejos\n						if (is_numeric($Caracter) || ctype_alpha($Caracter) || $Caracter == \')\' || $Caracter == \']\')\n							{\n								return $this->BuscarPosibleInicio($Cadena, $IndiceInicial + 1);\n							}\n					}\n				return $IndiceInicial;\n			}\n			\n		public function ObtenerPrimerValor($Cadena)\n			{\n				$this->IndiceInicial = $this->BuscarPosibleInicio($Cadena);\n				if ($this->IndiceInicial === false)\n					{\n						return;\n					}\n				// position of first newline after pattern\n				$NuevaLinea = strpos($Cadena, \"\\n\", $this->IndiceInicial);\n				// look for first non escaped endquote\n				$IndiceFinal = $this->IndiceInicial+1;\n				while ($IndiceFinal < strlen($Cadena)\n				// if there\'s still room to explore in the string\n				&& ($NuevaLinea === false || $IndiceFinal < $NuevaLinea)) // and we\'re not at a newline yet\n					{\n						// find number of escapes before endquote\n						if (preg_match(\'/(\\\\\\\\*)(\\/)/\', $Cadena, $ArregloEncontrados, PREG_OFFSET_CAPTURE, $IndiceFinal))\n								{\n									$IndiceFinal = $ArregloEncontrados[2][1] + 1;\n									// if odd number of escapes before endquote, endquote is escaped. Keep going\n									if (!isset($ArregloEncontrados[1][0]) || strlen($ArregloEncontrados[1][0]) % 2 == 0)\n										{\n											if ($NuevaLinea !== false && $IndiceFinal > $NuevaLinea) {return false;}\n											$this->IndiceFinal = $IndiceFinal;\n											return;\n										}\n									// no coincide o no esta bien formado el codigo\n								}\n							else\n								{\n									$this->IndiceInicial = false;\n									return;\n								}\n					}\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_Minimizador_OptimizarCSS\n	Toma un codigo CSS y lo miniminiza antes de ser publicado en produccion ayudando a disminuir tiempos de transferencia\n\n	Salida:\n		Codigo CSS equivalente pero minimizado\n\n	Vea tambien:\n		<PCO_CargarFormulario> <PCO_Minimizador_OptimizarJS>\n*/\n$BuscadorSecuenciasComillaSimple = new PCO_Minimizador_BuscadorSecuenciasCadenas(\'\\\'\');\n$BuscadorSecuenciasComillaDoble = new PCO_Minimizador_BuscadorSecuenciasCadenas(\'\"\');\n$BuscadorComentariosDeBloque = new BuscadorSecuenciasCadenas(\'/*\', \'*/\');\nfunction PCO_Minimizador_OptimizarCSS($CodigoCSS)\n	{\n		global $ArregloSecuenciasMinimizadas, $BuscadorSecuenciasComillaSimple, $BuscadorSecuenciasComillaDoble, $BuscadorComentariosDeBloque;\n		$CaracteresEspecialesCSS = array($BuscadorComentariosDeBloque, // Comentario CSS\n			$BuscadorSecuenciasComillaSimple, // Comilla simple de escape, ej :before{ content: \'-\';}\n			$BuscadorSecuenciasComillaDoble); // Comilla doble\n		// Elimina todo lo que haya que ser eliminado y conserva el resto\n		while ($Secuencia = PCO_Minimizador_ObtenerSiguienteSecuenciaEspecial($CodigoCSS, $CaracteresEspecialesCSS))\n			{\n				switch ($Secuencia->type)\n					{\n						case \'/*\': // Elimina comentarios\n							$CodigoCSS = substr($CodigoCSS, 0, $Secuencia->IndiceInicial) . substr($CodigoCSS, $Secuencia->IndiceFinal);\n							break;\n						default: // Cadenas que deben ser conservadas\n							$Posicion = PCO_Minimizador_ObtenerSiguientePosicionMinimizacion();\n							$ArregloSecuenciasMinimizadas[$Posicion] = substr($CodigoCSS, $Secuencia->IndiceInicial, $Secuencia->IndiceFinal - $Secuencia->IndiceInicial);\n							$CodigoCSS = substr($CodigoCSS, 0, $Secuencia->IndiceInicial) . $Posicion . substr($CodigoCSS, $Secuencia->IndiceFinal);\n					}\n			}\n		// minimiza la cadena\n		$CodigoCSS = preg_replace(\'/\\s{2,}/s\', \' \', $CodigoCSS);\n		$CodigoCSS = preg_replace(\'/\\s*([:;{}])\\s*/\', \'$1\', $CodigoCSS);\n		$CodigoCSS = preg_replace(\'/;}/\', \'}\', $CodigoCSS);\n		// devuelve las cadenas que se deben conservar\n		foreach($ArregloSecuenciasMinimizadas as $Posicion => $Original)\n			{\n				$CodigoCSS = str_replace($Posicion, $Original, $CodigoCSS);\n			}\n		return trim($CodigoCSS);\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_Minimizador_OptimizarJS\n	Toma un codigo JS y lo miniminiza antes de ser publicado en produccion ayudando a disminuir tiempos de transferencia y ocultando en parte alguna logica de negocio\n\n	Salida:\n		Codigo JS equivalente pero minimizado\n\n	Vea tambien:\n		<PCO_CargarFormulario> <PCO_Minimizador_OptimizarCSS>\n*/\n$BuscadorLineasComentarios = new BuscadorSecuenciasCadenas(\'//\', \"\\n\");\nfunction PCO_Minimizador_OptimizarJS($CodigoJS)\n	{\n		global $ArregloSecuenciasMinimizadas, $BuscadorSecuenciasComillaSimple, $BuscadorSecuenciasComillaDoble,\n		$BuscadorComentariosDeBloque, $BuscadorLineasComentarios;\n		$CaracteresEspecialesJava = array($BuscadorComentariosDeBloque, // Comentario de bloques JavaScript\n				$BuscadorLineasComentarios, // Comentario de lineas JavaScript\n				$BuscadorSecuenciasComillaSimple, // Comilla simple, ej :before{ content: \'-\';}\n				$BuscadorSecuenciasComillaDoble, // Comilla doble\n				new PCO_Minimizador_BuscadorSecuenciasExpRegularesJS() // Expresion regular JavaScript\n			);\n		// Elimina todo lo que haya que ser eliminado y conserva el resto\n		while ($Secuencia = PCO_Minimizador_ObtenerSiguienteSecuenciaEspecial($CodigoJS, $CaracteresEspecialesJava))\n			{\n				switch ($Secuencia->type)\n					{\n						case \'/*\':\n						case \'//\':// Elimina comentarios\n							$CodigoJS = substr($CodigoJS, 0, $Secuencia->IndiceInicial) . substr($CodigoJS, $Secuencia->IndiceFinal);\n							break;\n						default: // Cadenas con comillas o expresiones regulares que deben ser conservadas\n							$IndiceInicial = $Secuencia->IndiceInicial;\n							$IndiceFinal = $Secuencia->IndiceFinal;\n							$Posicion = PCO_Minimizador_ObtenerSiguientePosicionMinimizacion();\n							$ArregloSecuenciasMinimizadas[$Posicion] =substr($CodigoJS, $IndiceInicial, $IndiceFinal - $IndiceInicial);\n							$CodigoJS = substr($CodigoJS, 0, $IndiceInicial) . $Posicion . substr($CodigoJS, $IndiceFinal);\n					}\n			}\n		// Caso especial donde el + indica tratar la variable como numérica, p. ej. a = b + + c\n		$CodigoJS = preg_replace(\'/([-\\+])\\s+\\+([^\\s;]*)/\', \'$1 (+$2)\', $CodigoJS);\n		// Condensar (unir) espacios\n		$CodigoJS = preg_replace(\"/\\s*\\n\\s*/\", \"\\n\", $CodigoJS);\n		// Espacios alrededor de nuevas lineas\n		$CodigoJS = preg_replace(\"/\\h+/\", \" \", $CodigoJS); // \\h+ horizontal white space\n		// Remueve espacios horizontales innecesarios cerca a no variables (alfanumericos, underscore, signo pesos)\n		$CodigoJS = preg_replace(\"/\\h([^A-Za-z0-9\\_\\$])/\", \'$1\', $CodigoJS);\n		$CodigoJS = preg_replace(\"/([^A-Za-z0-9\\_\\$])\\h/\", \'$1\', $CodigoJS);\n		// Eliminar los espacios innecesarios entre corchetes y paréntesis\n		$CodigoJS = preg_replace(\"/\\s?([\\(\\[{])\\s?/\", \'$1\', $CodigoJS);\n		$CodigoJS = preg_replace(\"/\\s([\\)\\]}])/\", \'$1\', $CodigoJS);\n		// Eliminar espacios innecesarios alrededor de los operadores que no necesitan ningún espacio (específicamente nuevas líneas)\n		$CodigoJS = preg_replace(\"/\\s?([\\.=:\\-+,])\\s?/\", \'$1\', $CodigoJS);\n		// Caracteres innecesarios\n		$CodigoJS = preg_replace(\"/;\\n/\", \";\", $CodigoJS); // punto y coma antes de una nueva linea\n		$CodigoJS = preg_replace(\'/;}/\', \'}\', $CodigoJS); // punto y coma antes del corchete final\n		// Volver a poner las cadenas conservadas\n		foreach($ArregloSecuenciasMinimizadas as $Posicion => $Original)\n			{\n				$CodigoJS = str_replace($Posicion, $Original, $CodigoJS);\n			}\n		return trim($CodigoJS);\n	}\n\n\n/* ################################################################## */\n/* ################################################################## */\n/*\n	Function: PCO_SAML_CrearUsuario\n	Agrega usuarios de manera automatica cuando son autenticados por SAML\n*/\n	function PCO_SAML_CrearUsuario($login_chk=\'\',$nombre_chk=\'\',$correo_chk=\'\',$interno_chk=0,$plantilla_permisos_chk=\'\')\n		{\n			global $TablasCore,$LlaveDePaso,$PCO_FechaOperacion,$ListaCamposSinID_usuario;\n			// Inserta datos del usuario\n			$clavemd5=MD5(PCO_TextoAleatorio(20));\n			$pasomd5=MD5($LlaveDePaso);\n			$descripcion=\"Auth:SAML\";\n			//Agrega el registro de usuario si aun no existe\n			if (!PCO_ExisteValor($TablasCore.\"usuario\",\"login\",$login_chk))\n				{\n					@PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"usuario (login,clave,nombre,estado,correo,ultimo_acceso,llave_paso,usuario_interno,plantilla_permisos,descripcion) VALUES (\'$login_chk\',\'$clavemd5\',\'$nombre_chk\',1,\'$correo_chk\',\'$PCO_FechaOperacion\',\'$pasomd5\',\'$interno_chk\',\'$plantilla_permisos_chk\',\'$descripcion\')\");\n					PCO_Auditar(\"OAuth:Agregado usuario $login_chk para SAML\");\n				}\n		}\n\n\n/* ################################################################## */\n/* ################################################################## */\n/*\n	Function: PCO_SAML_EjecutarLogin\n	Recibe los parametros necesarios para hacer el registro de un usuario en la plataforma durante su ingreso cuando se usa oauth\n	\n	Variables de entrada:\n\n		accion - Accion a ser ejectudada, de la que se desea buscar permiso heredado por otra\n\n	Salida:\n		Variables de sesion registradas\n		Redireccion del usuario al menu\n*/\n	function PCO_SAML_EjecutarLogin($login_chk)\n		{\n			global $TablasCore,$uid,$ListaCamposSinID_usuario,$ListaCamposSinID_parametros,$ListaCamposSinID_parametros,$ListaCamposSinID_auditoria,$PCO_DireccionAuditoria,$PCO_HoraOperacion,$PCO_FechaOperacion,$ArchivoCORE;\n			$nombre_chk=$login_chk;\n			$correo_chk=\"\";\n			$plantilla_origen_permisos=PCO_EjecutarSQL(\"SELECT usuario_plantilla FROM core_samlconector WHERE activado=\'S\' ORDER BY nombre_conector LIMIT 0,1 \")->fetchColumn();\n\n			// Busca datos del usuario Practico, segun tipo de servicio OAuth para tener configuraciones de permisos y parametros propios de la herramienta\n			$consulta_busqueda_usuario_oauth=\"SELECT $ListaCamposSinID_usuario FROM \".$TablasCore.\"usuario WHERE login=\'$login_chk\' AND descripcion LIKE \'%Auth:$OAuth_servicio%\' \";\n			$registro=PCO_EjecutarSQL($consulta_busqueda_usuario_oauth)->fetch();\n\n			// Agrega el usuario cuando es primer login desde el servicio\n			if ($registro[\"login\"]==\"\")\n				{\n					PCO_SAML_CrearUsuario($login_chk,$nombre_chk,$correo_chk,1,$plantilla_origen_permisos);\n					// Actualiza el registro desde nueva consulta\n					$registro=PCO_EjecutarSQL($consulta_busqueda_usuario_oauth)->fetch();\n				}\n\n			//Copia permisos de la plantilla si aplica\n			if ($registro[\"plantilla_permisos\"]!=\"\")\n				{\n					PCO_Auditar(\"Carga permisos a su perfil desde plantilla \".$registro[\"plantilla_permisos\"],$login_chk);\n					PCO_CopiarPermisos($registro[\"plantilla_permisos\"],$login_chk);\n					PCO_CopiarInformes($registro[\"plantilla_permisos\"],$login_chk);\n				}\n\n			// Se buscan datos de la aplicacion\n			$consulta_parametros=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_parametros.\" FROM \".$TablasCore.\"parametros\");\n			$registro_parametros = $consulta_parametros->fetch();\n\n			// Actualiza las variables de sesion con el registro\n			$PCOSESS_SesionAbierta=1;\n			// Actualiza booleana de ingreso\n			$clave_correcta=1;\n			// Registro de variables en la sesion\n			@session_start();\n			if (!isset($_SESSION[\"PCOSESS_LoginUsuario\"]))  $_SESSION[\"PCOSESS_LoginUsuario\"]=(string)$registro[\"login\"];\n			if (!isset($_SESSION[\"username\"]))              $_SESSION[\"username\"]=(string)$registro[\"login\"]; //Usada para el modulo de chat\n			if (!isset($_SESSION[\"Nombre_usuario\"]))        $_SESSION[\"Nombre_usuario\"]=(string)$registro[\"nombre\"];\n			if (!isset($_SESSION[\"Descripcion_usuario\"]))   $_SESSION[\"Descripcion_usuario\"]=(string)$registro[\"descripcion\"];\n			if (!isset($_SESSION[\"Nivel_usuario\"]))         $_SESSION[\"Nivel_usuario\"]=(string)$registro[\"nivel\"];\n			if (!isset($_SESSION[\"Correo_usuario\"]))        $_SESSION[\"Correo_usuario\"]=(string)$registro[\"correo\"];\n			if (!isset($_SESSION[\"Clave_usuario\"]))         $_SESSION[\"Clave_usuario\"]=$registro[\"clave\"];\n			if (!isset($_SESSION[\"LlaveDePasoUsuario\"]))    $_SESSION[\"LlaveDePasoUsuario\"]=$registro[\"llave_paso\"];\n			if (!isset($_SESSION[\"PCOSESS_SesionAbierta\"])) $_SESSION[\"PCOSESS_SesionAbierta\"]=$PCOSESS_SesionAbierta;\n			if (!isset($_SESSION[\"clave_correcta\"]))        $_SESSION[\"clave_correcta\"]=$clave_correcta;\n			if (!isset($_SESSION[\"Nombre_Empresa_Corto\"]))  $_SESSION[\"Nombre_Empresa_Corto\"]=$registro_parametros[\"nombre_empresa_corto\"];\n			if (!isset($_SESSION[\"Nombre_Aplicacion\"]))     $_SESSION[\"Nombre_Aplicacion\"]=$registro_parametros[\"nombre_aplicacion\"];\n			if (!isset($_SESSION[\"Version_Aplicacion\"]))    $_SESSION[\"Version_Aplicacion\"]=$registro_parametros[\"version\"];\n\n			// Lleva a auditoria con query manual por la falta de $PCOSESS_LoginUsuario\n			PCO_Auditar(\"Ingresa al sistema desde $PCO_DireccionAuditoria\",$_SESSION[\"PCOSESS_LoginUsuario\"]);\n			// Actualiza fecha del ultimo ingreso para el usuario\n			PCO_EjecutarSQLUnaria(\"UPDATE \".$TablasCore.\"usuario SET ultimo_acceso=\'$PCO_FechaOperacion\' WHERE login=\'\".$registro[\"login\"].\"\'\");\n\n			// Redirecciona al menu\n			header(\"Location: ../../../index.php\");\n			exit();\n		}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_GenerarNombreAdjunto\n	Busca ocurrencias de las cadenas de formato de nombre de un archivo adjunto y las reemplaza por los valores correspondientes\n\n	Salida:\n\n		Nombre final del path del archivo adjunto\n\n	Vea tambien:\n\n		<PCO_GuardarDatosFormulario> | <PCO_ActualizarDatosFormulario>\n*/\nfunction PCO_GenerarNombreAdjunto($nombre_archivo,$campo_tabla,$extension_archivo,$path_final_archivo)\n{\n	global $PCO_FechaOperacion,$PCO_HoraOperacion,$PCOSESS_LoginUsuario;\n\n	$valores_buscar_rem_array = array\n		(\n			  array(\"_ORIGINAL_\",$nombre_archivo),\n			  array(\"_CAMPOTABLA_\",$campo_tabla),\n			  array(\"_FECHA_\",$PCO_FechaOperacion),\n			  array(\"_HORA_\",$PCO_HoraOperacion),\n			  array(\"_HORAINTERNET_\",date(\'B\')),\n			  array(\"_USUARIO_\",$PCOSESS_LoginUsuario),\n			  array(\"_MICRO_\",date(\'u\')),\n			  array(\"_EXTENSION_\",$extension_archivo)\n		);\n\n	foreach ($valores_buscar_rem_array as $valores_buscar_rem) {\n\n		if (strpos($path_final_archivo,$valores_buscar_rem[0])!==FALSE) $path_final_archivo=str_replace($valores_buscar_rem[0], $valores_buscar_rem[1], $path_final_archivo); // Booleana requiere === o !==\n	}\n\n	return $path_final_archivo;\n}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_AgregarFaroAnalytics\n	Agrega el codigo HTML y JS necesario para activar los faros de Google Analytics cuando asi se desea\n	\n	Salida:\n		Funciones requeridas para la adcion del faro al final de la pagina\n*/\nfunction PCO_AgregarFaroAnalytics()\n	{\n		global $PCO_Accion,$TablasCore,$CodigoGoogleAnalytics;\n		$PosfijoGA=$_SERVER[\'SERVER_NAME\'].\'/ACT/\'.$PCO_Accion.\'/SCR\'.$_SERVER[\'PHP_SELF\'];\n		$RegistroParam=PCO_EjecutarSQL(\"SELECT nombre_empresa_corto,nombre_aplicacion FROM {$TablasCore}parametros LIMIT 0,1\")->fetch();\n		$InfoAppGA=$RegistroParam[\"nombre_empresa_corto\"].\" - \".$RegistroParam[\"nombre_aplicacion\"];\n		// Este valor indica un ID generico de GA UA-847800-9 No edite esta linea sobre el codigo\n		// Para validar que su ID es diferente al generico de seguimiento.  En lugar de esto cambie\n		// su valor a traves del panel de configuracion de Practico con el entregado como ID de GoogleAnalytics\n		$TagsGA[]=base64_decode(\"VUEtODQ3ODAwLTk=\");\n		if ($CodigoGoogleAnalytics!=\"\" && $CodigoGoogleAnalytics!=\"UA-847800-9\") $TagsGA[]=$CodigoGoogleAnalytics;\n		//Global site tag (gtag.js) - Google Analytics\n		foreach ($TagsGA as $EtiquetaGA)\n			{\n				echo \"<script async src=\'https://www.googletagmanager.com/gtag/js?id={$EtiquetaGA}\'></script>\n					<script>\n					  window.dataLayer = window.dataLayer || [];\n					  function gtag(){dataLayer.push(arguments);}\n					  gtag(\'js\', new Date());\n					  gtag(\'config\', \'{$EtiquetaGA}\',\n							{\n								\'transport_type\': \'beacon\',\n								\'page_title\': \'{$InfoAppGA}\',\n								\'page_path\': \'{$PosfijoGA}\',\n							}\n					  );\n					</script>\";				\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EvaluarCodigo\n	Ejecuta codigo PHP recibido dentro de una cadena.  Reemplazo para la funcion eval que pasa a ser obsoleta por seguridad\n\n	Variables de entrada:\n\n		CadenaCodigoPHP - Cadena con todo el codigo a evaluar TIENE que comenzar con el tag <?php si se desea interpretar\n\n	Salida:\n		Evaluacion y ejecucion del codigo correspondiente mediante la inclusion de un archivo temporal con su contenido\n*/\nfunction PCO_EvaluarCodigo($CadenaCodigoPHP,$ByPassSintaxis=0,$DescComplemento=\"\",$EvitarInclusionSoloRevisar=0)\n{\n	global $PCO_ChequeoDinamicoSintaxis;\n\n	$ArchivoInclusionTemporal = tmpfile(); //Crea un archivo temporal\n	$MetadatosArchivoCreado = stream_get_meta_data ( $ArchivoInclusionTemporal );\n	$RutaArchivoTemporal = $MetadatosArchivoCreado [\'uri\'];\n	fwrite ( $ArchivoInclusionTemporal, $CadenaCodigoPHP );\n\n	//Busca si se tienen errores o no para saber si incluye el archivo \n	$ErroresSintaxis=0;\n	if ($PCO_ChequeoDinamicoSintaxis==1 || $ByPassSintaxis==1)\n		$ErroresSintaxis=PCO_BuscarErroresSintaxisPHP($RutaArchivoTemporal,1,$DescComplemento);\n	if ($ErroresSintaxis==0 && $EvitarInclusionSoloRevisar==0)\n		{\n			try\n				{\n					$ResultadoInclusion = include ($RutaArchivoTemporal);\n				}\n			catch (Exception $e)\n				{\n					echo \"Se ha detectado un error durante la inclusion del archivo {$RutaArchivoTemporal}: \",  $e->getMessage();\n				}\n		}\n\n	fclose ( $ArchivoInclusionTemporal );\n	return $ResultadoInclusion;\n}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImprimirOpcionMenu\n	Imprime en pantalla una opcion de menu, de acuerdo a su configuracion recibida en el registro y la ubicacion definida.\n\n	Variables de entrada:\n\n		RegistroOpcion - Registro completo de la opcion de menu\n		Ubicacion - Ubicacion sobre la cual se desea ubicar la opcion y que obedece a las mismas disponibles cuando esta es creada. Posibilidades: [arriba,escritorio,centro,lateral,formulario]\n\n	Salida:\n		Impresion del codigo HTML correspondiente\n*/\nfunction PCO_ImprimirOpcionMenu($RegistroOpcion,$Ubicacion=\'\',$PreUbicacion=\'\')\n	{\n		global $ArchivoCORE,$PCOSESS_LoginUsuario,$TablasCore;\n\n		//Verifica si se trata de una opcion simple o de una agrupadora.  Si es agrupadora recorre sus opciones hijas\n		if ($RegistroOpcion[\'tipo_menu\']==\'grp\')\n			{\n				// Si el usuario es diferente al administrador agrega condiciones al query\n				if (!PCO_EsAdministrador(@$PCOSESS_LoginUsuario) && $Ubicacion!=\'formulario\')\n					{\n						$Complemento_tablas=\",\".$TablasCore.\"usuario_menu\";\n						$Complemento_condicion=\" AND \".$TablasCore.\"usuario_menu.menu=\".$TablasCore.\"menu.hash_unico AND \".$TablasCore.\"usuario_menu.usuario=\'$PCOSESS_LoginUsuario\'\";  // AND nivel>0\n					}\n\n				if ($Ubicacion==\'formulario\') $Complemento_condicion=\" AND \".$TablasCore.\"menu.formulario_vinculado=\".$RegistroOpcion[\"formulario_vinculado\"].\"\";  // AND nivel>0\n\n				if ($Ubicacion==\'lateral\') $Complemento_AnchoLateral=\' style=\"width: 100%; font-size:0.95em;\" \';  // Agrega porcentaje de 100% ancho a las opciones laterales\n\n				$ResultadoOpcionesAnidadas=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"menu \".@$Complemento_tablas.\" WHERE padre=\'\".$RegistroOpcion[\'hash_unico\'].\"\' \".@$Complemento_condicion.\" ORDER BY peso\");\n				$CadenaPreOpcion=\'\n					<div class=\"btn-group\" \'.$Complemento_AnchoLateral.\'>\n					  <button type=\"button\" \'.$Complemento_AnchoLateral.\' class=\"btn dropdown-toggle \'.$RegistroOpcion[\"clase_contenedor\"].\' \" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n						<div align=left>\n							<i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i> \'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\' <span class=\"caret\"></span>\n						</div>\n					  </button>\n					  <ul class=\"dropdown-menu\">\';\n				$CadenaPosOpcion=\'\n					  </ul>\n					</div>\';\n\n				//Si la posicion es un formulario cambia el estilo de presentacion del grupo\n				if ($Ubicacion==\"formulario\")\n					{\n						$CadenaPreOpcion=\'\n							<div class=\"btn-group\">\n							  <li class=\"btn dropdown-toggle \'.$RegistroOpcion[\"clase_contenedor\"].\' \" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n								<i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i> \'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\' <span class=\"caret\"></span>\n							  </li>\n							  <ul class=\"dropdown-menu\">\';\n						$CadenaPosOpcion=\'\n							  </ul>\n							</div>\';\n					}\n\n				//Crea el elemento para dropdown con las opciones\n				echo $CadenaPreOpcion;\n						// Imprime las opciones con sus formularios\n						while($RegistroOpcionAnidada = $ResultadoOpcionesAnidadas->fetch())\n							PCO_ImprimirOpcionMenu($RegistroOpcionAnidada,\'submenu\',$Ubicacion);\n				echo $CadenaPosOpcion;\n			}\n\n		//Genera el formulario que sera llamado en la opcion de menu\n		echo \'<form action=\"\'.$ArchivoCORE.\'\" method=\"post\" name=\"\'.$PreUbicacion.\'_\'.$Ubicacion.\'_\'.$RegistroOpcion[\"id\"].\'\" id=\"\'.$PreUbicacion.\'_\'.$Ubicacion.\'_\'.$RegistroOpcion[\"id\"].\'\" style=\"display:inline; height: 0px; border-width: 0px; width: 0px; padding: 0; margin: 0;\">\';\n		// Verifica si se trata de un comando interno o personal y crea formulario y enlace correspondiente (ambos funcionan igual)\n		if ($RegistroOpcion[\"tipo_comando\"]==\"Interno\" || $RegistroOpcion[\"tipo_comando\"]==\"Personal\")\n			echo \'<input type=\"hidden\" name=\"PCO_Accion\" value=\"\'.$RegistroOpcion[\"comando\"].\'\">\';\n		// Verifica si se trata de una opcion para cargar un objeto de practico\n		if ($RegistroOpcion[\"tipo_comando\"]==\"Objeto\")\n			echo\'<input type=\"hidden\" name=\"PCO_Accion\" value=\"PCO_CargarObjeto\"><input type=\"hidden\" name=\"PCO_Objeto\" value=\"\'.$RegistroOpcion[\"comando\"].\'\">\';\n		echo \'</form>\';\n\n		//Define la cadena a imprimir como accion para el menu\n		$CadenaPreOpcion=\'\';\n		$CadenaPosOpcion=\'</a>\';\n		//Si tiene una URL trata la opcion como enlace estandar, sino como opcion de menu especial\n		if ($RegistroOpcion[\"url\"]!=\"\")\n			{\n				if ($Ubicacion==\'submenu\' || $Ubicacion==\'usuario\')\n					$CadenaPreOpcion= \'<a href=\"\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"url\"]).\'\" target=\"\'.$RegistroOpcion[\"destino\"].\'\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i> \'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]);\n				else\n					$CadenaPreOpcion= \'<a title=\"\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\'\" href=\"\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"url\"]).\'\" target=\"\'.$RegistroOpcion[\"destino\"].\'\">\';\n			}\n		else\n			{\n				if ($Ubicacion==\'arriba\' || $Ubicacion==\'lateral\') $CadenaPreOpcion= \'<a href=\"javascript:document.\'.$PreUbicacion.\'_\'.$Ubicacion.\'_\'.$RegistroOpcion[\"id\"].\'.submit();\">\';\n				if ($Ubicacion==\'submenu\' || $Ubicacion==\'usuario\')$CadenaPreOpcion= \'<a href=\"javascript:document.\'.$PreUbicacion.\'_\'.$Ubicacion.\'_\'.$RegistroOpcion[\"id\"].\'.submit();\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i> \'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\' \'.$TextoAccesoDirecto;\n				if ($Ubicacion==\'centro\' || $Ubicacion==\'escritorio\' || $Ubicacion==\'formulario\')$CadenaPreOpcion= \'<a title=\"\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\'\" href=\"javascript:document.\'.$PreUbicacion.\'_\'.$Ubicacion.\'_\'.$RegistroOpcion[\"id\"].\'.submit();\">\';\n			}\n\n		//Imprime opciones de submenus\n		if ($RegistroOpcion[\'tipo_menu\']==\'opc\' && $Ubicacion==\"submenu\")\n			{\n\n				//Define el texto a ubicar al lado derecho de la opcion cuando se ha indicadu su valor de acceso directo\n				$TextoAccesoDirecto=\'<span class=\"pull-right text-muted small\"><i>Ctrl+O</i></span>\';\n				$TextoAccesoDirecto=\'\';\n\n				//Si la imagen definida para el menu es la palabra clave _SEPARADOR_ entonces lo trata como tal, en caso contrario presenta la opcion\n				if ($RegistroOpcion[\"imagen\"]==\"_SEPARADOR_\")\n					echo \'<li role=\"separator\" class=\"divider\"></li>\';\n				else\n					{\n						//Imprime el item de menu\n						echo \'<li class=\"\'.$RegistroOpcion[\"clase_contenedor\"].\'\">\';\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion;\n						echo \'</li>\';\n					}\n			}\n\n		//Imprime opciones estandar de menu\n		if ($RegistroOpcion[\'tipo_menu\']==\'opc\' && $Ubicacion!=\"submenu\")\n			{\n				//Determina si la opcion es una imagen o no\n				$PCO_EsImagen=0;\n				if (strpos($RegistroOpcion[\"imagen\"],\".png\") || strpos($RegistroOpcion[\"imagen\"],\".jpg\") || strpos($RegistroOpcion[\"imagen\"],\".gif\"))\n					$PCO_EsImagen=1;\n\n				//Si no detecta ninguna extension de archivo de imagen entonces agrega codigo en bootstrap para representarla\n				$CadenaInOpcion=\'\';\n				if (!$PCO_EsImagen)\n					{\n						if ($Ubicacion==\'arriba\')       $CadenaInOpcion=\'<button class=\"btn-circle btn-info btn-xs\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\'\"></i></button> \'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]);\n						if ($Ubicacion==\'centro\')       $CadenaInOpcion=\'<button type=\"button\" class=\"btn btn-default btn-outline\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i><span class=\"btn-xs\">\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\'</span></button>\';\n						if ($Ubicacion==\'formulario\')   $CadenaInOpcion=\'<ul type=\"button\" class=\"btn \'.$RegistroOpcion[\"clase_contenedor\"].\'\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-fw\"></i><span>\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\'</span></ul>\';\n						if ($Ubicacion==\'escritorio\')   $CadenaInOpcion=\'<button class=\"btn btn-default\"><i class=\"\'.$RegistroOpcion[\"imagen\"].\' fa-3x fa-fw\"></i><br><span class=\"btn-xs\">\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]).\'</span></button>\';\n						if ($Ubicacion==\'lateral\')      $CadenaInOpcion=\'<i class=\"\'.$RegistroOpcion[\"imagen\"].\'\"></i>\'.PCO_ReemplazarVariablesPHPEnCadena($RegistroOpcion[\"texto\"]);\n					}\n				else\n					$CadenaInOpcion= \'<img src=\"\'.$RegistroOpcion[\"imagen\"].\'\" border=\"0\" />\';\n\n				//Imprime opciones ubicadas en la barra superior de la aplicacion\n				if ($Ubicacion==\'arriba\')\n					{\n						echo \'<li role=\"presentation\">\';\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion;\n						echo \'</li>\';\n					}\n\n				//Imprime opciones ubicadas en ventanas o acordeones en el centro de la aplicacion\n				if ($Ubicacion==\'centro\')\n					{\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion.\'&nbsp;\';\n					}\n\n				//Imprime opciones ubicadas en ventanas o acordeones en el centro de la aplicacion\n				if ($Ubicacion==\'formulario\')\n					{\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion.\'&nbsp;\';\n					}\n\n				//Imprime opciones ubicadas en el escritorio de la aplicacion (iconos grandes sin categorizar)\n				if ($Ubicacion==\'escritorio\')\n					{\n						// Imprime la imagen\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion;\n					}\n\n				//Imprime opciones ubicadas en la barra lateral de navegacion (izquierda)\n				if ($Ubicacion==\'lateral\')\n					{\n						echo \'<li style=\"text-align: left; font-size:0.95em;\">\';\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion;\n						echo \'</li>\';\n					}\n\n				//Imprime opciones ubicadas en la barra superior, menu de usuario\n				if ($Ubicacion==\'usuario\')\n					{\n						echo \'<li>\';\n						echo $CadenaPreOpcion;\n						echo $CadenaInOpcion;\n						echo $CadenaPosOpcion;\n						echo \'</li>\';\n					}\n			}\n	}\n\n\n\n/*#################################################################################\n###################################################################################*/\nfunction PCO_CodificarCadena_UUEncode($Cadena)\n	{\n		// Sanity check\n		if (!is_scalar($Cadena)) {\n			user_error(\'convert_uuencode() expects parameter 1 to be\'\n				. \' string, \' . gettype($Cadena) . \' given\',\n				E_USER_WARNING);\n			return false;\n		}\n\n		$u = 0;\n		$encoded = \'\';\n\n		while ($c = count($bytes = unpack(\'c*\',\n			substr($Cadena, $u, 45)))) {\n			$u += 45;\n			$encoded .= pack(\'c\', $c + 0x20);\n\n			while ($c % 3) {\n				$bytes[++$c] = 0;\n			}\n\n			foreach (array_chunk($bytes, 3) as $b) {\n				$b0 = ($b[0] & 0xFC) >> 2;\n				$b1 = (($b[0] & 0x03) << 4) + (($b[1] & 0xF0) >> 4);\n				$b2 = (($b[1] & 0x0F) << 2) + (($b[2] & 0xC0) >> 6);\n				$b3 = $b[2] & 0x3F;\n\n				$b0 = $b0 ? $b0 + 0x20 : 0x60;\n				$b1 = $b1 ? $b1 + 0x20 : 0x60;\n				$b2 = $b2 ? $b2 + 0x20 : 0x60;\n				$b3 = $b3 ? $b3 + 0x20 : 0x60;\n\n				$encoded .= pack(\'c*\', $b0, $b1, $b2, $b3);\n			}\n\n			$encoded .= \"\\n\";\n		}\n\n		// Add termination characters\n		$encoded .= \"\\x60\\n\";\n		return $encoded;\n	}\n\n\n/*#################################################################################\n###################################################################################*/\nfunction PCO_DecodificarCadena_UUEncode($Cadena)\n	{\n		// Sanity check\n		if (!is_scalar($Cadena)) {\n			user_error(\'convert_uuencode() expects parameter 1 to be\'\n				. \' string, \' . gettype($Cadena) . \' given\',\n				E_USER_WARNING);\n			return false;\n		}\n\n		if (strlen($Cadena) < 8) {\n			user_error(\'convert_uuencode() The given parameter is not\'\n				. \' a valid uuencoded string\', E_USER_WARNING);\n			return false;\n		}\n\n		$decoded = \'\';\n		foreach (explode(\"\\n\", $Cadena) as $line) {\n\n			$c = count($bytes = unpack(\'c*\', substr(trim($line), 1)));\n\n			while ($c % 4) {\n				$bytes[++$c] = 0;\n			}\n\n			foreach (array_chunk($bytes, 4) as $b) {\n				$b0 = $b[0] == 0x60 ? 0 : $b[0] - 0x20;\n				$b1 = $b[1] == 0x60 ? 0 : $b[1] - 0x20;\n				$b2 = $b[2] == 0x60 ? 0 : $b[2] - 0x20;\n				$b3 = $b[3] == 0x60 ? 0 : $b[3] - 0x20;\n\n				$b0 <<= 2;\n				$b0 |= ($b1 >> 4) & 0x03;\n				$b1 <<= 4;\n				$b1 |= ($b2 >> 2) & 0x0F;\n				$b2 <<= 6;\n				$b2 |= $b3 & 0x3F;\n\n				$decoded .= pack(\'c*\', $b0, $b1, $b2);\n			}\n		}\n		return rtrim($decoded, \"\\0\");\n	}\n\n\n/*#################################################################################\n###################################################################################*/\nfunction PCO_CodificarCadena_Binario($input)\n	{\n		if (!is_string($input))\n			return false;\n		$input = unpack(\'H*\', $input);\n		$chunks = str_split($input[1], 2);\n		$ret = \'\';\n		foreach ($chunks as $chunk)\n			{\n				$temp = base_convert($chunk, 16, 2);\n				$ret .= str_repeat(\"0\", 8 - strlen($temp)) . $temp;\n			}\n\n		//RETORNO DE HEXADECIMAL TOMADO DEL BINARIO\n		{\n			//$ret = bin2hex ($ret);\n		}\n		//RETORNO DE DECIMAL TOMADO DEL BINARIO CON ADICION DE CEROS A LA IZQUIERDA\n		/*\n		{\n			//Busca primer uno\n			$PrimerUno=stripos ( $ret , \"1\");\n			$CadenaCeros=\"\";\n			for ($i=0;$i<$PrimerUno;$i++)\n				$CadenaCeros.=\"0\";\n			$ret = $CadenaCeros.\"_\".bindec($ret);   //Retorna por ejemplo  00_6552311\n		}\n		*/\n		return $ret;\n	}\n\n\n/*#################################################################################\n###################################################################################*/\nfunction PCO_DecodificarCadena_Binario($input)\n	{\n		//RETOMA UN HEXADECIMAL Y DEVUELVE EL BINARIO A PROCESAR\n		{\n			//$ret = hex2bin ($ret);\n		}\n		//RETOMA UN DECIMAL Y DEVUELVE EL BINARIO A PROCESAR AGREGANDO LOS CEROS EXTRA\n		/*\n		{\n			$PartesNumero=explode(\"_\",$input);\n			$input = $PartesNumero[0].decbin($PartesNumero[1]);   //Analiza por ejemplo una entrada como 00_6552311  para devolver su parte decimal en binaria antecedida por los ceros dados\n		}\n		*/\n\n		if (!is_string($input))\n			return false;\n		$chunks = str_split($input,8);\n		$ret = \'\';\n		foreach ($chunks as $chunk)\n		{\n			$temp = base_convert($chunk, 2, 16);\n			$ret .= pack(\'H*\',str_repeat(\"0\", 2 - strlen($temp)) . $temp);\n		}\n		return $ret;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: ImprimirMarcoPanelAdmin\n	Imprime un marco generico con informacion para el panel del administrador\n\n	Variables de entrada:\n\n		ClaseColumnas - Clases para la definicion del tamano del control en formato de columnas bootstrap.  Ej:  col-lg-3 col-md-6\n		EstiloPanel - Define el color del control bootstrap.  [primary | green | red | default | yellow | info | success | danger]\n		ClaseIconoFA - Clase con el icono en notacion FontAwesome para ser agregado al cuadro. Acepta modificadores FA.  Ej.  fa-table fa-4x fa-spin\n		Titulo - Texto a imprimir en formato grande sobre el cuadro.  Se recomienda una sola palabra.\n		SubTitulo - Texto corto explicativo del cuadro a ser impreso debajo del titulo en letra pequena.\n		EnlaceTexto - Texto a presentar al usuario para hacer clic sobre el.\n		EnlaceURL - URL para agregar al elemento Anchor.  Soporta los modificadores estandar de HTML.\n		ClaseTextoTitulo - Clase CSS para ser aplicada al texto del titulo\n\n	Salida:\n		Impresion del codigo HTML correspondiente\n*/\nfunction PCO_ImprimirPanelSimpleDashboard($ClaseColumnas,$EstiloPanel,$ClaseIconoFA,$Titulo,$SubTitulo,$EnlaceTexto,$EnlaceURL,$ClaseTextoTitulo=\"huge\")\n	{\n		$SalidaFuncion=\"\n			<div class=\'$ClaseColumnas\'>\n				<div class=\'panel panel-$EstiloPanel\'>\n					<div class=\'panel-heading\'>\n						<div class=\'row\'>\n							<div class=\'col-xs-3\'>\n								<i class=\'fa $ClaseIconoFA\'></i>\n							</div>\n							<div class=\'col-xs-9 text-right\'>\n								<div class=\'$ClaseTextoTitulo\'>\n									<b>$Titulo</b>\n								</div>\n								<div>$SubTitulo</div>\n							</div>\n						</div>\n					</div>\n					<a href=\'$EnlaceURL\'>\n						<div class=\'panel-footer\'>\n							<span class=\'pull-left\'>$EnlaceTexto</span>\n							<span class=\'pull-right\'><i class=\'fa fa-arrow-circle-right\'></i></span>\n							<div class=\'clearfix\'></div>\n						</div>\n					</a>\n				</div>\n			</div>\";\n		return $SalidaFuncion;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCOFUNC_EliminarInforme\n	Elimina un informe definido para la aplicacion incluyendo todos los objetos definidos en su interior\n\n	Variables de entrada:\n\n		informe - ID unico de identificacion del formulario a eliminar\n\n	(start code)\n		DELETE FROM \".$TablasCore.\"formulario WHERE id=\'$formulario\'\n		DELETE FROM \".$TablasCore.\"formulario_objeto WHERE formulario=\'$formulario\'\n		DELETE FROM \".$TablasCore.\"formulario_boton WHERE formulario=? \",\"$formulario\n	(end)\n\n	Salida:\n		Registro eliminado\n\n	Ver tambien:\n		<PCO_AdministrarFormularios>\n*/\nfunction PCOFUNC_EliminarInforme($informe=\"\")\n	{\n		global $TablasCore;\n		if ($informe!=\"\")\n			{\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"informe_campos WHERE informe=? \",\"$informe\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"informe_tablas WHERE informe=? \",\"$informe\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"informe_condiciones WHERE informe=? \",\"$informe\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"informe_boton WHERE informe=? \",\"$informe\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"usuario_informe WHERE informe=? \",\"$informe\");\n				PCO_Auditar(\"Elimina informe $informe\");\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EliminarFormulario\n	Elimina un formulario definido para la aplicacion incluyendo todos los objetos definidos en su interior\n\n	Variables de entrada:\n\n		formulario - ID unico de identificacion del formulario a eliminar\n\n	(start code)\n		DELETE FROM \".$TablasCore.\"formulario WHERE id=\'$formulario\'\n		DELETE FROM \".$TablasCore.\"formulario_objeto WHERE formulario=\'$formulario\'\n		DELETE FROM \".$TablasCore.\"formulario_boton WHERE formulario=? \",\"$formulario\n	(end)\n\n	Salida:\n		Registro eliminado\n\n	Ver tambien:\n		<PCO_AdministrarFormularios>\n*/\nfunction PCO_EliminarFormulario($formulario=\"\")\n	{\n		global $TablasCore;\n		if ($formulario!=\"\")\n			{\n				//Elimina los eventos relacionados con sus objetos\n				$EventosFormulario=PCO_EjecutarSQL(\"SELECT \".$TablasCore.\"evento_objeto.id FROM \".$TablasCore.\"evento_objeto,\".$TablasCore.\"formulario_objeto WHERE \".$TablasCore.\"formulario_objeto.formulario=$formulario AND \".$TablasCore.\"formulario_objeto.id=\".$TablasCore.\"evento_objeto.objeto \",\"\");\n				while($RegistroEventosFormulario=$EventosFormulario->fetch())\n					PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"evento_objeto WHERE id=? \",$RegistroEventosFormulario[\"id\"]);\n\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"formulario WHERE id=? \",\"$formulario\");\n\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? \",\"$formulario\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"formulario_boton WHERE formulario=? \",\"$formulario\");\n				PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"menu WHERE formulario_vinculado=? \",\"$formulario\");\n				PCO_Auditar(\"Elimina formulario $formulario\");\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImportarDefinicionesXML\n	Busca definiciones de elementos XML almacenadas sobre xml/ y ejecuta el proceso de importacion de cada uno automaticamente durante cada cargue de pagina por algun usuario disenador de aplicacion.\n\n	Salida:\n\n		Ejecucion automatica de los scripts residentes para la generacion de los elementos internos correspondientes\n*/\nfunction PCO_ImportarDefinicionesXML()\n	{\n		//Se desactiva el limite de tiempo para ejecucion del script\n		set_time_limit (0) ;\n		\n		$ArregloElementos = array();\n		//Obtiene lista de archivos en xml/ para ser ejecutados\n		$DirectorioXML = dir(\"xml/\");\n		while (false !== ($ArchivoXML = $DirectorioXML->read()))\n			if(strtolower(substr($ArchivoXML, -4))==\".xml\") //Considera solo los XML\n				$ArregloElementos[]=$ArchivoXML;\n		$DirectorioXML->close();\n\n		//Por cada archivo ejecuta el proceso de importacion correspondiente\n		foreach ($ArregloElementos as $ArchivoXML)\n			{\n				//Identifica el tipo de elemento contenido en el archivo para saber como procesarlo\n				$cadena_xml_importado = file_get_contents(\"xml/\".$ArchivoXML);\n				$xml_importado = @simplexml_load_string($cadena_xml_importado); // Usa SimpleXML Directamente para interpretar cadena\n				//Procesa el archivo segun su tipo\n				if ($xml_importado->descripcion[0]->tipo_objeto==\"Informe\")     $ResultadoImportacion=PCO_ImportarXMLInforme($cadena_xml_importado);\n				if ($xml_importado->descripcion[0]->tipo_objeto==\"Formulario\")  $ResultadoImportacion=PCO_ImportarXMLFormulario($cadena_xml_importado);\n				//Una vez procesado el archivo lo elimina\n				unlink(\"xml/\".$ArchivoXML);\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImportarScriptsPHP\n	Busca definiciones de scripts PHP almacenadas sobre xml/ (carpeta del sistema para importar elementos y ejecuta cada uno automaticamente durante cada cargue de pagina por algun usuario disenador de aplicacion.\n\n	Salida:\n\n		Ejecucion automatica de los scripts residentes y renombrado de los mismos para evitar su posterior ejecucion\n*/\nfunction PCO_ImportarScriptsPHP()\n	{\n		global $PCO_FechaOperacion,$PCO_HoraOperacion;\n		$ArregloElementos = array();\n		//Obtiene lista de archivos en xml/ para ser ejecutados\n		$DirectorioScripts = dir(\"xml/\");\n		while (false !== ($ArchivoPHP = $DirectorioScripts->read()))\n			if(strtolower(substr($ArchivoPHP, -4))==\".php\") //Considera solo los PHP\n				$ArregloElementos[]=$ArchivoPHP;\n		$DirectorioScripts->close();\n\n		//Por cada archivo ejecuta el proceso de ejecucion correspondiente\n		foreach ($ArregloElementos as $ArchivoPHP)\n			{\n				//Incluye el codigo\n				include_once(\"xml/\".$ArchivoPHP);\n				//Una vez procesado el archivo lo renombra para no ser ejecutado mas\n				rename(\"xml/\".$ArchivoPHP, \"xml/\".$ArchivoPHP.\".Run_\".$PCO_FechaOperacion.\"-\".$PCO_HoraOperacion);\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ExportarDefinicionesXML\n	Exporta masivamente a XML las definiciones de elementos de un tipo dado\n\n	Variables de entrada:\n\n		TipoElementos - Indica el tipo de elementos que deben ser exportados:  Inf o Frm\n		ListaElementos - Una lista de los elementos de ese tipo que deben ser exportados en un formato similar a la impresion  EJ: 1,2,5-6,8,12-30\n		tipo_copia_objeto - Indica si los objetos seran generados con ID estatico o dinamico: XML_IdEstatico | XML_IdDinamico\n\n	Salida:\n\n		Archivos generados para los elementos seleccionados\n\n	Ver tambien:\n		<PCO_ExportarXMLInforme> | <PCO_ImportarXMLInforme> | <PCO_ExportarXMLFormulario> | <PCO_ImportarXMLFormulario>\n*/\nfunction PCO_ExportarDefinicionesXML($TipoElementos,$ListaElementos,$tipo_copia_objeto)\n	{\n		global $ModoDesarrolladorPractico,$PCO_FechaOperacion,$PCO_HoraOperacion,$TablasCore;\n		$ArregloElementosExportacion=PCO_ParsearListasElementos($ListaElementos);\n		foreach ($ArregloElementosExportacion as $ElementoExportar)\n			{\n				//Valida que sea un elemento exportable (de usuario o interno pero en modo desarrollador)\n				if ($ElementoExportar>=$ModoDesarrolladorPractico)\n					{\n						//Establece el prefijo del path final del archivo exportado segun el valor de ID asi como si llevara fecha y hora o no\n						$PrefijoPath=\"tmp/\";\n						$InfijoPath=\"_\".$PCO_FechaOperacion.\"_\".$PCO_HoraOperacion;\n						if ($ElementoExportar<0)\n							{\n								$PrefijoPath=\"xml/\";\n								$InfijoPath=\"\"; //Elimina fecha y hora dejando siempre un nombre de archivo fijo\n							}\n						//Exporta elementos tipo informe\n						if ($TipoElementos==\"Inf\")\n							{\n								//Verifica primero que si exista el ID de informe asociado antes de proceder\n								$RegistroElemento=@PCO_EjecutarSQL(\"SELECT id FROM \".$TablasCore.\"informe WHERE id = \'$ElementoExportar\' \")->fetch();\n								if ($RegistroElemento[\"id\"]!=\"\")\n									{\n										$PCO_NombreArchivoXML=$PrefijoPath.\"RepID_\".$ElementoExportar.$InfijoPath.\".xml\";\n										PCO_ExportarXMLInforme($ElementoExportar,$tipo_copia_objeto,$PCO_NombreArchivoXML);\n									}\n							}\n						//Exporta elementos tipo formulario\n						if ($TipoElementos==\"Frm\")\n							{\n								//Verifica primero que si exista el ID de informe asociado antes de proceder\n								$RegistroElemento=@PCO_EjecutarSQL(\"SELECT id FROM \".$TablasCore.\"formulario WHERE id = \'$ElementoExportar\' \")->fetch();\n								if ($RegistroElemento[\"id\"]!=\"\")\n									{\n										$PCO_NombreArchivoXML=$PrefijoPath.\"FormID_\".$ElementoExportar.$InfijoPath.\".xml\";\n										PCO_ExportarXMLFormulario($ElementoExportar,$tipo_copia_objeto,$PCO_NombreArchivoXML);\n									}\n							}\n					}\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ParsearListasElementos\n	Toma una cadena con la lista de elementos separados por comas y rangos por guiones y los genera uno a uno sobre un arreglo que se retorna luego para realizar operaciones individuales sobre ellos.  Ignora rangos invertidos o donde no sean numericos.\n\n	Variables de entrada:\n\n		ListaElementos - Lista de elementos a parsear en formato similar al de impresion. EJ: 1,2,5-6,8,12-30\n\n	Salida:\n\n		Arreglo con todos los elementos parseados para ser procesado posteriormente por quien llame la funcion\n*/\nfunction PCO_ParsearListasElementos($ListaElementos)\n	{\n		$ArregloElementos = array();\n		$ArregloParcial=explode(\",\",$ListaElementos);\n		//Recorre toda la lista de elementos\n		foreach ($ArregloParcial as $Rango)\n			{\n				$Rango=trim($Rango);\n				//Por cada elemento analiza si se trata de un rango y lo genera, sino simplemente lo agrega\n				if (substr_count ( $Rango , \"-\" ) > 0)\n					{\n						$RangoValido=false;\n						//Separa nuevamente por el guion y hace el ciclo de inclusion.  Solo analiza los dos primeros valores y descarta posibles rangos como 3-8-10\n						$RangoCompuesto=explode(\"-\",$Rango);\n\n						//CASO 1: Analiza rangos normales con numeros enteros Ej. 4-8\n						if (!$RangoValido)\n							{\n								$InicioRango=trim($RangoCompuesto[0]);\n								$FinRango=trim($RangoCompuesto[1]);\n								//Evalua si la operacion obtuvo un rango valido\n								if (is_numeric($InicioRango) && is_numeric($FinRango)) $RangoValido=true;\n							}\n						//CASO 2: Analiza rangos donde el primero es negativo y el segundo positivo. Ej: -100-0 o -80-5\n						if (!$RangoValido)\n							{\n								$InicioRango=\"-\".trim($RangoCompuesto[1]);\n								$FinRango=trim($RangoCompuesto[2]);\n								//Evalua si la operacion obtuvo un rango valido\n								if (is_numeric($InicioRango) && is_numeric($FinRango)) $RangoValido=true;\n							}\n						//CASO 3: Analiza rangos donde el primero es negativo y el segundo tambien. Ej: -80--5\n						if (!$RangoValido)\n							{\n								$InicioRango=\"-\".trim($RangoCompuesto[1]);\n								$FinRango   =\"-\".trim($RangoCompuesto[3]);\n								//Evalua si la operacion obtuvo un rango valido\n								if (is_numeric($InicioRango) && is_numeric($FinRango)) $RangoValido=true;\n							}\n						//CASO 4: Analiza Elementos unicos que a pesar de comenzar con guion se trata de un unico elemento. Ej: -5\n						if (!$RangoValido)\n							{\n								$InicioRango=\"-\".trim($RangoCompuesto[1]);\n								//Evalua si la operacion obtuvo un rango valido\n								if (is_numeric($InicioRango))\n									{\n										$ArregloElementos[]=$Rango;\n										$RangoValido=false;\n									}\n							}\n						//Revisa que el rango si sea valido (ambos numericos) antes de seguir\n						if ($RangoValido)\n							{\n								//Revisa que el rango no sea inverso, sino lo ignora\n								if ($InicioRango<=$FinRango)\n									{\n										//Genera los elementos asociados al rango dentro del arreglo a retornar\n										for ($i=$InicioRango;$i<=$FinRango;$i++)\n											$ArregloElementos[]=$i;\n									}\n							}\n					}\n				else\n					{\n						//Revisa que el rango si sea un numero antero antes de seguir\n						if (is_numeric($Rango))\n							$ArregloElementos[]=$Rango;\n					}\n			}\n		return $ArregloElementos;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImportarXMLFormulario\n	Importa una cadena XML con la especificacion de un formulario al sistema\n\n	Variables de entrada:\n\n		xml_importado - Cadena en notacion XML con todos los componentes necesarios del formulario\n\n	Salida:\n\n		Objetos generados a partir de la definicion de la cadena\n*/\nfunction PCO_ImportarXMLFormulario($xml_importado)\n	{\n		global $ListaCamposSinID_menu,$ListaCamposSinID_evento_objeto,$_SeparadorCampos_,$TablasCore,$ListaCamposSinID_formulario,$ConexionPDO,$ListaCamposSinID_formulario_objeto,$ListaCamposSinID_formulario_boton;\n		$xml_importado = @simplexml_load_string($xml_importado); // Usa SimpleXML Directamente para interpretar cadena\n\n		//Si es tipo estatico elimina el formulario existente con el mismo ID\n		$ListaCamposParaID=\"\";\n		$InterroganteParaID=\"\";\n		$ValorInsercionParaID=\"\";\n		if ($xml_importado->descripcion[0]->tipo_exportacion==\"XML_IdEstatico\")\n			{\n				$ListaCamposParaID=\"id,\";\n				$InterroganteParaID=\"?,\";\n				$ValorInsercionParaID=base64_decode($xml_importado->core_formulario[0]->id).$_SeparadorCampos_;\n				PCO_EliminarFormulario(base64_decode($xml_importado->core_formulario[0]->id));\n			}\n\n		// Establece valores para cada campo a insertar en el nuevo form\n		/* ##########################################################################################################*/\n		/* ####### IMPORTANTE: Ajustes sobre esta funcion se deberian replicar en funcion de copia asociadas ########*/\n		/* ##########################################################################################################*/\n		$titulo=        base64_decode($xml_importado->core_formulario[0]->titulo);\n		$ayuda_titulo=  base64_decode($xml_importado->core_formulario[0]->ayuda_titulo);\n		$ayuda_texto=   base64_decode($xml_importado->core_formulario[0]->ayuda_texto);\n		$tabla_datos=   base64_decode($xml_importado->core_formulario[0]->tabla_datos);\n		$columnas=      base64_decode($xml_importado->core_formulario[0]->columnas);\n		$javascript=    base64_decode($xml_importado->core_formulario[0]->javascript);\n		$borde_visible= base64_decode($xml_importado->core_formulario[0]->borde_visible);\n		$estilo_pestanas=base64_decode($xml_importado->core_formulario[0]->estilo_pestanas);\n		$id_html=       base64_decode($xml_importado->core_formulario[0]->id_html);\n		$tipo_maquetacion=base64_decode($xml_importado->core_formulario[0]->tipo_maquetacion);\n		$css_columnas=  base64_decode($xml_importado->core_formulario[0]->css_columnas);\n		$estilo_ventana=base64_decode($xml_importado->core_formulario[0]->estilo_ventana);\n		$pre_script=    base64_decode($xml_importado->core_formulario[0]->pre_script);\n		$post_script=   base64_decode($xml_importado->core_formulario[0]->post_script);\n		$modulo=        base64_decode($xml_importado->core_formulario[0]->modulo);\n		// Inserta el nuevo objeto al form\n		PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario (\".$ListaCamposParaID.$ListaCamposSinID_formulario.\") VALUES (\".$InterroganteParaID.\"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \",\"$ValorInsercionParaID$titulo$_SeparadorCampos_$ayuda_titulo$_SeparadorCampos_$ayuda_texto$_SeparadorCampos_$tabla_datos$_SeparadorCampos_$columnas$_SeparadorCampos_$javascript$_SeparadorCampos_$borde_visible$_SeparadorCampos_$estilo_pestanas$_SeparadorCampos_$id_html$_SeparadorCampos_$tipo_maquetacion$_SeparadorCampos_$css_columnas$_SeparadorCampos_$estilo_ventana$_SeparadorCampos_$pre_script$_SeparadorCampos_$post_script$_SeparadorCampos_$modulo\");\n\n		//Determina el ID del registro\n		if ($xml_importado->descripcion[0]->tipo_exportacion==\"XML_IdEstatico\")\n			$idObjetoInsertado=base64_decode($xml_importado->core_formulario[0]->id);\n		else\n			$idObjetoInsertado=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n\n		// Busca los elementos que componen el formulario para hacerles la copia\n		//Determina cuantos campos tiene la tabla\n		$ArregloCampos=explode(\',\',$ListaCamposSinID_formulario_objeto);\n		$TotalCampos=count($ArregloCampos);\n		// Registros de formulario_objeto\n		for ($PCO_i=0;$PCO_i<$xml_importado->total_core_formulario_objeto[0]->cantidad_objetos;$PCO_i++)\n			{\n				//Genera cadena de interrogantes y valores segun cantidad de campos\n				$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n				$CadenaValores=base64_decode($xml_importado->core_formulario_objeto[$PCO_i]->tipo);\n\n				for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n					{\n						//Cadena de interrogantes\n						$CadenaInterrogantes.=\',?\';\n						//Cadena de valores (el campo No 5 corresponde al ID de formulario nuevo)\n						if ($PCOCampo!=5)\n							$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_formulario_objeto[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n						else\n							$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n					}\n				//Inserta el nuevo objeto al form\n				PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario_objeto ($ListaCamposSinID_formulario_objeto) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n\n				//Determina cual fue el ID para el ultimo elemento insertado\n				$idObjetoInsertadoParaEvento=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n				//Averigua el ID ORIGINAL del objeto recien insertado\n				$IDOriginalObjeto=base64_decode($xml_importado->core_formulario_objeto[$PCO_i]->id);\n				//Recorre la lista de todos los eventos en el XML\n				for ($PCO_iEvento=0;$PCO_iEvento<$xml_importado->total_core_evento_objeto[0]->cantidad_objetos;$PCO_iEvento++)\n					{\n						$RegistroEvento_id=base64_decode($xml_importado->core_evento_objeto[$PCO_iEvento]->id);\n						$RegistroEvento_objeto=base64_decode($xml_importado->core_evento_objeto[$PCO_iEvento]->objeto);\n						$RegistroEvento_evento=base64_decode($xml_importado->core_evento_objeto[$PCO_iEvento]->evento);\n						$RegistroEvento_javascript=base64_decode($xml_importado->core_evento_objeto[$PCO_iEvento]->javascript);\n						//Si el objeto del evento original es igual al id original del evento recien insertado crea el nuevo registro de evento\n						if ($RegistroEvento_objeto==$IDOriginalObjeto)\n							{\n								$CadenaValoresEventos=\"{$idObjetoInsertadoParaEvento}{$_SeparadorCampos_}{$RegistroEvento_evento}{$_SeparadorCampos_}{$RegistroEvento_javascript}\";\n								PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"evento_objeto ($ListaCamposSinID_evento_objeto) VALUES (?,?,?) \",\"$CadenaValoresEventos\");\n							}\n					}\n			}\n\n		//Determina cuantos campos tiene la tabla\n		$ArregloCampos=explode(\',\',$ListaCamposSinID_formulario_boton);\n		$TotalCampos=count($ArregloCampos);\n		// Registros de formulario_boton\n		for ($PCO_i=0;$PCO_i<$xml_importado->total_core_formulario_boton[0]->cantidad_objetos;$PCO_i++)\n			{\n				//Genera cadena de interrogantes y valores segun cantidad de campos\n				$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n				$CadenaValores=base64_decode($xml_importado->core_formulario_boton[$PCO_i]->titulo);\n\n				for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n					{\n						//Cadena de interrogantes\n						$CadenaInterrogantes.=\',?\';\n						//Cadena de valores (el campo No 2 corresponde al ID de formulario nuevo)\n						if ($PCOCampo!=2)\n							$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_formulario_boton[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n						else\n							$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n					}\n				//Inserta el nuevo objeto al form\n				PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario_boton ($ListaCamposSinID_formulario_boton) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n			}\n\n		//Determina cuantos campos tiene la tabla\n		$ArregloCampos=explode(\',\',$ListaCamposSinID_menu);\n		$TotalCampos=count($ArregloCampos);\n		// Registros de formulario_boton\n		for ($PCO_i=0;$PCO_i<$xml_importado->total_core_menu[0]->cantidad_objetos;$PCO_i++)\n			{\n				//Genera cadena de interrogantes y valores segun cantidad de campos\n				$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n				$CadenaValores=base64_decode($xml_importado->core_menu[$PCO_i]->texto);\n\n				for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n					{\n						//Cadena de interrogantes\n						$CadenaInterrogantes.=\',?\';\n						//Cadena de valores (el campo No 2 corresponde al ID de formulario nuevo)\n						if ($PCOCampo!=16)\n							$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_menu[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n						else\n							$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n					}\n				//Inserta el nuevo objeto al form\n				PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"menu ($ListaCamposSinID_menu) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n			}\n\n		return $idObjetoInsertado;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ExportarXMLFormulario\n	Exporta las especificaciones de un formulario a una cadena XML valida dentro de un archivo especificado\n\n	Variables de entrada:\n\n		formulario - Identificador unico del formulario que se desea exportar\n		tipo_copia_objeto - Indica el tipo de copia que se hara del formulario: EnLinea|XML_IdEstatico|XML_IdDinamico\n\n	Salida:\n\n		Archivo con el elemento exportado\n\n	Ver tambien:\n		<PCO_AdministrarFormularios>\n*/\nfunction PCO_ExportarXMLFormulario($formulario,$tipo_copia_objeto,$PCO_NombreArchivoXML=\"\")\n	{\n		global $ArchivoCORE,$ListaCamposSinID_evento_objeto,$_SeparadorCampos_,$TablasCore,$ListaCamposSinID_menu,$ListaCamposSinID_formulario,$ConexionPDO,$ListaCamposSinID_formulario_objeto,$ListaCamposSinID_formulario_boton;\n		global $MULTILANG_ErrorDatos,$MULTILANG_ErrorTiempoEjecucion,$MULTILANG_FrmMsjCopia,$MULTILANG_FrmTipoCopiaExporta,$MULTILANG_FrmCopiaFinalizada,$MULTILANG_IrEscritorio,$MULTILANG_Descargar;\n		global $PCO_VersionActual,$Nombre_Aplicacion,$Version_Aplicacion,$PCOSESS_LoginUsuario,$PCO_FechaOperacionGuiones,$PCO_HoraOperacionPuntos,$PCO_FechaOperacion,$PCO_HoraOperacion;\n		global $MULTILANG_Editar,$MULTILANG_Objeto;\n\n		$mensaje_error=\"\";\n		if ($formulario==\"\")        $mensaje_error=$MULTILANG_ErrorTiempoEjecucion.\".  No ingreso ID de Formulario / Form ID not entered\";\n		if ($tipo_copia_objeto==\"\") $mensaje_error=$MULTILANG_ErrorTiempoEjecucion.\".  No indicado modo de copia / Copy mode not entered\";\n\n		$Contenido_XML=\"\";\n\n		if ($mensaje_error==\"\")\n			{\n				//Hace la copia del objeto segun el tipo solicitado\n				if ($tipo_copia_objeto==\"EnLinea\")\n					{\n						// Busca datos y Crea copia del formulario\n						$consulta=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario.\" FROM \".$TablasCore.\"formulario WHERE id=?\",\"$formulario\");\n						$registro = $consulta->fetch();\n						// Establece valores para cada campo a insertar en el nuevo form\n						/* ##########################################################################################################*/\n						/* ####### IMPORTANTE:  Ajustes sobre esta funcionde copia se deberian replicar en importaciones XML ########*/\n						/* ##########################################################################################################*/\n						$titulo=\'[COPIA] \'.$registro[\"titulo\"];\n						$ayuda_titulo=$registro[\"ayuda_titulo\"];\n						$ayuda_texto=$registro[\"ayuda_texto\"];\n						$tabla_datos=$registro[\"tabla_datos\"];\n						$columnas=$registro[\"columnas\"];\n						$javascript=$registro[\"javascript\"];\n						$borde_visible=$registro[\"borde_visible\"];\n						$estilo_pestanas=$registro[\"estilo_pestanas\"];\n						$id_html=$registro[\"id_html\"];\n						$tipo_maquetacion=$registro[\"tipo_maquetacion\"];\n						$css_columnas=$registro[\"css_columnas\"];\n						$estilo_ventana=$registro[\"estilo_ventana\"];\n						$pre_script=$registro[\"pre_script\"];\n						$post_script=$registro[\"post_script\"];\n						$modulo=$registro[\"modulo\"];\n						// Inserta el nuevo objeto al form\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario (\".$ListaCamposSinID_formulario.\") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \",\"$titulo$_SeparadorCampos_$ayuda_titulo$_SeparadorCampos_$ayuda_texto$_SeparadorCampos_$tabla_datos$_SeparadorCampos_$columnas$_SeparadorCampos_$javascript$_SeparadorCampos_$borde_visible$_SeparadorCampos_$estilo_pestanas$_SeparadorCampos_$id_html$_SeparadorCampos_$tipo_maquetacion$_SeparadorCampos_$css_columnas$_SeparadorCampos_$estilo_ventana$_SeparadorCampos_$pre_script$_SeparadorCampos_$post_script$_SeparadorCampos_$modulo\");\n						$idObjetoInsertado=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n\n						// Busca los elementos que componen el formulario para hacerles la copia\n						//Determina cuantos campos tiene la tabla\n						$ArregloCampos=explode(\',\',$ListaCamposSinID_formulario_objeto);\n						$TotalCampos=count($ArregloCampos);\n						// Registros de formulario_objeto\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? ORDER by peso,id\",\"$formulario\");\n						while($registro = $consulta->fetch())\n							{\n								//Genera cadena de interrogantes y valores segun cantidad de campos\n								$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n								$CadenaValores=$registro[1];\n								for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n									{\n										//Cadena de interrogantes\n										$CadenaInterrogantes.=\',?\';\n										//Cadena de valores (el campo No 5 corresponde al ID de formulario nuevo)\n										if ($PCOCampo!=5)\n											$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n										else\n											$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n									}\n								//Inserta el nuevo objeto al form\n								PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario_objeto ($ListaCamposSinID_formulario_objeto) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n\n								//Por cada elemento busca si tiene eventos y los copia tambien\n								$idObjetoInsertadoParaEvento=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n								$ArregloCamposEvento=explode(\',\',$ListaCamposSinID_evento_objeto);\n								$TotalCamposEvento=count($ArregloCamposEvento);\n								$consulta_eventos=PCO_EjecutarSQL(\"SELECT \".$TablasCore.\"evento_objeto.* FROM \".$TablasCore.\"evento_objeto WHERE \".$TablasCore.\"evento_objeto.objeto=? \",$registro[\"id\"]);\n								while($registro_eventos = $consulta_eventos->fetch())\n									{\n										//Genera cadena de interrogantes y valores segun cantidad de campos\n										$CadenaInterrogantesEventos=\'?\'; //Agrega el primer interrogante\n										$CadenaValoresEventos=$idObjetoInsertadoParaEvento;\n										for ($PCOCampoEvento=1;$PCOCampoEvento<$TotalCamposEvento;$PCOCampoEvento++)\n											{\n												//Cadena de interrogantes\n												$CadenaInterrogantesEventos.=\',?\';\n												//Cadena de valores (el campo No 1 corresponde al ID de objeto nuevo)\n												$CadenaValoresEventos.=$_SeparadorCampos_.$registro_eventos[$PCOCampoEvento+1];\n											}\n										//Inserta el nuevo objeto al form\n										PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"evento_objeto ($ListaCamposSinID_evento_objeto) VALUES ($CadenaInterrogantesEventos) \",\"$CadenaValoresEventos\");\n									}\n							}\n\n						//Determina cuantos campos tiene la tabla\n						$ArregloCampos=explode(\',\',$ListaCamposSinID_formulario_boton);\n						$TotalCampos=count($ArregloCampos);\n						// Registros de formulario_boton\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario_boton WHERE formulario=? ORDER BY peso,id\",\"$formulario\");\n						while($registro = $consulta->fetch())\n							{\n								//Genera cadena de interrogantes y valores segun cantidad de campos\n								$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n								$CadenaValores=$registro[1];\n								for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n									{\n										//Cadena de interrogantes\n										$CadenaInterrogantes.=\',?\';\n										//Cadena de valores (el campo No 2 corresponde al ID de formulario nuevo)\n										if ($PCOCampo!=2)\n											$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n										else\n											$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n									}\n								//Inserta el nuevo objeto al form\n								PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"formulario_boton ($ListaCamposSinID_formulario_boton) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n							}\n\n\n						//Determina cuantos campos tiene la tabla\n						$ArregloCampos=explode(\',\',$ListaCamposSinID_menu);\n						$TotalCampos=count($ArregloCampos);\n						// Registros de formulario_boton\n						//$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"menu WHERE formulario_vinculado=? AND padre=0 ORDER BY peso,id\",\"$formulario\");\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"menu WHERE formulario_vinculado=? ORDER BY peso,id\",\"$formulario\");\n						while($registro = $consulta->fetch())\n							{\n								//Genera cadena de interrogantes y valores segun cantidad de campos\n								$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n								$CadenaValores=$registro[1];\n								for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n									{\n										//Cadena de interrogantes\n										$CadenaInterrogantes.=\',?\';\n										//Cadena de valores (el campo No 16 corresponde al ID de formulario nuevo)\n										if ($PCOCampo!=16)\n											$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n										else\n											$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n									}\n								//Inserta los menues correspondientes al form\n								PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"menu ($ListaCamposSinID_menu) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n							}\n\n\n						PCO_Auditar(\"Crea copia $tipo_copia_objeto de formulario $formulario\");\n\n						//Presenta la ventana con informacion y enlace de descarga\n						?>\n							<form action=\"<?php echo $ArchivoCORE; ?>\" method=\"POST\" name=\"det<?php echo $idObjetoInsertado; ?>\" id=\"det<?php echo $idObjetoInsertado; ?>\">\n								<input type=\"hidden\" name=\"PCO_Accion\" value=\"PCO_EditarFormulario\">\n								<input type=\"Hidden\" name=\"popup_activo\" value=\"\">\n								<input type=\"hidden\" name=\"formulario\" value=\"<?php echo $idObjetoInsertado; ?>\">\n								<input type=\"hidden\" name=\"nombre_tabla\" value=\"<?php echo $tabla_datos; ?>\">\n								<a class=\"btn btn-success btn-block\" href=\"javascript:document.det<?php echo $idObjetoInsertado; ?>.submit();\"><i class=\"fa fa-pencil\"></i> <?php echo $MULTILANG_Editar.\" <b>\".$titulo.\"</b>\"; ?></a>\n							</form>\n						<?php\n					}\n\n				//Hace la copia del objeto segun el tipo solicitado\n				if ($tipo_copia_objeto==\"XML_IdEstatico\" || $tipo_copia_objeto==\"XML_IdDinamico\")\n					{\n						// Inicia el archivo XML\n						$Contenido_XML.=\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?>\n<objetos_practicos>\n	<descripcion>\n		<tipo_objeto>Formulario</tipo_objeto>\n		<version_practico>$PCO_VersionActual</version_practico>\n		<tipo_exportacion>$tipo_copia_objeto</tipo_exportacion>\n		<sistema_origen>$Nombre_Aplicacion</sistema_origen>\n		<version>$Version_Aplicacion</version>\n		<usuario_generador>$PCOSESS_LoginUsuario</usuario_generador>\n		<fecha_exportacion>$PCO_FechaOperacionGuiones</fecha_exportacion>\n		<hora_exportacion>$PCO_HoraOperacionPuntos</hora_exportacion>\n	</descripcion>\";\n						// Exporta tabla core_formulario\n						$Contenido_XML .= \"\n	<core_formulario>\";\n						// Busca datos y genera XML de cada registro\n						$consulta=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario.\" FROM \".$TablasCore.\"formulario WHERE id=?\",\"$formulario\");\n						$registro = $consulta->fetch();\n						$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_formulario);\n						$Contenido_XML .= \"\n	</core_formulario>\";\n						// Registros de formulario_objeto\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? ORDER BY peso,id\",\"$formulario\");\n						$conteo_elementos_xml=0;\n						while($registro = $consulta->fetch())\n							{\n								//Exporta la tabla de core_formulario_objeto\n								$Contenido_XML .= \"\n	<core_formulario_objeto>\";\n								$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_formulario_objeto);\n							    $Contenido_XML .= \"\n	</core_formulario_objeto>\";\n								$conteo_elementos_xml++;\n							}\n							//Agrega el total de elementos y resetea contador para el siguiente\n							$Contenido_XML .= \"\n	<total_core_formulario_objeto><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_formulario_objeto>\";\n						$conteo_elementos_xml=0;\n\n						// Registros de eventos por formulario_objeto\n						$consulta=PCO_EjecutarSQL(\"SELECT \".$TablasCore.\"evento_objeto.* FROM \".$TablasCore.\"evento_objeto,\".$TablasCore.\"formulario_objeto WHERE \".$TablasCore.\"formulario_objeto.id=\".$TablasCore.\"evento_objeto.objeto  AND \".$TablasCore.\"formulario_objeto.formulario=?\",\"$formulario\");\n						$conteo_elementos_xml=0;\n						while($registro = $consulta->fetch())\n							{\n								//Exporta la tabla de core_formulario_objeto\n								$Contenido_XML .= \"\n	<core_evento_objeto>\";\n								$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_evento_objeto);\n							    $Contenido_XML .= \"\n	</core_evento_objeto>\";\n								$conteo_elementos_xml++;\n							}\n							//Agrega el total de elementos y resetea contador para el siguiente\n						$Contenido_XML .= \"\n	<total_core_evento_objeto><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_evento_objeto>\";\n						$conteo_elementos_xml=0;\n\n						// Registros de formulario_boton\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario_boton WHERE formulario=? ORDER BY peso,id\",\"$formulario\");\n						while($registro = $consulta->fetch())\n							{\n								//Exporta la tabla de core_formulario_objeto\n								$Contenido_XML .= \"\n	<core_formulario_boton>\";\n								$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_formulario_boton);\n							    $Contenido_XML .= \"\n	</core_formulario_boton>\";\n								$conteo_elementos_xml++;\n							}\n							//Agrega el total de elementos y resetea contador para el siguiente\n						$Contenido_XML .= \"\n	<total_core_formulario_boton><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_formulario_boton>\";\n						$conteo_elementos_xml=0;\n\n						// Registros de menu\n						$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"menu WHERE formulario_vinculado=? ORDER BY peso,id\",\"$formulario\");\n						while($registro = $consulta->fetch())\n							{\n								//Exporta la tabla de core_menu\n								$Contenido_XML .= \"\n	<core_menu>\";\n								$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_menu);\n							    $Contenido_XML .= \"\n	</core_menu>\";\n								$conteo_elementos_xml++;\n							}\n						//Agrega el total de elementos y resetea contador para el siguiente\n						$Contenido_XML .= \"\n	<total_core_menu><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_menu>\";\n						$conteo_elementos_xml=0;\n\n						// Finaliza el archivo XML\n						$Contenido_XML .= \"\n</objetos_practicos>\";\n\n						PCO_Auditar(\"Crea copia $tipo_copia_objeto de formulario $formulario\");\n\n						//Guarda la cadena generada en el archivo XML\n						if ($PCO_NombreArchivoXML==\"\")\n							$PCO_NombreArchivoXML=\"tmp/FormID_\".$formulario.\"_\".$PCO_FechaOperacion.\"_\".$PCO_HoraOperacion.\".xml\";\n						$PCO_PunteroArchivo = fopen($PCO_NombreArchivoXML, \"w\");\n						if($PCO_PunteroArchivo==false)\n							die(\"No se puede abrir el archivo de exportacion\");\n						fputs ($PCO_PunteroArchivo, $Contenido_XML);\n						fclose ($PCO_PunteroArchivo);\n\n						//Presenta la ventana con informacion y enlace de descarga\n						?>\n							<a class=\"btn btn-success btn-block\" href=\"<?php echo $PCO_NombreArchivoXML; ?>\" target=\"_BLANK\" download><i class=\"fa fa-floppy-o\"></i> <?php echo $MULTILANG_Descargar.\" \".$PCO_NombreArchivoXML; ?></a>\n						<?php\n					}\n				}\n			else\n				{\n					echo \'<form name=\"cancelar\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\">\n						<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_AdministrarFormularios\">\n						<input type=\"Hidden\" name=\"PCO_ErrorTitulo\" value=\"\'.$MULTILANG_ErrorDatos.\'\">\n						<input type=\"Hidden\" name=\"PCO_ErrorDescripcion\" value=\"\'.$mensaje_error.\'\">\n						</form>\n						<script type=\"\" language=\"JavaScript\"> document.cancelar.submit();  </script>\';\n				}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImportarXMLInforme\n	Importa una cadena XML con la especificacion de un informe al sistema\n\n	Variables de entrada:\n\n		xml_importado - Cadena en notacion XML con todos los componentes necesarios del informe Formato: SimpleXMLElement\n\n	Salida:\n\n		Objetos generados a partir de la definicion de la cadena\n*/\nfunction PCO_ImportarXMLInforme($xml_importado)\n	{\n		global $_SeparadorCampos_,$TablasCore,$ListaCamposSinID_informe,$ConexionPDO,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_boton;\n		$xml_importado = @simplexml_load_string($xml_importado); // Usa SimpleXML Directamente para interpretar cadena\n				//Si es tipo estatico elimina el informe existente con el mismo ID\n				$ListaCamposParaID=\"\";\n				$InterroganteParaID=\"\";\n				$ValorInsercionParaID=\"\";\n				if ($xml_importado->descripcion[0]->tipo_exportacion==\"XML_IdEstatico\")\n					{\n						$ListaCamposParaID=\"id,\";\n						$InterroganteParaID=\"?,\";\n						$ValorInsercionParaID=base64_decode($xml_importado->core_informe[0]->id).$_SeparadorCampos_;\n						PCOFUNC_EliminarInforme(base64_decode($xml_importado->core_informe[0]->id));\n					}\n\n				// Establece valores para cada campo a insertar en el nuevo informe\n				/* ##########################################################################################################*/\n				/* ####### IMPORTANTE: Ajustes sobre esta funcion se deberian replicar en funcion de copia asociadas ########*/\n				/* ##########################################################################################################*/\n				$titulo=base64_decode($xml_importado->core_informe[0]->titulo);\n				$descripcion=base64_decode($xml_importado->core_informe[0]->descripcion);\n				$categoria=base64_decode($xml_importado->core_informe[0]->categoria);\n				$agrupamiento=base64_decode($xml_importado->core_informe[0]->agrupamiento);\n				$ordenamiento=base64_decode($xml_importado->core_informe[0]->ordenamiento);\n				$ancho=base64_decode($xml_importado->core_informe[0]->ancho);\n				$alto=base64_decode($xml_importado->core_informe[0]->alto);\n				$formato_final=base64_decode($xml_importado->core_informe[0]->formato_final);\n				$formato_grafico=base64_decode($xml_importado->core_informe[0]->formato_grafico);\n				$genera_pdf=base64_decode($xml_importado->core_informe[0]->genera_pdf);\n				$variables_filtro=base64_decode($xml_importado->core_informe[0]->variables_filtro);\n				$soporte_datatable=base64_decode($xml_importado->core_informe[0]->soporte_datatable);\n				$formulario_filtrado=base64_decode($xml_importado->core_informe[0]->formulario_filtrado);\n				$tamano_paginacion=base64_decode($xml_importado->core_informe[0]->tamano_paginacion);\n				$subtotales_columna=base64_decode($xml_importado->core_informe[0]->subtotales_columna);\n				$subtotales_formato=base64_decode($xml_importado->core_informe[0]->subtotales_formato);\n				$conexion_origen_datos=base64_decode($xml_importado->core_informe[0]->conexion_origen_datos);\n				$consulta_sql=base64_decode($xml_importado->core_informe[0]->consulta_sql);\n				$tooltip_titulo=base64_decode($xml_importado->core_informe[0]->tooltip_titulo);\n				$exportar_dtclp=base64_decode($xml_importado->core_informe[0]->exportar_dtclp);\n				$exportar_dtcsv=base64_decode($xml_importado->core_informe[0]->exportar_dtcsv);\n				$exportar_dtxls=base64_decode($xml_importado->core_informe[0]->exportar_dtxls);\n				$exportar_dtpdf=base64_decode($xml_importado->core_informe[0]->exportar_dtpdf);\n				$ocultar_encabezado=base64_decode($xml_importado->core_informe[0]->ocultar_encabezado);\n				$ocultar_piepagina=base64_decode($xml_importado->core_informe[0]->ocultar_piepagina);\n				$anular_acciones=base64_decode($xml_importado->core_informe[0]->anular_acciones);\n				$encabezado_html=base64_decode($xml_importado->core_informe[0]->encabezado_html);\n				$tabla_responsive=base64_decode($xml_importado->core_informe[0]->tabla_responsive);\n				$permitido_home=base64_decode($xml_importado->core_informe[0]->permitido_home);\n				$javascript=base64_decode($xml_importado->core_informe[0]->javascript);\n				$pre_script=base64_decode($xml_importado->core_informe[0]->pre_script);\n				$post_script=base64_decode($xml_importado->core_informe[0]->post_script);\n				$usar_ajax=base64_decode($xml_importado->core_informe[0]->usar_ajax);\n				$definir_cols=base64_decode($xml_importado->core_informe[0]->definir_cols);\n				$pane_activado=base64_decode($xml_importado->core_informe[0]->pane_activado);\n				$pane_cascada=base64_decode($xml_importado->core_informe[0]->pane_cascada);\n				$pane_colapsado=base64_decode($xml_importado->core_informe[0]->pane_colapsado);\n				$pane_columnas=base64_decode($xml_importado->core_informe[0]->pane_columnas);\n				$pane_subtotalesrelativos=base64_decode($xml_importado->core_informe[0]->pane_subtotalesrelativos);\n				$pane_conteos=base64_decode($xml_importado->core_informe[0]->pane_conteos);\n				$pane_controles=base64_decode($xml_importado->core_informe[0]->pane_controles);\n				$pane_control_colapsar=base64_decode($xml_importado->core_informe[0]->pane_control_colapsar);\n				$pane_control_ordenar=base64_decode($xml_importado->core_informe[0]->pane_control_ordenar);\n				$modulo=base64_decode($xml_importado->core_informe[0]->modulo);\n\n				// Inserta el nuevo informe\n				PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe (\".$ListaCamposParaID.$ListaCamposSinID_informe.\") VALUES (\".$InterroganteParaID.\"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \",\"$ValorInsercionParaID$titulo$_SeparadorCampos_$descripcion$_SeparadorCampos_$categoria$_SeparadorCampos_$agrupamiento$_SeparadorCampos_$ordenamiento$_SeparadorCampos_$ancho$_SeparadorCampos_$alto$_SeparadorCampos_$formato_final$_SeparadorCampos_$formato_grafico$_SeparadorCampos_$genera_pdf$_SeparadorCampos_$variables_filtro$_SeparadorCampos_$soporte_datatable$_SeparadorCampos_$formulario_filtrado$_SeparadorCampos_$tamano_paginacion$_SeparadorCampos_$subtotales_columna$_SeparadorCampos_$subtotales_formato$_SeparadorCampos_$conexion_origen_datos$_SeparadorCampos_$consulta_sql$_SeparadorCampos_$tooltip_titulo$_SeparadorCampos_$exportar_dtclp$_SeparadorCampos_$exportar_dtcsv$_SeparadorCampos_$exportar_dtxls$_SeparadorCampos_$exportar_dtpdf$_SeparadorCampos_$ocultar_encabezado$_SeparadorCampos_$ocultar_piepagina$_SeparadorCampos_$anular_acciones$_SeparadorCampos_$encabezado_html$_SeparadorCampos_$tabla_responsive$_SeparadorCampos_$permitido_home$_SeparadorCampos_$javascript$_SeparadorCampos_$pre_script$_SeparadorCampos_$post_script$_SeparadorCampos_$usar_ajax$_SeparadorCampos_$definir_cols$_SeparadorCampos_$pane_activado$_SeparadorCampos_$pane_cascada$_SeparadorCampos_$pane_colapsado$_SeparadorCampos_$pane_columnas$_SeparadorCampos_$pane_subtotalesrelativos$_SeparadorCampos_$pane_conteos$_SeparadorCampos_$pane_controles$_SeparadorCampos_$pane_control_colapsar$_SeparadorCampos_$pane_control_ordenar$_SeparadorCampos_$modulo\");\n\n				//Determina el ID del registro\n				if ($xml_importado->descripcion[0]->tipo_exportacion==\"XML_IdEstatico\")\n					$idObjetoInsertado=base64_decode($xml_importado->core_informe[0]->id);\n				else\n					$idObjetoInsertado=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n\n				// Busca los elementos que componen el informe para hacerles la copia\n				//Determina cuantos campos tiene la tabla\n				$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_condiciones);\n				$TotalCampos=count($ArregloCampos);\n				// Registros de informe_condiciones\n				for ($PCO_i=0;$PCO_i<$xml_importado->total_core_informe_condiciones[0]->cantidad_objetos;$PCO_i++)\n					{\n						//Genera cadena de interrogantes y valores segun cantidad de campos\n						$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n						$CadenaValores=$idObjetoInsertado;\n\n						for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n							{\n								//Cadena de interrogantes\n								$CadenaInterrogantes.=\',?\';\n								//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n								if ($PCOCampo!=0)\n									$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_informe_condiciones[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n								else\n									$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n							}\n						//Inserta el nuevo objeto al informe\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_condiciones ($ListaCamposSinID_informe_condiciones) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n					}\n\n				//Determina cuantos campos tiene la tabla\n				$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_tablas);\n				$TotalCampos=count($ArregloCampos);\n				// Registros de informe_tablas\n				for ($PCO_i=0;$PCO_i<$xml_importado->total_core_informe_tablas[0]->cantidad_objetos;$PCO_i++)\n					{\n						//Genera cadena de interrogantes y valores segun cantidad de campos\n						$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n						$CadenaValores=$idObjetoInsertado;\n\n						for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n							{\n								//Cadena de interrogantes\n								$CadenaInterrogantes.=\',?\';\n								//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n								if ($PCOCampo!=0)\n									$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_informe_tablas[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n								else\n									$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n							}\n						//Inserta el nuevo objeto al informe\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_tablas ($ListaCamposSinID_informe_tablas) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n					}\n\n				//Determina cuantos campos tiene la tabla\n				$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_campos);\n				$TotalCampos=count($ArregloCampos);\n				// Registros de informe_campos\n				for ($PCO_i=0;$PCO_i<$xml_importado->total_core_informe_campos[0]->cantidad_objetos;$PCO_i++)\n					{\n						//Genera cadena de interrogantes y valores segun cantidad de campos\n						$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n						$CadenaValores=$idObjetoInsertado;\n\n						for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n							{\n								//Cadena de interrogantes\n								$CadenaInterrogantes.=\',?\';\n								//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n								if ($PCOCampo!=0)\n									$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_informe_campos[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n								else\n									$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n							}\n						//Inserta el nuevo objeto al informe\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_campos ($ListaCamposSinID_informe_campos) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n					}\n\n				//Determina cuantos campos tiene la tabla\n				$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_boton);\n				$TotalCampos=count($ArregloCampos);\n				// Registros de informe_boton\n				for ($PCO_i=0;$PCO_i<$xml_importado->total_core_informe_boton[0]->cantidad_objetos;$PCO_i++)\n					{\n						//Genera cadena de interrogantes y valores segun cantidad de campos\n						$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n						$CadenaValores=base64_decode($xml_importado->core_informe_boton[$PCO_i]->titulo);\n\n						for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n							{\n								//Cadena de interrogantes\n								$CadenaInterrogantes.=\',?\';\n								//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n								if ($PCOCampo!=2)\n									$CadenaValores.=$_SeparadorCampos_.base64_decode($xml_importado->core_informe_boton[$PCO_i]->{$ArregloCampos[$PCOCampo]});\n								else\n									$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n							}\n						//Inserta el nuevo objeto al informe\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_boton ($ListaCamposSinID_informe_boton) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n					}\n		return $idObjetoInsertado;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ExportarXMLInforme\n	Exporta las especificaciones de un informe a una cadena XML valida dentro de un archivo especificado\n\n	Variables de entrada:\n\n		informe - Identificador unico del informe que se desea exportar\n		tipo_copia_objeto - Indica el tipo de copia que se hara del informe: EnLinea|XML_IdEstatico|XML_IdDinamico\n\n	Salida:\n\n		Archivo con el elemento exportado\n\n	Ver tambien:\n		<PCO_AdministrarFormularios>\n*/\nfunction PCO_ExportarXMLInforme($informe,$tipo_copia_objeto,$PCO_NombreArchivoXML=\"\")\n	{\n		global $ArchivoCORE,$ListaCamposSinID_evento_objeto,$_SeparadorCampos_,$TablasCore,$ListaCamposSinID_formulario,$ConexionPDO,$ListaCamposSinID_formulario_objeto,$ListaCamposSinID_formulario_boton;\n		global $MULTILANG_ErrorDatos,$MULTILANG_ErrorTiempoEjecucion,$MULTILANG_FrmMsjCopia,$MULTILANG_FrmTipoCopiaExporta,$MULTILANG_FrmCopiaFinalizada,$MULTILANG_IrEscritorio,$MULTILANG_Descargar;\n		global $PCO_VersionActual,$Nombre_Aplicacion,$Version_Aplicacion,$PCOSESS_LoginUsuario,$PCO_FechaOperacionGuiones,$PCO_HoraOperacionPuntos,$PCO_FechaOperacion,$PCO_HoraOperacion;\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_boton;\n\n\n			$mensaje_error=\"\";\n			if ($informe==\"\")\n				$mensaje_error=$MULTILANG_ErrorTiempoEjecucion.\".  No ingreso ID de Informe - Report ID not entered\";\n			if ($tipo_copia_objeto==\"\")\n				$mensaje_error=$MULTILANG_ErrorTiempoEjecucion.\".  No indicado modo de copia - Copy mode not entered\";\n\n			$Contenido_XML=\"\";\n\n			if ($mensaje_error==\"\")\n				{\n					//Hace la copia del objeto segun el tipo solicitado\n					if ($tipo_copia_objeto==\"EnLinea\")\n						{\n							// Busca datos y Crea copia del informe\n							$consulta=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=?\",\"$informe\");\n							$registro = $consulta->fetch();\n							// Establece valores para cada campo a insertar en el nuevo informe\n							/* ##########################################################################################################*/\n							/* ####### IMPORTANTE:  Ajustes sobre esta funcionde copia se deberian replicar en importaciones XML ########*/\n							/* ##########################################################################################################*/\n							$titulo=\'[COPIA] \'.$registro[\"titulo\"];\n							$descripcion=$registro[\"descripcion\"];\n							$categoria=$registro[\"categoria\"];\n							$agrupamiento=$registro[\"agrupamiento\"];\n							$ordenamiento=$registro[\"ordenamiento\"];\n							$ancho=$registro[\"ancho\"];\n							$alto=$registro[\"alto\"];\n							$formato_final=$registro[\"formato_final\"];\n							$formato_grafico=$registro[\"formato_grafico\"];\n							$genera_pdf=$registro[\"genera_pdf\"];\n							$variables_filtro=$registro[\"variables_filtro\"];\n							$soporte_datatable=$registro[\"soporte_datatable\"];\n							$formulario_filtrado=$registro[\"formulario_filtrado\"];\n							$tamano_paginacion=$registro[\"tamano_paginacion\"];\n							$subtotales_columna=$registro[\"subtotales_columna\"];\n							$subtotales_formato=$registro[\"subtotales_formato\"];\n							$conexion_origen_datos=$registro[\"conexion_origen_datos\"];\n							$consulta_sql=$registro[\"consulta_sql\"];\n							$tooltip_titulo=$registro[\"tooltip_titulo\"];\n							$exportar_dtclp=$registro[\"exportar_dtclp\"];\n							$exportar_dtcsv=$registro[\"exportar_dtcsv\"];\n							$exportar_dtxls=$registro[\"exportar_dtxls\"];\n							$exportar_dtpdf=$registro[\"exportar_dtpdf\"];\n							$ocultar_encabezado=$registro[\"ocultar_encabezado\"];\n							$ocultar_piepagina=$registro[\"ocultar_piepagina\"];\n							$anular_acciones=$registro[\"anular_acciones\"];\n							$encabezado_html=$registro[\"encabezado_html\"];\n							$tabla_responsive=$registro[\"tabla_responsive\"];\n							$permitido_home=$registro[\"permitido_home\"];\n							$javascript=$registro[\"javascript\"];\n							$pre_script=$registro[\"pre_script\"];\n							$post_script=$registro[\"post_script\"];\n							$usar_ajax=$registro[\"usar_ajax\"];\n							$definir_cols=$registro[\"definir_cols\"];\n							$pane_activado=$registro[\"pane_activado\"];\n							$pane_cascada=$registro[\"pane_cascada\"];\n							$pane_colapsado=$registro[\"pane_colapsado\"];\n							$pane_columnas=$registro[\"pane_columnas\"];\n							$pane_subtotalesrelativos=$registro[\"pane_subtotalesrelativos\"];\n							$pane_conteos=$registro[\"pane_conteos\"];\n							$pane_controles=$registro[\"pane_controles\"];\n							$pane_control_colapsar=$registro[\"pane_control_colapsar\"];\n							$pane_control_ordenar=$registro[\"pane_control_ordenar\"];\n							$modulo=$registro[\"modulo\"];\n\n							// Inserta el nuevo informe\n							PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe (\".$ListaCamposSinID_informe.\") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \",\"$titulo$_SeparadorCampos_$descripcion$_SeparadorCampos_$categoria$_SeparadorCampos_$agrupamiento$_SeparadorCampos_$ordenamiento$_SeparadorCampos_$ancho$_SeparadorCampos_$alto$_SeparadorCampos_$formato_final$_SeparadorCampos_$formato_grafico$_SeparadorCampos_$genera_pdf$_SeparadorCampos_$variables_filtro$_SeparadorCampos_$soporte_datatable$_SeparadorCampos_$formulario_filtrado$_SeparadorCampos_$tamano_paginacion$_SeparadorCampos_$subtotales_columna$_SeparadorCampos_$subtotales_formato$_SeparadorCampos_$conexion_origen_datos$_SeparadorCampos_$consulta_sql$_SeparadorCampos_$tooltip_titulo$_SeparadorCampos_$exportar_dtclp$_SeparadorCampos_$exportar_dtcsv$_SeparadorCampos_$exportar_dtxls$_SeparadorCampos_$exportar_dtpdf$_SeparadorCampos_$ocultar_encabezado$_SeparadorCampos_$ocultar_piepagina$_SeparadorCampos_$anular_acciones$_SeparadorCampos_$encabezado_html$_SeparadorCampos_$tabla_responsive$_SeparadorCampos_$permitido_home$_SeparadorCampos_$javascript$_SeparadorCampos_$pre_script$_SeparadorCampos_$post_script$_SeparadorCampos_$usar_ajax$_SeparadorCampos_$definir_cols$_SeparadorCampos_$pane_activado$_SeparadorCampos_$pane_cascada$_SeparadorCampos_$pane_colapsado$_SeparadorCampos_$pane_columnas$_SeparadorCampos_$pane_subtotalesrelativos$_SeparadorCampos_$pane_conteos$_SeparadorCampos_$pane_controles$_SeparadorCampos_$pane_control_colapsar$_SeparadorCampos_$pane_control_ordenar$_SeparadorCampos_$modulo\");\n\n							$idObjetoInsertado=PCO_ObtenerUltimoIDInsertado($ConexionPDO);\n\n							// Busca los elementos que componen el informe para hacerles la copia\n							//Determina cuantos condiciones tiene la tabla\n							$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_condiciones);\n							$TotalCampos=count($ArregloCampos);\n							// Registros de informe_condiciones\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_condiciones WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Genera cadena de interrogantes y valores segun cantidad de campos\n									$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n									$CadenaValores=$idObjetoInsertado;\n									for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n										{\n											//Cadena de interrogantes\n											$CadenaInterrogantes.=\',?\';\n											//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n											if ($PCOCampo!=0)\n												$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n											else\n												$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n										}\n									//Inserta el nuevo objeto al informe\n									PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_condiciones ($ListaCamposSinID_informe_condiciones) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n								}\n\n							//Determina cuantos tablas tiene la tabla\n							$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_tablas);\n							$TotalCampos=count($ArregloCampos);\n							// Registros de informe_tablas\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_tablas WHERE informe=? \",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Genera cadena de interrogantes y valores segun cantidad de campos\n									$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n									$CadenaValores=$idObjetoInsertado;\n									for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n										{\n											//Cadena de interrogantes\n											$CadenaInterrogantes.=\',?\';\n											//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n											if ($PCOCampo!=0)\n												$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n											else\n												$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n										}\n									//Inserta el nuevo objeto al informe\n									PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_tablas ($ListaCamposSinID_informe_tablas) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n								}\n\n\n							//Determina cuantos campos tiene la tabla\n							$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_campos);\n							$TotalCampos=count($ArregloCampos);\n							// Registros de informe_campos\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Genera cadena de interrogantes y valores segun cantidad de campos\n									$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n									$CadenaValores=$idObjetoInsertado;\n									for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n										{\n											//Cadena de interrogantes\n											$CadenaInterrogantes.=\',?\';\n											//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n											if ($PCOCampo!=0)\n												$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n											else\n												$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n										}\n									//Inserta el nuevo objeto al informe\n									PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_campos ($ListaCamposSinID_informe_campos) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n								}\n\n							//Determina cuantos botones tiene la tabla\n							$ArregloCampos=explode(\',\',$ListaCamposSinID_informe_boton);\n							$TotalCampos=count($ArregloCampos);\n							// Registros de informe_boton\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_boton WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Genera cadena de interrogantes y valores segun cantidad de campos\n									$CadenaInterrogantes=\'?\'; //Agrega el primer interrogante\n									$CadenaValores=$registro[1];\n									for ($PCOCampo=1;$PCOCampo<$TotalCampos;$PCOCampo++)\n										{\n											//Cadena de interrogantes\n											$CadenaInterrogantes.=\',?\';\n											//Cadena de valores (el campo No 0 corresponde al ID de informe nuevo)\n											if ($PCOCampo!=2)\n												$CadenaValores.=$_SeparadorCampos_.$registro[$PCOCampo+1];\n											else\n												$CadenaValores.=$_SeparadorCampos_.$idObjetoInsertado;\n										}\n									//Inserta el nuevo objeto al informe\n									PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"informe_boton ($ListaCamposSinID_informe_boton) VALUES ($CadenaInterrogantes) \",\"$CadenaValores\");\n								}\n\n							PCO_Auditar(\"Crea copia de informe $informe\");\n\n							//Presenta la ventana con informacion y enlace de descarga\n							?>\n								<form action=\"<?php echo $ArchivoCORE; ?>\" method=\"POST\" name=\"det<?php echo $idObjetoInsertado; ?>\" id=\"det<?php echo $idObjetoInsertado; ?>\">\n										<input type=\"hidden\" name=\"PCO_Accion\" value=\"PCO_EditarInforme\">\n										<input type=\"hidden\" name=\"informe\" value=\"<?php echo $idObjetoInsertado; ?>\">\n										<input type=\"hidden\" name=\"PCO_Valor\" value=\"<?php echo $idObjetoInsertado; ?>\">\n										<a class=\"btn btn-success btn-block\" href=\"javascript:document.det<?php echo $idObjetoInsertado; ?>.submit();\"><i class=\"fa fa-pencil\"></i> <?php echo $MULTILANG_Editar.\" <b>\".$titulo.\"</b>\"; ?></a>\n								</form>\n							<?php\n						}\n\n\n					//Hace la copia del objeto segun el tipo solicitado\n					if ($tipo_copia_objeto==\"XML_IdEstatico\" || $tipo_copia_objeto==\"XML_IdDinamico\")\n						{\n							// Inicia el archivo XML\n							$Contenido_XML.=\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?>\n<objetos_practicos>\n	<descripcion>\n		<tipo_objeto>Informe</tipo_objeto>\n		<version_practico>$PCO_VersionActual</version_practico>\n		<tipo_exportacion>$tipo_copia_objeto</tipo_exportacion>\n		<sistema_origen>$Nombre_Aplicacion</sistema_origen>\n		<version>$Version_Aplicacion</version>\n		<usuario_generador>$PCOSESS_LoginUsuario</usuario_generador>\n		<fecha_exportacion>$PCO_FechaOperacionGuiones</fecha_exportacion>\n		<hora_exportacion>$PCO_HoraOperacionPuntos</hora_exportacion>\n	</descripcion>\";\n							// Exporta tabla core_informe\n							$Contenido_XML .= \"\n	<core_informe>\";\n							// Busca datos y genera XML de cada registro\n							$consulta=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=?\",\"$informe\");\n							$registro = $consulta->fetch();\n							$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_informe);\n							$Contenido_XML .= \"\n	</core_informe>\";\n							// Registros de informe_boton\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_boton WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							$conteo_elementos_xml=0;\n							while($registro = $consulta->fetch())\n								{\n									//Exporta la tabla de core_informe_boton\n									$Contenido_XML .= \"\n	<core_informe_boton>\";\n									$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_informe_boton);\n							$Contenido_XML .= \"\n	</core_informe_boton>\";\n									$conteo_elementos_xml++;\n								}\n							//Agrega el total de elementos y resetea contador para el siguiente\n									$Contenido_XML .= \"\n	<total_core_informe_boton><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_informe_boton>\";\n							$conteo_elementos_xml=0;\n\n							// Registros de informe_campos\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Exporta la tabla de core_informe_campos\n									$Contenido_XML .= \"\n	<core_informe_campos>\";\n									$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_informe_campos);\n							$Contenido_XML .= \"\n	</core_informe_campos>\";\n									$conteo_elementos_xml++;\n								}\n							//Agrega el total de elementos y resetea contador para el siguiente\n									$Contenido_XML .= \"\n	<total_core_informe_campos><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_informe_campos>\";\n							$conteo_elementos_xml=0;\n\n							// Registros de informe_condiciones\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_condiciones WHERE informe=? ORDER BY peso,id\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Exporta la tabla de core_informe_condiciones\n									$Contenido_XML .= \"\n	<core_informe_condiciones>\";\n									$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_informe_condiciones);\n							$Contenido_XML .= \"\n	</core_informe_condiciones>\";\n									$conteo_elementos_xml++;\n								}\n							//Agrega el total de elementos y resetea contador para el siguiente\n									$Contenido_XML .= \"\n	<total_core_informe_condiciones><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_informe_condiciones>\";\n							$conteo_elementos_xml=0;\n\n							// Registros de informe_tablas\n							$consulta=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"informe_tablas WHERE informe=?\",\"$informe\");\n							while($registro = $consulta->fetch())\n								{\n									//Exporta la tabla de core_informe_tablas\n									$Contenido_XML .= \"\n	<core_informe_tablas>\";\n									$Contenido_XML .=PCO_ConvertirRegistroXML($registro,\"id,\".$ListaCamposSinID_informe_tablas);\n							$Contenido_XML .= \"\n	</core_informe_tablas>\";\n									$conteo_elementos_xml++;\n								}\n							//Agrega el total de elementos y resetea contador para el siguiente\n									$Contenido_XML .= \"\n	<total_core_informe_tablas><cantidad_objetos>$conteo_elementos_xml</cantidad_objetos></total_core_informe_tablas>\";\n							$conteo_elementos_xml=0;\n\n							// Finaliza el archivo XML\n							$Contenido_XML .= \"\n</objetos_practicos>\";\n\n							PCO_Auditar(\"Crea copia $tipo_copia_objeto de informe $informe\");\n\n							//Guarda la cadena generada en el archivo XML\n							if ($PCO_NombreArchivoXML==\"\")\n								$PCO_NombreArchivoXML=\"tmp/RepID_\".$informe.\"_\".$PCO_FechaOperacion.\"_\".$PCO_HoraOperacion.\".xml\";\n							$PCO_PunteroArchivo = fopen($PCO_NombreArchivoXML, \"w\");\n							if($PCO_PunteroArchivo==false)\n								die(\"No se puede abrir el archivo de exportacion\");\n							fputs ($PCO_PunteroArchivo, $Contenido_XML);\n							fclose ($PCO_PunteroArchivo);\n\n							//Presenta la ventana con informacion y enlace de descarga\n							?>\n								<a class=\"btn btn-success btn-block\" href=\"<?php echo $PCO_NombreArchivoXML; ?>\" target=\"_BLANK\" download><i class=\"fa fa-floppy-o\"></i> <?php echo $MULTILANG_Descargar.\" \".$PCO_NombreArchivoXML; ?></a>\n							<?php\n						}\n\n				}\n			else\n				{\n					echo \'<form name=\"cancelar\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\">\n						<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_AdministrarInformes\">\n						<input type=\"Hidden\" name=\"PCO_ErrorTitulo\" value=\"\'.$MULTILANG_ErrorDatos.\'\">\n						<input type=\"Hidden\" name=\"PCO_ErrorDescripcion\" value=\"\'.$mensaje_error.\'\">\n						</form>\n						<script type=\"\" language=\"JavaScript\"> document.cancelar.submit();  </script>\';\n				}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_ManejadorExcepciones\n	Captura las excepciones generados por PHP durante la ejecucion y las presenta al usuario\n\n	Salida:\n		Mensajes de alerta en pantalla con los detalles entregados por PHP\n*/\nfunction PCO_ManejadorExcepciones($DetalleExcepcion)\n	{\n		global $ModoDepuracion,$MULTILANG_Atencion,$MULTILANG_Archivo;\n		if ($ModoDepuracion)\n			{\n				$Detalles=error_get_last();\n				$Tipo=$Detalles[\"type\"];\n				$Mensaje=$Detalles[\"message\"];\n				$Archivo=$Detalles[\"file\"];\n				$Linea=$Detalles[\"line\"];\n				if ($Archivo!=\"\" && $Mensaje!=\"\")\n					PCO_Mensaje($MULTILANG_Atencion.\" (PHP Exception cod $Tipo)\",\"$Archivo (linea $Linea)<br>$Mensaje\", \'\', \'fa fa-exclamation-triangle texto-rojo texto-blink\', \'alert alert-warning\');\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_ManejadorErrores\n	Captura los errores generados por PHP durante la ejecucion y los presenta al usuario\n\n	Salida:\n		Mensajes de alerta en pantalla con los detalles entregados por PHP\n*/\nfunction PCO_ManejadorErrores($DetalleExcepcion)\n	{\n		global $ModoDepuracion,$MULTILANG_Atencion,$MULTILANG_Archivo;\n		if ($ModoDepuracion)\n			{\n				$Detalles=error_get_last();\n				$Tipo=$Detalles[\"type\"];\n				$Mensaje=$Detalles[\"message\"];\n				$Archivo=$Detalles[\"file\"];\n				$Linea=$Detalles[\"line\"];\n				if ($Archivo!=\"\" && $Mensaje!=\"\")\n					PCO_Mensaje($MULTILANG_Atencion.\" (PHP Error cod $Tipo)\",\"$Archivo (linea $Linea)<br>$Mensaje\", \'\', \'fa fa-exclamation-triangle texto-rojo texto-blink\', \'alert alert-danger\');\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_BuscarErroresSintaxisPHP\n	Verifica la sintaxis de un archivo PHP.  Utilizada normalmente antes de cualquier inclusion para evitar que se incluyan archivos con errores del lado del usuario.\n\n	Variables de entrada:\n\n		ArchivoFuente - Archivo que se desea verificar sintaxis\n		Funcion exec - Activada en PHP\n\n	Salida:\n		0 si no hay errores de sintaxis\n		1 si hay errores ademas de los mensajes en la salida estandar\n*/\nfunction PCO_BuscarErroresSintaxisPHP($ArchivoFuente,$ByPassSintaxis=0,$DescComplemento=\"\")\n	{\n		//Hace el proceso de verificacion solamente en plataformas diferentes a Windows.  Windows no lo permite a menos que se especifique el path completo de PHP\n		if (strtoupper(substr(PHP_OS, 0, 3)) === \'WIN\' || strtoupper(PHP_OS) === \'FREEBSD\' || strtoupper(PHP_OS) === \'OPENBSD\')\n			{\n				//Se omite verificacion de sintaxis\n				/*Otros posibles hosts\n				CYGWIN_NT-5.1\n				Darwin\n				FreeBSD\n				HP-UX\n				IRIX64\n				Linux\n				NetBSD\n				OpenBSD\n				SunOS\n				Unix\n				*/\n\n				return 0;\n			}\n		else\n			{\n				global $MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Detalles,$PCO_ChequeoDinamicoSintaxis;\n				$SalidaFuncion=0;\n				if ($PCO_ChequeoDinamicoSintaxis==\"1\" || $ByPassSintaxis==\"1\")\n					{\n						if (@exec(\'php -l \'.escapeshellarg($ArchivoFuente), $Salida, $Codigo)===false)\n							throw new \\RuntimeException(\'Detectado error de sintaxis en\'.escapeshellarg($ArchivoFuente));\n\n						if ($Codigo)  //Si se tiene un valor diferente de cero retornado por el comando\n							{\n								PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,\"PHP retorna: <i>\".$Salida[0].$Salida[1].$Salida[2].\"<i>.  <b>Valide su sintaxis para ser incluido sin problemas</b>.  {$DescComplemento}\", \'\', \'fa fa-exclamation-triangle fa-3x texto-rojo texto-blink\', \'alert alert-danger alert-dismissible\');\n								$SalidaFuncion=1;\n							}\n					}\n				return $SalidaFuncion;\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ReemplazarVariablesPHPEnCadena\n	Devuelve una cadena evaluada donde se reemplazan las expresiones de variables PHP con el formato {$variable} por su valor definido\n\n	Variables de entrada:\n\n		cadena_original - Cadena con las variables expresadas\n\n	Salida:\n\n		Cadena con las variables reemplazadas\n\n	Ver tambien:\n		<PCO_ConstruirConsultaInforme>\n*/\nfunction PCO_ReemplazarVariablesPHPEnCadena($cadena_original,$PCO_RegistroDatosFormulario=\"\")\n	{\n		//Reemplaza todas las ocurrencias de variables por el valor de la misma en su variable global\n		$cadena_final = preg_replace_callback(\'~\\{\\$(.*?)\\}~si\',	//Aqui sigue la funcion de CallBack (ANTES de vers. 19.9 era funcion independiente sin recepcion de parametros)\n																	function  ($ocurrencia) use ($PCO_RegistroDatosFormulario)\n																		{\n																			//Declara la variable como global, pues no se sabe qué variable y en qué ambito se encuentra\n																			//Busca si tiene corchetes (porque puede ser un arreglo)\n																			if (strpos ($ocurrencia[1] , \"[\") !== false && strpos ($ocurrencia[1] , \"]\") !== false)\n																				{\n																					$VariableRealArreglo=strstr ( $ocurrencia[1]  , \"[\", TRUE );\n																					$PosicionArreglo=str_replace ( $VariableRealArreglo.\"[\" , \"\" , $ocurrencia[1] );\n																					$PosicionArreglo=strstr ( $PosicionArreglo  , \"]\", TRUE );\n																					//Si la variable es la de contenido de registros de practico\n																					if ($VariableRealArreglo==\"PCO_RegistroDatosActivo\")\n																						return $PCO_RegistroDatosFormulario[$PosicionArreglo];\n																					else\n																						return;\n																				}\n																			else\n																				{\n																					global ${$ocurrencia[1]};\n																					//Obtiene el valor de la variable\n																					//return eval(\'return $\' . $ocurrencia[1] . \';\');  //Funcion eval reemplazada por seguridad\n																					return ${$ocurrencia[1]};				\n																				}\n																		}  \n																	,$cadena_original);\n		return $cadena_final;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_DistanciaDosCoordenadas\n	Retorna el nombre legible de una direccion (en lenguaje natural) indicados por latitud y longitud\n\n	Variables de entrada:\n\n		Latitud - Asociada al punto deseado			Ejemplos Furatena: 6.249326, -75.565550	Castropol:  6.217010, -75.566734\n		Longitud - Asociada al punto deseado\n		APIKey_GoogleMaps - Utilizada para hacer el llamado a la API\n\n	Salida:\n		Arreglo con todos los resultados\n*/\nfunction PCO_DireccionPorCoordenas($Latitud, $Longitud, $APIKey_GoogleMaps)\n	{\n		$URLMaps = \"https://maps.googleapis.com/maps/api/geocode/json?latlng=\".$Latitud.\",\".$Longitud.\"&key=\".$APIKey_GoogleMaps.\"&language=es\";\n		$DatosRecibidos = @PCO_CargarURL($URLMaps);\n		return json_decode($DatosRecibidos, true);\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_DireccionPorIDSitio\n	Retorna el nombre legible de una direccion (en lenguaje natural) indicados por el PlaceID usado por Google\n\n	Variables de entrada:\n\n		PlaceID - Asociada al punto deseado			Ejemplo Castropol:  EkNDbC4gMTcgIzM3YS05NiBhIDM3YS0xNzIsIE1lZGVsbMOtbiwgTWVkZWxsw61uLCBBbnRpb3F1aWEsIENvbG9tYmlh\n		APIKey_GoogleMaps - Utilizada para hacer el llamado a la API\n\n	Salida:\n		Arreglo con todos los resultados\n*/\nfunction PCO_DireccionPorIDSitio($PlaceID, $APIKey_GoogleMaps)\n	{\n		$URLMaps = \"https://maps.googleapis.com/maps/api/geocode/json?place_id=\".$PlaceID.\"&key=\".$APIKey_GoogleMaps.\"&language=es\";\n		$DatosRecibidos = @PCO_CargarURL($URLMaps);\n		return json_decode($DatosRecibidos, true);\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_DistanciaDosCoordenadas\n	Retorna la distancia entre dos puntos indicados por latitud y longitud\n\n	Variables de entrada:\n\n		Punto1 - Determinado por latitud1 y longitud1\n		Punto1 - Determinado por latitud2 y longitud2\n		UnidadMedida - Determinado por latitud y longitud   m=metros|km=kilometros|mi=millas\n\n	Salida:\n		Valor de la distancia expresado en la unidad solicitada\n\n	Adicionales:\n		* http://stackoverflow.com/questions/29003118/get-driving-distance-between-two-points-using-google-maps-api\n		* http://stackoverflow.com/questions/14041227/distance-from-point-a-to-b-using-google-maps-php-and-mysql  ver working example\n		* http://jafrancov.com/2011/06/geocode-gmaps-api-v3/\n*/\nfunction PCO_DistanciaCoordenadasSimple($Latitud1, $Longitud1, $Latitud2, $Longitud2, $UnidadMedida=\"m\")\n	{\n		$theta = $Longitud1 - $Longitud2;\n		$Millas = (sin(deg2rad($Latitud1)) * sin(deg2rad($Latitud2))) + (cos(deg2rad($Latitud1)) * cos(deg2rad($Latitud2)) * cos(deg2rad($theta)));\n		$Millas = acos($Millas);\n		$Millas = rad2deg($Millas);\n		$Millas = $Millas * 60 * 1.1515;\n		if ($UnidadMedida==\"mi\")\n			return $Millas;\n		$Kilometros = $Millas * 1.609344;\n		if ($UnidadMedida==\"km\")\n			return $Kilometros;\n		return $Kilometros/1000;//retorna metros\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_EsDispositivoMovil\n	Determina si la aplicacion esta corriendo en un dispositivo movil o PC de escritorio segun el agente reportado\n\n	Variables de entrada:\n\n		HTTP_USER_AGENT - Tomada desde el entorno\n\n	Salida:\n		Verdadero o falso segun el navegador del usuario\n\n*/\nfunction PCO_EsDispositivoMovil()\n	{\n		$aMobileUA = array(\n			\'/iphone/i\' => \'iPhone\',\n			\'/ipod/i\' => \'iPod\',\n			\'/ipad/i\' => \'iPad\',\n			\'/android/i\' => \'Android\',\n			\'/blackberry/i\' => \'BlackBerry\',\n			\'/webos/i\' => \'Mobile\'\n			);\n\n		//Retorna verdadero si es detectado un agente de usuario movil\n		foreach($aMobileUA as $sMobileKey => $sMobileOS)\n			{\n				if(preg_match($sMobileKey, $_SERVER[\'HTTP_USER_AGENT\']))\n					{\n						return true;\n					}\n			}\n		//En otro caso retorna falso\n		return false;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_EsUsuarioInterno\n	Determina si un login de usuario es corresponde a un usuario interno o no\n\n	Variables de entrada:\n\n		Usuario - Login de usuario a verificar\n\n	Salida:\n		Cero (0) o uno (1) segun la pertenencia o no del usuario\n*/\nfunction PCO_EsUsuarioInterno($Usuario)\n	{\n		global $ListaCamposSinID_usuario,$TablasCore;\n		$RegistroUsuario=PCO_EjecutarSQL(\"SELECT $ListaCamposSinID_usuario FROM \".$TablasCore.\"usuario WHERE login=\'$Usuario\' \")->fetch();\n		return $RegistroUsuario[\"usuario_interno\"];\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_EsAdministrador\n	Determina si un login de usuario es administrador de plataforma o no (si es super usuario)\n\n	Variables de entrada:\n\n		Usuario - Login de usuario a verificar\n\n	Salida:\n		Cero (0) o uno (1) segun la pertenencia o no del usuario al grupo de admins\n*/\nfunction PCO_EsAdministrador($Usuario)\n	{\n		global $PCOVAR_Administradores;\n		$ArregloAdmins=explode(\",\",$PCOVAR_Administradores);\n\n		//Recorre el arreglo de super-usuarios\n		$Resultado = 0;\n		if ($Usuario!=\"\")\n			foreach ($ArregloAdmins as $UsuarioAdmin)\n				{\n					if (trim($UsuarioAdmin)==$Usuario)\n						$Resultado = 1;\n				}\n		return $Resultado;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_BackupObtenerDatosTabla\n	Recupera los datos en formato Insert asociados a una tabla\n\n	Variables de entrada:\n\n		PCO_NombreTabla - Nombre de la tabla de la que se desea obtener los datos\n\n	Salida:\n		Sentencias necesarias para insertar los datos en las tablas\n*/\nfunction PCO_BackupObtenerDatosTabla($PCO_NombreTabla=\"\",$codificacion_actual,$codificacion_destino,$transliterar_conversion)\n	{\n		$RegistrosEncontrados = PCO_EjecutarSQL(\'SELECT * FROM \'.$PCO_NombreTabla)->fetchAll(PDO::FETCH_NUM);\n		$Datos = \'\';\n		foreach ($RegistrosEncontrados as $Registro)\n			{\n				foreach($Registro as &$Valor)\n					{\n						//Determina si se quiere un cambio de codificacion de caracteres y lo ejecuta\n						if ($codificacion_destino!=\"\")\n							{\n								//Determina si se tiene o no transliteracion\n								$ComplementoTransliteracion=\"\";\n								if($transliterar_conversion==1)\n									$ComplementoTransliteracion=\"//TRANSLIT\";\n								if($transliterar_conversion==2)\n									$ComplementoTransliteracion=\"//IGNORE\";\n								if($transliterar_conversion==3)\n									$ComplementoTransliteracion=\"//IGNORE//TRANSLIT\";\n								//Hace la conversion de la cadena\n								$Valor = iconv($codificacion_actual,$codificacion_destino.$ComplementoTransliteracion,$Valor);\n							}\n						$Valor = htmlentities(addslashes($Valor));\n					}\n				$Datos .= \'INSERT INTO \'. $PCO_NombreTabla .\' VALUES (\\\'\' . implode(\'\\\',\\\'\', $Registro) . \'\\\');\'.\"\\n\";\n			}\n		return $Datos;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_BackupObtenerColumnasTabla\n	Recupera los campos asociados a una tabla de datos\n\n	Variables de entrada:\n\n		PCO_NombreTabla - Nombre de la tabla de la que se desea obtener la estructura\n\n	Salida:\n		Sentencia de creacion de la tabla\n*/\nfunction PCO_BackupObtenerColumnasTabla($PCO_NombreTabla=\"\")\n	{\n		$ConsultaCreate = PCO_EjecutarSQL(\'SHOW CREATE TABLE \'.$PCO_NombreTabla)->fetchAll();\n		$ConsultaCreate[0][1] = preg_replace(\"/AUTO_INCREMENT=[\\w]*./\", \'\', $ConsultaCreate[0][1]);\n		return $ConsultaCreate[0][1].\";\".\"\\n\";\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_BackupObtenerTablasBD\n	Recupera las tablas desde la base de datos\n\n	Variables de entrada:\n\n		PCO_ListaTablas - Lista de tablas separadas por coma o simbolo * para todas las tablas\n\n	Salida:\n		Retorna un arreglo con todas las tablas y su backup dividido en tres campos logicos de Nombre, SentenciaCreate y SentenciaInsert\n		Retorna 0 cuando se obtiene algun error\n*/\nfunction PCO_BackupObtenerTablasBD($PCO_ListaTablas=\"\",$TipoDeCopia=\"Estructura\",$codificacion_actual,$codificacion_destino,$transliterar_conversion)\n	{\n		$TablasExistentes = PCO_EjecutarSQL(\'SHOW TABLES\')->fetchAll();\n		$TablasSolicitadasBackup=explode(\",\",$PCO_ListaTablas);\n		$i=0;\n		foreach($TablasExistentes as $Tabla)\n			{\n				//Determina si la tabla esta dentro de las deseadas para backup\n				if (in_array($Tabla[0],$TablasSolicitadasBackup) || $PCO_ListaTablas==\"*\")\n					{\n						$ArregloFinalTablas[$i][\'Nombre\']=$Tabla[0];\n						if ($TipoDeCopia==\"Estructura\" || $TipoDeCopia==\"Estructura+Datos\")\n							$ArregloFinalTablas[$i][\'SentenciaCreate\']=PCO_BackupObtenerColumnasTabla($Tabla[0]);\n						if ($TipoDeCopia==\"Datos\" || $TipoDeCopia==\"Estructura+Datos\")\n							$ArregloFinalTablas[$i][\'SentenciaInsert\']=PCO_BackupObtenerDatosTabla($Tabla[0],$codificacion_actual,$codificacion_destino,$transliterar_conversion);\n						$i++;\n					}\n			}\n		return $ArregloFinalTablas;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_Backup\n	Ejecuta un respaldo parcial o total de la base de datos sobre un archivo determinado\n\n	Variables de entrada:\n\n		PCO_ListaTablas - Lista de tablas separadas por coma o simbolo * para todas las tablas\n		TipoDeCopia - Lista de tablas separadas por coma  Estructura|Datos|Estructura+Datos\n		ArchivoDestino - Ruta completa al archivo de destino del backup\n\n	Salida:\n		Retorna 1 ante un proceso exitoso\n		Retorna 0 cuando se obtiene algun error\n*/\nfunction PCO_Backup($PCO_ListaTablas,$ArchivoDestino=\"\",$TipoDeCopia=\"Estructura\",$codificacion_actual=\"UTF-8\",$codificacion_destino=\"UTF-8\",$transliterar_conversion=0)\n	{\n		$EstadoOperacion = $ArchivoDestino==\"\" ? 0 : 1;  //Asume que no hay errores\n		$ContenidoBackup=\"\";\n\n		//Si no hay errores continua con el proceso\n		if ($EstadoOperacion==1)\n			{\n				//Lanza el proceso de copia\n				$ArregloContenidos=PCO_BackupObtenerTablasBD($PCO_ListaTablas,$TipoDeCopia,$codificacion_actual,$codificacion_destino,$transliterar_conversion);\n				//Recorre las tablas agregando todo al Backup\n				for($i=0;$i<count($ArregloContenidos);$i++)\n					{\n						if ($TipoDeCopia==\"Estructura\" || $TipoDeCopia==\"Estructura+Datos\")\n							$ContenidoBackup.=$ArregloContenidos[$i][\'SentenciaCreate\'];\n						if ($TipoDeCopia==\"Datos\" || $TipoDeCopia==\"Estructura+Datos\")\n							$ContenidoBackup.=$ArregloContenidos[$i][\'SentenciaInsert\'];\n					}\n\n				// Comprime el archivo resultante y lo guarda\n				$resultado_backup_comprimido = gzencode($ContenidoBackup, 9);\n				$puntero_archivo_destino_backup_bdd = fopen($ArchivoDestino, \"w\");\n				fwrite($puntero_archivo_destino_backup_bdd, $resultado_backup_comprimido);\n				fclose($puntero_archivo_destino_backup_bdd);\n			}\n		//Retorna el resultado general de la operacion de copia\n		return $EstadoOperacion;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	// Function: PCO_SegmentarSQL\n	Divide una cadena completa en sentencias SQL independientes para ser ejecutadas una a una\n\n	Variables de entrada:\n\n		sql - Cadena completa de sentencias\n\n	Salida:\n		Cadena SQL dividida\n*/\n//Divide los queries de un cadena\nfunction PCO_SegmentarSQL($sql)\n	{\n		$sql = trim($sql);\n		$sql = preg_replace(\"/\\n#[^\\n]*\\n/\", \"\\n\", $sql);\n\n		$buffer = array();\n		$ret = array();\n		$in_string = false;\n\n		for($i=0; $i<strlen($sql)-1; $i++) {\n			if($sql[$i] == \";\" && !$in_string) {\n				$ret[] = substr($sql, 0, $i);\n				$sql = substr($sql, $i + 1);\n				$i = 0;\n			}\n\n			if($in_string && ($sql[$i] == $in_string) && $buffer[1] != \"\\\\\") {\n				$in_string = false;\n			}\n			elseif(!$in_string && ($sql[$i] == \'\"\' || $sql[$i] == \"\'\") && (!isset($buffer[0]) || $buffer[0] != \"\\\\\")) {\n				$in_string = $sql[$i];\n			}\n			if(isset($buffer[1])) {\n				$buffer[0] = $buffer[1];\n			}\n			$buffer[1] = $sql[$i];\n		}\n\n		if(!empty($sql)) {\n			$ret[] = $sql;\n		}\n		return($ret);\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CopiarPermisos\n	Copia los permisos definidos para un usuario origen en otro especificado por destino\n\n	Variables de entrada:\n\n		usuariod - Usuario destino (al que seran copiados los permisos)\n		usuarioo - Usuario oorigen (del que se toman los permisos como base para ser copiados)\n\n	Salida:\n		Registros de permisos actualizados en BD\n*/\nfunction PCO_CopiarPermisos($usuario_origen=\"\",$usuario_destino=\"\")\n	{\n		global $TablasCore,$ListaCamposSinID_usuario_menu,$_SeparadorCampos_;\n		// Elimina opciones existentes\n		PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"usuario_menu WHERE usuario=? \",\"$usuario_destino\");\n		// Copia permisos si el usuario origen es diferente de vacio, sino lo deja sin nada\n		if ($usuario_origen!=\"\")\n			{\n				$resultado=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_usuario_menu.\" FROM \".$TablasCore.\"usuario_menu WHERE usuario=\'$usuario_origen\' \");\n				while($registro = $resultado->fetch())\n					{\n						$menuinsertar=$registro[\"menu\"];\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"usuario_menu (\".$ListaCamposSinID_usuario_menu.\") VALUES (?,?)\",\"$usuario_destino$_SeparadorCampos_$menuinsertar\");\n					}\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CopiarInformes\n	Copia los informes definidos para un usuario origen en otro especificado por destino\n\n	Variables de entrada:\n\n		usuariod - Usuario destino (al que seran copiados los permisos)\n		usuarioo - Usuario oorigen (del que se toman los permisos como base para ser copiados)\n\n	Salida:\n		Registros de permisos actualizados en BD\n*/\nfunction PCO_CopiarInformes($usuario_origen=\"\",$usuario_destino=\"\")\n	{\n		global $TablasCore,$ListaCamposSinID_usuario_informe,$_SeparadorCampos_;\n		// Elimina opciones existentes\n		PCO_EjecutarSQLUnaria(\"DELETE FROM \".$TablasCore.\"usuario_informe WHERE usuario=? \",\"$usuario_destino\");\n		// Copia permisos si el usuario origen es diferente de vacio, sino lo deja sin nada\n		if ($usuario_origen!=\"\")\n			{\n				$resultado=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_usuario_informe.\" FROM \".$TablasCore.\"usuario_informe WHERE usuario=\'$usuario_origen\' \");\n				while($registro = $resultado->fetch())\n					{\n						$menuinsertar=$registro[\"informe\"];\n						PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"usuario_informe (\".$ListaCamposSinID_usuario_informe.\") VALUES (?,?)\",\"$usuario_destino$_SeparadorCampos_$menuinsertar\");\n					}\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ListadoExploracionArchivos\n	Construye una lista de los archivos contenidos en una carpeta y que coinciden con un flitro determinado\n\n	Variables de entrada:\n\n		RutaExploracion - El Path donde se desean buscar los archivos, preferible terminando en /\n		Filtro_contenido - Un texto que debe ser contenido en el nombre de archivo para poder ser presentado.  Vacio indica cualquier archivo\n\n	Salida:\n		Arreglo de elementos asociados a cada archivo encontrado\n*/\nfunction PCO_ListadoExploracionArchivos($RutaExploracion=\"\",$Filtro_contenido=\"\")\n	{\n		$PCO_ListadoArchivos=array();\n		//Si la ruta de exploracion es diferente de vacio hace el proceso de busqueda de archivos\n		if ($RutaExploracion!=\"\")\n			{\n				$ContenidoDirectorio = opendir($RutaExploracion);\n				while (($Elemento = readdir($ContenidoDirectorio)) !== false)\n					{\n						if (($Elemento != \".\") && ($Elemento != \"..\") && (stristr($Elemento,$Filtro_contenido) || $Filtro_contenido==\"\")  )\n							{\n								$TamanoElemento=round(filesize($RutaExploracion.$Elemento)/1024);\n								$TipoElemento=filetype($RutaExploracion.$Elemento);\n								$FechaElemento=date(\"d F Y H:i:s\", filemtime($RutaExploracion.$Elemento));\n								$EnlaceElemento=$RutaExploracion.$Elemento;\n								$PCO_ListadoArchivos[]=array(Ruta => $RutaExploracion, Nombre=>$Elemento, Enlace => $EnlaceElemento,Fecha => $FechaElemento, Tipo => $TipoElemento, Tamano => $TamanoElemento);\n							}\n					}\n			}\n\n		//Retorna la lista de archivos construida\n		return $PCO_ListadoArchivos;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ListadoExploracionArchivosVisual\n	Presenta una lista de los archivos contenidos en una carpeta con modificadores para las opciones\n*/\nfunction PCO_ListadoExploracionArchivosVisual($RutaExploracion=\"\",$Filtro_contenido=\"\",$TituloExploracion=\"\",$PermitirDescarga=1)\n	{\n		global $MULTILANG_TotalRegistros,$MULTILANG_Explorar,$MULTILANG_Filtro,$MULTILANG_Descargar,$MULTILANG_Tipo,$MULTILANG_Fecha,$MULTILANG_Peso;\n		//Si la ruta de exploracion es diferente de vacio hace el proceso de busqueda de archivos\n		if ($RutaExploracion!=\"\")\n			{\n				//Inicia Marco de presentacion de archivos\n				echo \'\n					<div class=\"panel panel-default\"> <!-- Clase chat-panel para altura -->\n						<div class=\"well well-sm\">\n						<span class=\"label label-primary\">\'.$TituloExploracion.\'</span> \'.$MULTILANG_Explorar.\' <b>\'.$RutaExploracion.\'</b> \'.$MULTILANG_Filtro.\' \'.$Filtro_contenido.\':\n						</div>\n						<div class=\"panel-body\">\n							<ul class=\"chat\">\';\n\n				$ConteoElementos=0;\n				$TotalTamanoElementos=0;\n\n				//Obtiene la lista de archivos\n				$ListadoArchivos=PCO_ListadoExploracionArchivos($RutaExploracion,$Filtro_contenido);\n\n				//Recorre el arreglo de archivos encontrados para presentarlo\n				$ContenidoDirectorio = opendir($RutaExploracion);\n				foreach ($ListadoArchivos as $Archivo)\n					{\n						echo \'\n						<li class=\"left clearfix\">\n							<span class=\"chat-img pull-left\">\n								<i class=\"fa fa-file-archive-o fa-2x fa-fw icon-gray\"></i>\n							</span>\n							<div class=\"chat-body clearfix\">\n								<div class=\"header\">\n									<strong class=\"primary-font\">\'.$Archivo[\"Nombre\"].\'</strong>\n									<small class=\"pull-right text-muted\">\';\n										//Si se debe presentar el boton de descarga lo agrega (por defecto), sino no lo muestra\n										if($PermitirDescarga==1)\n											echo \'\n												<a  href=\"\'.$Archivo[\"Enlace\"].\'\" class=\"btn btn-xs btn-default\"><i class=\"fa fa-download fa-fw\"></i> \'.$MULTILANG_Descargar.\'</a>\n												<br>\';\n\n										echo \'\'.$MULTILANG_Peso.\' <span class=\"badge\">\'.$Archivo[\"Tamano\"].\' Kb</span>\n									</small>\n								</div>\n								<p>\n									<i class=\"icon-gray\">&nbsp;&nbsp;&nbsp;\n									\'.$MULTILANG_Fecha.\': \'.$Archivo[\"Fecha\"].\'\n									(\'.$MULTILANG_Tipo.\' \'.$Archivo[\"Tipo\"].\')\n									</i>\n								</p>\n							</div>\n						</li>\';\n						$ConteoElementos++;\n						$TotalTamanoElementos+=$Archivo[\"Tamano\"];\n					}\n\n				//Cierra Marco de presentacion de archivos\n				echo \'\n							</ul>\n						</div> <!-- /.panel-body -->\n					<div class=\"well well-sm\">\'.$MULTILANG_TotalRegistros.\': <b>\'.$ConteoElementos.\'</b> \'.$MULTILANG_Peso.\': <b>\'.$TotalTamanoElementos.\' Kb</b></div>\n					</div> <!-- /.panel .chat-panel -->\';\n			}\n	}\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_OpcionesComboDesdeCSV\n	Genera una lista de seleccion con la variable recibida y los items separados por un caracter especifico\n*/\nfunction PCO_OpcionesComboDesdeCSV($lista_opciones,$caracter_separador,$valor_comparacion=\"\",$usar_indice=0)\n	{\n		$SalidaFormateada=\"\";\n		$campos = explode($caracter_separador, $lista_opciones);\n		for ($i=0;$i<count($campos);$i++)\n			{\n				$cadena_seleccion=\"\";\n				if ($campos[$i]==$valor_comparacion)\n				$cadena_seleccion=\" selected \";\n\n				$cadena_valor=$campos[$i];\n				//Si se indica que se debe utilizar el indice se retorna el numero de item, en lugar de su valor\n				if ($usar_indice==1)\n					$cadena_valor=$i;\n				$SalidaFormateada.= \'<option value=\"\'.$cadena_valor.\'\" \'.$cadena_seleccion.\'>\'.$campos[$i].\'</option>\';\n			}\n		return $SalidaFormateada;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_AparearCamposTabla_vs_HojaCalculo\n	Abre un archivo de hoja de cálculo y lo compara frente a los campos de una tabla de datos para ver si existen, tipos de dato, etc.\n\n	Variables de entrada:\n\n		PathArchivo - Ruta completa al archivo que se desea cargar\n		NombreTabla - Nombre de la tabla a revisar campos\n*/\nfunction PCO_AparearCamposTabla_vs_HojaCalculo($NombreTabla,$PathArchivo)\n	{\n		global $MULTILANG_Campo,$MULTILANG_Columna,$MULTILANG_Tablas,$MULTILANG_Archivo,$_SeparadorCampos_,$MULTILANG_Campo,$MULTILANG_Deshabilitado,$MULTILANG_FrmPredeterminado;\n		//Obtiene posibles variables de filtro globales\n		global $PCO_lista_campos_ignorados,$PCO_lista_campos_fijos,$PCO_lista_valores_fijos;\n		$ArregloCamposIgnorados=explode($_SeparadorCampos_,$PCO_lista_campos_ignorados);\n		$ArregloCamposFijos=explode($_SeparadorCampos_,$PCO_lista_campos_fijos);\n		$ArregloValoresFijos=explode($_SeparadorCampos_,$PCO_lista_valores_fijos);\n\n		$SalidaFormateada.=\'<table class=\"table table-condensed btn-xs table-hover table-striped table-unbordered table-responsive\" id=\"TablaArchivoCSV_Apareado\"><thead><tr>\n			<th>\'.$MULTILANG_Campo.\' (\'.$MULTILANG_Tablas.\')</th>\n			<th></th>\n			<th>\'.$MULTILANG_Columna.\' (\'.$MULTILANG_Archivo.\')</th>\n			</tr></thead><tbody>\';\n\n		//Busca las columnas definidas en el archivo\n		$ColumnasArchivo = PCO_ColumnasDesdeHojaCalculo($PathArchivo);\n		//Genera la lista en minuscula para ser pasada a los combos\n		$ListaColumnas=\"\";\n		foreach ($ColumnasArchivo as $ColumnaLista)\n			$ListaColumnas.=\"|\".strtolower($ColumnaLista);\n\n		//Busca las columnas definidas en la tabla\n		$CamposTabla=PCO_ConsultarColumnas($NombreTabla);\n\n		//Busca por cada campo de tabla algun equivalente en las columnas\n		for($i=0;$i<count($CamposTabla);$i++)\n			{\n				$SalidaFormateada.= \'<tr>\';\n					$SalidaFormateada.= \'<td>\'.$CamposTabla[$i][\"nombre\"].\'</td>\';\n					$SalidaFormateada.= \'<td><i class=\"fa fa-exchange\"></i></td>\';\n					//Genera combo de columnas de archivo preseleccionando uno si aplica\n					$OpcionesCombo=PCO_OpcionesComboDesdeCSV($ListaColumnas,\"|\",strtolower($CamposTabla[$i][\"nombre\"]),1); //Solicita el indice en lugar del valor\n\n					//Si el campo es un campo ignorado deja un combo vacio\n					if ( in_array($CamposTabla[$i][\"nombre\"],$ArregloCamposIgnorados)  )\n						$OpcionesCombo=\'<option value=\"\">\'.$MULTILANG_Campo.\' \'.strtoupper($CamposTabla[$i][\"nombre\"]).\' \'.$MULTILANG_Deshabilitado.\'</option>\';\n\n					//Si el campo es un campo de valor fijo lo indica en el combo pero como valor queda ignorado\n					if ( in_array($CamposTabla[$i][\"nombre\"],$ArregloCamposFijos)  )\n						$OpcionesCombo=\'<option value=\"\">\'.$MULTILANG_Campo.\' \'.strtoupper($CamposTabla[$i][\"nombre\"]).\' \'.$MULTILANG_FrmPredeterminado.\'=\'.$ArregloValoresFijos[array_search($CamposTabla[$i][\"nombre\"], $ArregloCamposFijos)].\'</option>\';\n\n					//Presenta combo\n					$SalidaFormateada.= \'<td><select id=\"PCO_campoimportado_\'.strtolower($CamposTabla[$i][\"nombre\"]).\'\" name=\"PCO_campoimportado_\'.strtolower($CamposTabla[$i][\"nombre\"]).\'\" class=\"btn btn-xs btn-default\">\'.$OpcionesCombo.\'</select></td>\';\n				$SalidaFormateada.= \'</tr>\';\n				//.$objPHPExcel->getActiveSheet()->getCellByColumnAndRow($Columna, $Fila)->getFormattedValue().\'</td>\';	// METODO1: getCell(\'A1\')->getFormattedValue(); METODO2: getCellByColumnAndRow(1, 2)->getFormattedValue();\n			}\n		$SalidaFormateada.= \'</tbody></table>\';\n		return $SalidaFormateada;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ColumnasDesdeHojaCalculo\n	Abre un archivo de hoja de cálculo y busca las columnas definidas en la primera fila de la primera hoja\n\n	Variables de entrada:\n\n		PathArchivo - Ruta completa al archivo que se desea analizar\n\n	Variables de salida:\n\n		ArregloColumnas - Variable con la lista de columas encontradas\n*/\nfunction PCO_ColumnasDesdeHojaCalculo($PathArchivo)\n	{\n		$ArregloColumnas=array();\n\n		//Crea el objeto para lectura del archivo\n		$XLFileType = PHPExcel_IOFactory::identify($PathArchivo);\n		$objReader = PHPExcel_IOFactory::createReader($XLFileType);\n		$objReader->setLoadSheetsOnly(0);	//Asume que la primera hoja tiene los datos.  ALTERNATIVA INDICANDO EL NOMBRE DE HOJA : $objReader->setLoadSheetsOnly(\'Hoja1\');\n		$objPHPExcel = $objReader->load($PathArchivo);\n\n		$Fila=1;\n		$MaximaColumna=0;\n\n		//Determina el numero de columna maxima y genera la primera fila como encabezados\n		while ($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($MaximaColumna, $Fila)->getFormattedValue()!=\"\")\n			{\n				$ArregloColumnas[]=$objPHPExcel->getActiveSheet()->getCellByColumnAndRow($MaximaColumna, $Fila)->getFormattedValue();\n				$MaximaColumna++;\n			}\n\n		return $ArregloColumnas;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_DatatableDesdeHojaCalculo\n	Abre un archivo de hoja de cálculo y lo presenta en formato DataTable\n\n	Variables de entrada:\n\n		PathArchivo - Ruta completa al archivo que se desea cargar\n		NroLineas - Cantidad de lineas para ser agregadas al DataTable.  Cero para ilimitado\n*/\nfunction PCO_DatatableDesdeHojaCalculo($PathArchivo,$NroLineas)\n	{\n		global $PCO_InformesDataTable,$PCO_InformesDataTablePaginaciones,$PCO_InformesDataTableTotales,$PCO_InformesDataTableFormatoTotales,$PCO_InformesDataTableExrpotaCLP,$PCO_InformesDataTableExrpotaCSV,$PCO_InformesDataTableExrpotaXLS,$PCO_InformesDataTableExrpotaPDF,$PCO_InformesDataTableDefineCOLS,$PCO_InformesDataTable_pane_activado,$PCO_InformesDataTable_pane_cascada,$PCO_InformesDataTable_pane_colapsado,$PCO_InformesDataTable_pane_columnas,$PCO_InformesDataTable_pane_subtotalesrelativos,$PCO_InformesDataTable_pane_conteos,$PCO_InformesDataTable_pane_controles,$PCO_InformesDataTable_pane_control_colapsar,$PCO_InformesDataTable_pane_control_ordenar;\n\n		@$PCO_InformesDataTable.=\"TablaArchivoCSV_Importado|\"; //Agrega la tabla a la lista de DataTables para ser convertida\n		@$PCO_InformesDataTablePaginaciones.=\"10|\";\n		@$PCO_InformesDataTableTotales.=\"|\";\n		@$PCO_InformesDataTableFormatoTotales.=\"|\";\n		$SalidaFormateada.=\'<table class=\"table table-condensed btn-xs table-hover table-striped table-unbordered table-responsive\" id=\"TablaArchivoCSV_Importado\"><thead><tr>\';\n\n		//Crea el objeto para lectura del archivo\n		$XLFileType = PHPExcel_IOFactory::identify($PathArchivo);\n		$objReader = PHPExcel_IOFactory::createReader($XLFileType);\n		$objReader->setLoadSheetsOnly(0);	//Asume que la primera hoja tiene los datos.  ALTERNATIVA INDICANDO EL NOMBRE DE HOJA : $objReader->setLoadSheetsOnly(\'Hoja1\');\n		$objPHPExcel = $objReader->load($PathArchivo);\n\n		$Fila=1;\n		$Columna=0;\n		$MaximaFila=$NroLineas;\n		$MaximaColumna=0;\n\n		//Determina el numero de columna maxima y genera la primera fila como encabezados\n		$ColumnasEncabezado=PCO_ColumnasDesdeHojaCalculo($PathArchivo);\n		foreach ($ColumnasEncabezado as $TituloColuma)\n			{\n				//$SalidaFormateada.= \'<th>COL_\'.($MaximaColumna+1).\'<br>\'.$TituloColuma.\'</th>\';\n				$SalidaFormateada.= \'<th>\'.$TituloColuma.\'</th>\';\n				$MaximaColumna++;\n			}\n\n		$SalidaFormateada.= \'</tr></thead><tbody>\';\n\n		$Fila++; //Obvia la primera fila pues ya fue usada como encabezados\n		//Recorre la hoja segun las columnas encontradas y las filas solicitadas\n		while ($Fila<=$MaximaFila)\n			{\n				//Asume que la primera columna siempre tiene dato (llave o algo minimo) para agregarla a la tabla, sino no es agregada\n				if ($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($Columna, $Fila)->getFormattedValue()!=\"\")\n					{\n						$SalidaFormateada.= \'</tr>\';\n						while ($Columna<$MaximaColumna)\n							{\n								$SalidaFormateada.= \'<td>\'.$objPHPExcel->getActiveSheet()->getCellByColumnAndRow($Columna, $Fila)->getFormattedValue().\'</td>\';	// METODO1: getCell(\'A1\')->getFormattedValue(); METODO2: getCellByColumnAndRow(1, 2)->getFormattedValue();\n								$Columna++;\n							}\n						$SalidaFormateada.= \'</tr>\';\n						$Columna=0;\n					}\n				$Fila++;\n			}\n		$SalidaFormateada.= \'</tbody></table>\';\n		return $SalidaFormateada;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_PermisoHeredadoAccion\n	Busca dentro de los permisos del usuario la accion a ejecutar cuando no se encuentra directamente como una opcion del usuario sino como una subrutina de otra de la que si tiene agregada de manera que valida si puede ingresar o no a ella.\n\n	Variables de entrada:\n\n		accion - Accion a ser ejectudada, de la que se desea buscar permiso heredado por otra\n\n	Salida:\n		Retorna 1 en caso de encontrar el permiso\n		Retorna 0 cuando no se encuentra un permiso\n*/\nfunction PCO_PermisoHeredadoAccion($PCO_Accion)\n	{\n		global $PCOSESS_LoginUsuario,$TablasCore;\n		// Variable que determina el estado de aceptacion o rechazo del permiso 0=no permiso 1=ok permiso\n		$retorno=0;\n\n		// Verifica mapeo de permisos para acciones que llaman a otras, heredadas.  Valores en = 1  son funciones publicas:\n		// FUNCION_solicitada_por_el_usuario				FUNCION_madre_de_entrada_a_funcion_solicitada\n		if ($PCO_Accion== \"PCO_MisInformes\")					$retorno = 1;\n		if ($PCO_Accion== \"PCO_GuardarInforme\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EditarInforme\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_ClonarDisenoInforme\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_DefinirCopiaInformes\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EliminarInforme\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EliminarInformeTabla\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_GuardarInformeTabla\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EliminarInformeCampo\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_GuardarInformeCampo\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_GuardarInformeCondicion\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EliminarInformeCondicion\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_ActualizarGraficoInforme\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_ActualizarAgrupamientoInforme\")	$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_GuardarAccionInforme\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_EliminarRegistroInforme\")		$retorno = 1;\n		if ($PCO_Accion== \"PCO_EliminarAccionInforme\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_ExportarInforme\")				$retorno = 1;\n		if ($PCO_Accion== \"PCO_ImportarInforme\")				$retorno = 1;\n		if ($PCO_Accion== \"PCO_AnalizarImportacionInforme\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n		if ($PCO_Accion== \"PCO_ConfirmarImportacionInforme\")	$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarInformes\");\n\n		// Funciones en core/usuarios.php\n		if ($PCO_Accion== \"PCO_CambiarContrasena\")				$retorno = 1;\n		if ($PCO_Accion== \"PCO_ActualizarPerfilUsuario\")		$retorno = 1;\n		if ($PCO_Accion== \"PCO_GuardarPerfilUsuario\")			$retorno = 1;\n		if ($PCO_Accion== \"PCO_ActualizarContrasena\")			$retorno = PCO_PermisoHeredadoAccion(\"PCO_CambiarContrasena\");\n/*\n		if ($PCO_Accion== \"PCO_ResetearContrasena\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_AgregarUsuario\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_GuardarUsuario\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_EliminarUsuario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_CambiarEstadoUsuario\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_PermisosUsuario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_AgregarPermiso\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_EliminarPermiso\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_InformesUsuario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_AgregarInformeUsuario\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_EliminarInformeUsuario\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_CopiarPermisos\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n		if ($PCO_Accion== \"PCO_CopiarInformes\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_ListarUsuarios\");\n*/\n		if ($PCO_Accion== \"PCO_AgregarUsuarioAutoregistro\")		$retorno = 1;\n		if ($PCO_Accion== \"PCO_GuardarUsuarioAutoregistro\")		$retorno = 1;\n\n		// Funciones en core/menus.php\n		if ($PCO_Accion== \"PCO_VerMenu\")						$retorno = 1;\n		if ($PCO_Accion== \"PCO_ReportarBugs\")					$retorno = 1;\n		if ($PCO_Accion== \"PCO_BuscarPermisosPractico\")			$retorno = 1;\n		if ($PCO_Accion== \"PCO_EliminarMenu\")					$retorno = PCO_PermisoAgregadoAccion(\"PCOFUNC_AdministrarMenu\");\n		// Funciones en core/tablas.php\n		if ($PCO_Accion== \"PCO_AsistenteTablas\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_GuardarCrearTablaAsistente\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_EditarTabla\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_EliminarTabla\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_EliminarCampoTabla\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_GuardarCrearCampo\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_GuardarCrearTabla\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_DefinirCopiaTablas\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_CopiarTabla\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_ImportarTabla\")					$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_ConfirmarImportacionTabla\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_AnalizarImportacionCSV\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_EscogerTablaImportacionCSV\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n		if ($PCO_Accion== \"PCO_EjecutarImportacionCSV\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarTablas\");\n\n		// Funciones en core/formularios.php\n		if ($PCO_Accion== \"PCO_GuardarDatosFormulario\")			$retorno = 1;\n		if ($PCO_Accion== \"PCO_EliminarDatosFormulario\")		$retorno = 1;\n		if ($PCO_Accion== \"PCO_ActualizarDatosFormulario\")		$retorno = 1;\n		if ($PCO_Accion== \"PCO_EjecutarPostAccionForm\")			$retorno = 1;\n		if ($PCO_Accion== \"PCO_ActualizarJavaEvento\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_EditarEventoObjeto\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_EliminarEventoObjeto\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_ActualizarFormulario\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_CopiarFormulario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_DefinirCopiaFormularios\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_ActualizarCampoFormulario\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_GuardarFormulario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_EliminarFormulario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_EditarFormulario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_GuardarCampoFormulario\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_EditarFormulario\");\n		if ($PCO_Accion== \"PCO_EliminarCampoFormulario\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_EditarFormulario\");\n		if ($PCO_Accion== \"PCO_GuardarAccionFormulario\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_EditarFormulario\");\n		if ($PCO_Accion== \"PCO_EliminarAccionFormulario\")		$retorno = PCO_PermisoAgregadoAccion(\"PCO_EditarFormulario\");\n		if ($PCO_Accion== \"PCO_ConfirmarImportacionFormulario\")	$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_AnalizarImportacionFormulario\")	$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_ImportarFormulario\")				$retorno = PCO_PermisoAgregadoAccion(\"PCO_AdministrarFormularios\");\n		if ($PCO_Accion== \"PCO_DesplazarObjetosForm\")			$retorno = PCO_PermisoAgregadoAccion(\"PCO_EditarFormulario\");\n\n		// Funciones en core/sesion.php\n		if ($PCO_Accion== \"Iniciar_login\")						$retorno = 1;\n		if ($PCO_Accion== \"Terminar_sesion\")					$retorno = 1;\n		if ($PCO_Accion== \"Mensaje_cierre_sesion\")				$retorno = 1;\n		// Funciones en core/objetos.php\n		if ($PCO_Accion== \"PCO_CargarObjeto\")					$retorno = 1;\n		if ($PCO_Accion== \"cargar_objeto\")						$retorno = 1; //Eliminar despues de version 18.9\n		// Funciones en core/actualizacion.php\n		if ($PCO_Accion== \"cargar_archivo\")						$retorno = PCO_PermisoAgregadoAccion(\"actualizar_practico\");\n		if ($PCO_Accion== \"analizar_parche\")					$retorno = PCO_PermisoAgregadoAccion(\"actualizar_practico\");\n		if ($PCO_Accion== \"aplicar_parche\")						$retorno = PCO_PermisoAgregadoAccion(\"actualizar_practico\");\n		// Funciones en core/ajax.php\n		if ($PCO_Accion== \"opciones_combo_box\")					$retorno = 1;\n		if ($PCO_Accion== \"valor_campo_tabla\")					$retorno = 1;\n		if ($PCO_Accion== \"PCO_ObtenerOpcionesAjaxSelect\")		$retorno = 1;\n\n		// Funciones en core/kanban.php\n		if ($PCO_Accion==\"PCO_ExplorarTablerosKanban\")		  $retorno = 1;\n		if ($PCO_Accion==\"PCO_ExplorarTablerosGantt\")		   $retorno = 1;\n		if ($PCO_Accion==\"EliminarTableroKanban\")			   $retorno = 1; //PCO_PermisoAgregadoAccion(\"PCO_ExplorarTablerosKanban\")\n		if ($PCO_Accion==\"GuardarCreacionKanban\")			   $retorno = 1;\n		if ($PCO_Accion==\"VerTareasArchivadas\")				 $retorno = 1;\n		if ($PCO_Accion==\"ArchivarTareaKanban\")				 $retorno = 1;\n		if ($PCO_Accion==\"GuardarTareaKanban\")				  $retorno = 1;\n		if ($PCO_Accion==\"EliminarTareaKanban\")				 $retorno = 1;\n		if ($PCO_Accion==\"GuardarPersonalizacionKanban\")		$retorno = 1;\n		if ($PCO_Accion==\"PCO_ExplorarTablerosKanbanResumido\")  $retorno = 1;\n\n		if (PCO_EsAdministrador($PCOSESS_LoginUsuario))\n			{\n				if ($PCO_Accion==\"PCO_LimpiarCacheSQL\")  $retorno = 1;\n			}\n\n		//VALIDA OTRAS ACCOIONES ESPECIALES\n\n		//Verifica cambios de estado en tableros kanban de usuarios razo\n		if ($PCO_Accion==\"cambiar_estado_campo\")\n			{\n				//Valida si el usuario tiene  al menos un kanban, si la accion es sobre la tabla de kanban\n				$RegistroTableros=PCO_EjecutarSQL(\"SELECT id FROM \".$TablasCore.\"kanban WHERE archivado<>1 AND categoria=\'[PRACTICO][ColumnasTablero]\' AND (login_admintablero=\'$PCOSESS_LoginUsuario\' OR compartido_rw LIKE \'%|$PCOSESS_LoginUsuario|%\') LIMIT 0,1 \")->fetch();\n				if ($RegistroTableros[\"id\"]!=\"\" && $tabla=\"kanban\")\n					$retorno = 1;\n			}\n\n		//echo $PCOSESS_LoginUsuario.\':Permiso heredado accion=\'.$PCO_Accion.\':\'.$retorno.\'<br>\'; //Activar para depuracion permisos\n		return $retorno;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_RestaurarEtiquetasHTML\n	Determina si hay etiquetas sin cerrar o abrir en un arbol de elementos HTML y las genera.\n*/\nfunction PCO_RestaurarEtiquetasHTML($input)\n	{\n		$opened = array();\n		$closed = array();\n		//loop through opened and closed tags in order\n		if(preg_match_all(\"/<(\\/?[a-z]+)>?/i\", $input, $matches))\n			{\n				foreach($matches[1] as $tag)\n					{\n						if(preg_match(\"/^[a-z]+$/i\", $tag, $regs))\n							{\n								// a tag has been opened\n								if(strtolower($regs[0]) != \'br\')\n									$opened[] = $regs[0];\n							}\n						elseif(preg_match(\"/^\\/([a-z]+)$/i\", $tag, $regs) && in_array($regs[1],$opened))\n							{\n								// a tag has been closed\n								unset($opened[array_pop(array_keys($opened, $regs[1]))]);\n							}\n						else\n							if(preg_match(\"/^\\/([a-z]+)$/i\", $tag, $regs) && !in_array($regs[1],$opened))\n								{\n									//a Tag that has been closed but not open\n									$closed[]=\"<\".$regs[1].\">\";\n								}\n					}\n			}\n\n		// close tags that are still open\n		if($opened)\n			{\n				$tagstoclose = array_reverse($opened);\n				foreach($tagstoclose as $tag)\n					$input .= \"\";\n			}\n		$input1=\'\';\n\n		// open tags that are still close\n		if($closed)\n			{\n				$tagstoopen = array_reverse($closed);\n				foreach($tagstoopen as $tag)\n					$input1 .= $tag;\n			}\n\n		return $input1.\'\'.$input;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_PermisoAgregadoAccion\n	Busca dentro de los permisos agregados de manera explicita al usuario.\n\n	Variables de entrada:\n\n		accion - Accion a ser ejectudada\n		estado_aceptacion - Si el usuario cuenta o no con el permiso solicitado\n\n	Salida:\n		Retorna 1 en caso de encontrar el permiso\n		Retorna 0 cuando no se encuentra un permiso\n*/\nfunction PCO_PermisoAgregadoAccion($PCO_Accion)\n	{\n		// Variable que determina el estado de aceptacion o rechazo del permiso 0=no permiso 1=ok permiso\n		$retorno=0;\n		global $ConexionPDO,$TablasCore,$PCOSESS_LoginUsuario;\n\n		$consulta = $ConexionPDO->prepare(\"SELECT \".$TablasCore.\"menu.id FROM \".$TablasCore.\"usuario_menu,\".$TablasCore.\"menu WHERE \".$TablasCore.\"menu.id=\".$TablasCore.\"usuario_menu.menu AND usuario=\'$PCOSESS_LoginUsuario\' AND \".$TablasCore.\"menu.comando=\'$PCO_Accion\' \");\n		$consulta->execute();\n		$registro = $consulta->fetch();\n		if ($registro[0]!=\"\")\n			{\n				$retorno=1;\n			}\n		//echo $PCOSESS_LoginUsuario.\':Permiso agregado accion=\'.$PCO_Accion.\':\'.$retorno.\'<br>\'; //Activar para depuracion permisos\n		return $retorno;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ConvertirRegistroXML\n	Traduce un registro de base de datos a notacion XML y retorna su cadena equivalente\n\n	Ver tambien:\n		<PCO_CopiarFormulario> | <copiar_informe>\n*/\nfunction PCO_ConvertirRegistroXML($Registro_BD,$ListaCampos,$CodificarBase64=1)\n	{\n		//Inicializa la variable de retorno\n		$Contenido_XML=\"\";\n		// Busca datos y genera XML de cada registro\n		$Elementos_tabla=explode(\",\",$ListaCampos);\n\n		foreach ($Elementos_tabla as $ElementoExportar)\n			{\n				$EtiquetaAperturaXML=\"<$ElementoExportar>\";\n				$EtiquetaCierreXML=\"</$ElementoExportar>\";\n				$ValorEtiqueta=$Registro_BD[$ElementoExportar];\n				if ($CodificarBase64==1)\n					$ValorEtiqueta=base64_encode($ValorEtiqueta);\n				$Contenido_XML .= \"\n	\".$EtiquetaAperturaXML.$ValorEtiqueta.$EtiquetaCierreXML;\n			}\n\n		//Retorna la cadena equivalente\n		return $Contenido_XML;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_PermisoAccion\n	Busca dentro de los permisos del usuario la accion a ejecutar de manera que valida si puede ingresar o no a ella.\n\n	Variables de entrada:\n\n		accion - Accion a ser ejectudada\n\n	Salida:\n		Retorna 1 en caso de encontrar el permiso\n		Retorna 0 cuando no se encuentra un permiso\n*/\nfunction PCO_PermisoAccion($PCO_Accion)\n	{\n		global $PCOSESS_LoginUsuario,$TablasCore;\n		// Variable que determina el estado de aceptacion o rechazo del permiso 0=no permiso 1=ok permiso\n		$retorno=0;\n\n		// Evalua inicialmente permisos para el admin (evita queries)\n		if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario)) $retorno=1;\n\n		// Si es un usuario estandar siempre entra, si es el admin entra si no es permiso raiz\n		if (!$retorno)\n			{\n				// Busca permisos agregados directamente al usuario\n				$retorno=PCO_PermisoAgregadoAccion($PCO_Accion);\n				// Si no encuentra permisos directos, busca en los heredados de los directos\n				if (!$retorno)\n					{\n						// Si no encuentra el permiso directo llama los heredados\n						$retorno=PCO_PermisoHeredadoAccion($PCO_Accion);\n					}\n				//Si no encuentra en los heredados busca en preautorizados por configuracion\n				if (!$retorno)\n					{\n						$resultado=PCO_EjecutarSQL(\"SELECT id from \".$TablasCore.\"parametros WHERE funciones_personalizadas LIKE \'%$PCO_Accion%\' \");\n						$parametros = $resultado->fetch();\n						//Si encuentra un registro con la accion preautorizada entonces autoriza al usuario\n						if ($parametros[\"id\"]!=\"\")\n							$retorno=1;\n					}\n			}\n\n		//echo $PCOSESS_LoginUsuario.\':Permiso accion=\'.$PCO_Accion.\':\'.$retorno.\'<br>\'; //Activar para depuracion permisos\n		return $retorno;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EscaparContenido\n	Limpia cadenas y URLs a ser impresas para evitar posibles ataques por XSS\n	En general, se debe limpiar cualquier variable enviada por el usuario y que vaya a ser impresa en su navegador para evitar que al imprimirla se puedan enviar javascripts o similares\n\n	Variables de entrada:\n\n		texto - URL, texto, variable de entrada o cualquier otro valor a escapar.\n\n	Salida:\n		Cadena filtrada\n*/\nfunction PCO_EscaparContenido($texto)\n	{\n		//$texto = preg_replace(\'|[^a-z0-9-~+_.?#=!&;,/:%@$\\|*\\\'()\\\\x80-\\\\xff]|i\', \'\', $texto); // Muy estricto\n		$texto = str_ireplace(\"script\",\"\",$texto);\n\n		return $texto;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: gzdecode\n	Crea una funcion de descompresion en caso de no estar disponible en la instalacion de PHP actual\n*/\nif (!function_exists(\'gzdecode\'))\n	{\n		function gzdecode($cadena)\n			{\n				return gzinflate(substr($cadena,10,-8));\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_LimpiarEntradas\n	Limpia cadenas y URLs a ser impresas segun acciones para evitar XSS\n\n	Salida:\n		Cadenas y variables filtradas sobre sus valores globales\n*/\nfunction PCO_LimpiarEntradas()\n	{\n		global $PCO_Accion,$PCO_ErrorTitulo,$PCO_ErrorDescripcion;\n		// Escapar siempre las acciones pues deberian tener solo letras, numeros y underlines.\n		$PCO_Accion=PCO_EscaparContenido($PCO_Accion);\n		$PCO_Accion = preg_replace(\"/[^A-Za-z0-9_]/\", \"\", $PCO_Accion);\n\n		// Escapa siempre los mensajes de error\n		$PCO_ErrorTitulo=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorTitulo));\n		$PCO_ErrorTitulo = preg_replace(\"/[^A-Za-z0-9_ ><]/\", \"\", $PCO_ErrorTitulo);\n		$PCO_ErrorDescripcion=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorDescripcion));\n		$PCO_ErrorDescripcion = preg_replace(\"/[^A-Za-z0-9_ ><]/\", \"\", $PCO_ErrorDescripcion);\n\n		// Escapa otras variables de uso comun\n		global $PCO_ErrorTitulo,$PCO_ErrorDescripcion;\n		$PCO_ErrorTitulo=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorTitulo));\n		$PCO_ErrorDescripcion=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorDescripcion));\n\n		// Escapar algunas variables segun la accion recibida\n\n		if ($PCO_Accion==\"PCO_AdministrarFormularios\")\n			{\n				global $PCO_ErrorDescripcion,$PCO_ErrorTitulo;\n				$PCO_ErrorDescripcion=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorDescripcion));\n				$PCO_ErrorTitulo=PCO_EscaparContenido(PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorTitulo));\n			}\n\n		if ($PCO_Accion==\"actualizar_menu\")\n			{\n				global $id;\n				$id=PCO_EscaparContenido($id);\n			}\n\n		if ($PCO_Accion==\"detalles_menu\")\n			{\n				global $id;\n				$id=PCO_EscaparContenido($id);\n			}\n\n		if ($PCO_Accion==\"PCO_EditarInforme\")\n			{\n				//\n				global $informe;\n				$informe=PCO_EscaparContenido($informe);\n			}\n\n		if ($PCO_Accion==\"PCO_ListarUsuarios\")\n			{\n				global $login_filtro,$nombre_filtro;\n				$login_filtro=PCO_EscaparContenido($login_filtro);\n				$nombre_filtro=PCO_EscaparContenido($nombre_filtro);\n			}\n\n		if ($PCO_Accion==\"PCO_CargarObjeto\")\n			{\n				global $PCO_Objeto;\n				$PCO_Objeto=PCO_EscaparContenido($PCO_Objeto);\n			}\n\n		if ($PCO_Accion==\"PCO_GuardarFormulario\")\n			{\n				global $tabla_datos;\n				$tabla_datos=PCO_EscaparContenido($tabla_datos); // Revisar si afecta el script de autorun\n			}\n\n		if ($PCO_Accion==\"Iniciar_login\")\n			{\n				global $uid,$clave,$captcha;\n				$uid=PCO_EscaparContenido($uid);\n				$clave=PCO_EscaparContenido($clave);\n				$captcha=PCO_EscaparContenido($captcha);\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_TextoAleatorio\n	Genera un texto alfanumerico aleatorio de una longitud determinada\n\n	Variables de entrada:\n\n		longitud - Numero de caracteres que deben ser retornados en la cadena\n\n	Salida:\n		Cadena aleatoria\n*/\nfunction PCO_TextoAleatorio($longitud)\n	{\n		$plantilla = \"23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n		$clave=\"\";\n		for($i=0;$i<$longitud;$i++)\n			$clave .= $plantilla{rand(0,strlen($plantilla)-1)};\n		return $clave;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CodigoQR\n	Genera un codigo QR a partir de los parametros recibidos\n\n	Variables de entrada:\n\n		contenido - Texto que debera ser representado en el codigo QR\n		recuperacion_errores - Recuperacion de errores para el codigo (L,M,Q,H) L el mas bajo, H el mas alto\n		ancho_pixeles - Tamano de cada cuadro del codigo en pixeles\n		margen_pixeles - La margen externa del codigo QR\n		ruta_almacenamiento - Path sobre el cual se almacenara el codigo, debe contar con permisos de escritura\n		archivo - nombre de archivo (sin extension) sobre el cual sera guardado el codigo\n\n	Salida:\n		Imagen generada para el codigo QR\n*/\nfunction PCO_CodigoQR($contenido,$recuperacion_errores=\"L\",$ancho_pixeles=3,$margen_pixeles=1,$ruta_almacenamiento=\"tmp/\",$archivo=\"\")\n	{\n		include_once(\"inc/qrcode/qrcode.php\");\n		//Si no se recibe un archivo entonces genera uno aleatorio\n		if ($archivo==\"\") $archivo=\"QR\".PCO_TextoAleatorio(15);\n		//Genera el archivo con el QR\n		$Ruta_QRC=$ruta_almacenamiento.$archivo.\".png\";\n		QRcode::png($contenido, $Ruta_QRC, $recuperacion_errores, $ancho_pixeles, $margen_pixeles);\n		//Devuelve el codigo QR como etiqueta de imagen HTML\n		return \'<img src=\"\'.$Ruta_QRC.\'\" alt=\"\" border=\"0\">\';\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_FiltrarCadenaSQL\n	Filtra los caracteres existentes en una cadena de manera que no permita comillas sencillas, backslash o cualquier otro caracter que genere problemas en las consultas o posibles fallos de seguridad derivados de un SQLInjection\n\n	Variables de entrada:\n\n		cadena - Cadena a filtrar\n\n	Salida:\n		Retorna cadena sin caracteres ilegales o posibles inyecciones\n\n		\' or \"=\'\n		\'\' or 1=1 -- and \'\'=\'\'\n		admin\' --\n		admin\' #\n		admin\'/*\n		\' or 1=1--\n		\' or 1=1#\n		\' or 1=1/*\n		\') or \'1\'=\'1--\n		\') or (\'1\'=\'1--\n		1\' and \'\'=\'\n		\' OR \'A\'=\'A\n		$username = 1\' or \'1\' = \'1\n\n\n\n\n\n*/\nfunction PCO_FiltrarCadenaSQL($cadena)\n	{\n		global $PCO_Accion;\n\n		if ($PCO_Accion==\"Iniciar_login\")\n			{\n				$cadena = str_ireplace(\"\'\'\",\"\'\",$cadena);\n				$cadena = str_ireplace(\"\\\\\",\"\",$cadena);\n				$cadena = str_ireplace(\"COPY \",\"\",$cadena);\n				$cadena = str_ireplace(\"DELETE \",\"\",$cadena);\n				$cadena = str_ireplace(\"DROP \",\"\",$cadena);\n				$cadena = str_ireplace(\"DUMP \",\"\",$cadena);\n				$cadena = str_ireplace(\" OR \",\"\",$cadena);\n				$cadena = str_ireplace(\"%\",\"\",$cadena);\n				$cadena = str_ireplace(\" LIKE \",\"\",$cadena);\n				$cadena = str_ireplace(\"--\",\"\",$cadena);\n				$cadena = str_ireplace(\"^\",\"\",$cadena);\n				$cadena = str_ireplace(\"[\",\"\",$cadena);\n				$cadena = str_ireplace(\"]\",\"\",$cadena);\n				$cadena = str_ireplace(\"!\",\"\",$cadena);\n				$cadena = str_ireplace(\"¡\",\"\",$cadena);\n				$cadena = str_ireplace(\"?\",\"\",$cadena);\n				$cadena = str_ireplace(\"&\",\"\",$cadena);\n			}\n\n		// Expresiones que siempre deben ser filtradas\n		$cadena = str_ireplace(\"BENCHMARK\",\"\",$cadena);\n\n		/*\n		array_walk($_POST, \'PCO_FiltrarCadenaSQL\');\n		array_walk($_GET, \'PCO_FiltrarCadenaSQL\');\n		//$cadena = str_ireplace(\"SELECT\",\"\",$cadena);\n		//$cadena = str_ireplace(\"=\",\"\",$cadena);\n		*/\n		return $cadena;\n	}\n\n\n/* ##################################################################\n   ##################################################################\n	Function: PCO_CompletarParametros\n	reemplaza los parametros, solo se usa para depuracion\n\n	Variables de entrada:\n\n		string -\n		data -\n\n	Salida:\n		Retorna la cadena de consulta con valores formateada para impresion\n*/\nfunction PCO_CompletarParametros($Cadena,$data)\n	{\n		$indexed=$data==array_values($data);\n		foreach($data as $k=>$v) {\n			if(is_string($v))\n		  if($v ==\'\')\n		$v=\"NULL\";\n		  else\n			$v=\"\'$v\'\";\n			if($indexed)\n			  if($v ==\'\')\n		$Cadena=preg_replace(\'/\\?/\',\'NULL\',$Cadena,1);\n		  else\n		$Cadena=preg_replace(\'/\\?/\',$v,$Cadena,1);\n			else\n			  if($v ==\'\')\n		$Cadena=str_replace(\":$k\",\"NULL\",$Cadena);\n		  else\n			$Cadena=str_replace(\":$k\",$v,$Cadena);\n		}\n		return $Cadena;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ObtenerUltimoIDInsertado\n	Segun el motor, obtiene el ultimo ID de registro insertado en la conexion especificada\n\n	Variables de entrada:\n\n		ConexionBD - Determina si la consulta debe ser ejecutada en otra conexion o motor.  Se hace obligatorio enviar parametros cuando se envia otra conexion\n\n	Salida:\n		Retorna valor de ID de registro o vacio si no se encuentra alguno\n*/\nfunction PCO_ObtenerUltimoIDInsertado($ConexionBD=\"\")\n	{\n		global $MotorBD,$ConexionPDO;\n		if ($ConexionBD==\"\")  $ConexionBD=$ConexionPDO;\n		$id_ultimo_registro_insertado=\"\";\n\n		if ($MotorBD==\"mysql\")\n			{\n				$id_ultimo_registro_insertado=$ConexionBD->lastInsertId();\n			}\n		//Si el motor no soporta adecuadamente el lastInsertId() hace funcion manual\n		if ($MotorBD==\"dblib_mssql\")\n			{\n				$registro_ultimo_id=PCO_EjecutarSQL(\"SELECT SCOPE_IDENTITY()\",\"\",$ConexionBD,1)->fetch();\n				$id_ultimo_registro_insertado=$registro_ultimo_id[0];\n			}\n		if ($MotorBD==\"oracle\")\n			{\n				$registro_ultimo_id=PCO_EjecutarSQL(\"SELECT SEQNAME.CURRVAL FROM DUAL;\",\"\",$ConexionBD,1)->fetch();\n				$id_ultimo_registro_insertado=$registro_ultimo_id[0];\n			}\n		if ($MotorBD==\"pgsql\")\n			{\n				$registro_ultimo_id=PCO_EjecutarSQL(\"SELECT lastval();\",\"\",$ConexionBD,1)->fetch();\n				$id_ultimo_registro_insertado=$registro_ultimo_id[0];\n			}\n\n		return $id_ultimo_registro_insertado;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EjecutarSQL\n	Ejecuta consultas que retornan registros (SELECTs).\n\n	Variables de entrada:\n\n		query - Consulta preformateada para ser ejecutada en el motor\n		lista_parametros - Lista de variables PHP con parametros que deben ser preparados para el query separados por $_SeparadorCampos_\n		ConexionBD - Determina si la consulta debe ser ejecutada en otra conexion o motor.  Se hace obligatorio enviar parametros cuando se envia otra conexion\n\n	Salida:\n		Retorna mensaje en pantalla con la descripcion devuelta por el driver en caso de error\n		Retorna una variable con el arreglo de resultados en caso de ser exitosa la consulta\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function ejecutar_sql($query,$lista_parametros=\"\",$ConexionBD=\"\",$ReplicaRecursiva=1,$EvitarLogSQL=0)\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework ejecutar_sql().  En su lugar utilice PCO_EjecutarSQL() \"; }\nfunction PCO_EjecutarSQL($query,$lista_parametros=\"\",$ConexionBD=\"\",$EvitarLogSQL=0)\n	{\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionBD==\"\")\n			global $ConexionPDO;\n		else\n			$ConexionPDO=$ConexionBD;\n\n		global $ModoDepuracion;\n		global $MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Detalles,$MULTILANG_ErrorSoloAdmin,$MULTILANG_Archivo;\n		global $PCO_Accion;\n		global $PCOSESS_LoginUsuario,$_SeparadorCampos_,$DepuracionSQL;\n\n		// Filtra la cadena antes de ser ejecutada\n		$query=PCO_FiltrarCadenaSQL($query);\n\n		try\n			{\n				$consulta = $ConexionPDO->prepare($query);\n				//Cuando se reciben parametros entonces se asume recepcion de querys con  interrogaciones  ?\n				//que deben ser preparados antes de ejecutarse con cada uno de los parametros recibidos\n				if ($lista_parametros!=\"\")\n					{\n						$cantidad_parametros=substr_count($query,\'?\');\n						$parametros=@explode($_SeparadorCampos_,$lista_parametros);\n						// if ($cantidad_parametros!=count($parametros)) //La cantidad de parametros en query es diferente a los recibidos\n						//Recorre cada parametro y toma su valor\n						for ($i=1;$i<=$cantidad_parametros;$i++)\n							{\n								/*\n								//Si no recibe valor en el parametro hace el bind con vacio para al menos hacerlo valido\n								if($parametros[$i-1] == \"\")\n									$consulta->bindValue($i,\'\');  // $consulta->bindValue($i,PDO::PARAM_NULL);\n								else\n								*/\n									$consulta->bindValue($i, $parametros[$i-1]);\n								//echo \'Parametro \'.$i.\'=\'.$parametros[$i-1].\"<br>\"; //PARA DEPURACION\n							}\n					}\n				$consulta->execute();\n\n				//Lleva el log a auditoria en caso de estar encendido\n				if ($EvitarLogSQL==0)\n					if ($DepuracionSQL==1)\n						PCO_Auditar($query,\"SQLog:$PCOSESS_LoginUsuario\");\n\n				return $consulta;\n				//return $consulta->fetchAll();\n			}\n		catch( PDOException $ErrorPDO)\n			{\n				//Lleva el log de errores\n				PCO_Auditar($query,\"SQLog:error\");\n				$mensaje_final=\'\';\n				$detalles_conexion=\' (CNX=\'.$ConexionPDO->getAttribute(PDO::ATTR_CONNECTION_STATUS).\') \';\n				//Muestra detalles del query solo al admin y si el modo de depuracion se encuentra activo\n				if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario))\n					$mensaje_final.=$ErrorPDO->getMessage().\'<br><b>\'.$MULTILANG_Detalles.\'</b>: \'.@PCO_CompletarParametros($query,$parametros).$detalles_conexion.\"<br><b>$MULTILANG_Archivo</b>: \".$ErrorPDO->getFile().\" -> \".$ErrorPDO->getLine();\n				else\n					$mensaje_final.=\'<b>\'.$MULTILANG_Detalles.\'</b>: \'.$detalles_conexion.$MULTILANG_ErrorSoloAdmin;\n\n				//Presenta el mensaje sobre el HTML y como Emergente JS\n				PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$mensaje_final, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n				echo \'<script type=\"\" language=\"JavaScript\"> alert(\"\'.$MULTILANG_ErrorTiempoEjecucion.\'\\\\n\\\\n\'.$mensaje_final.\'\");</script>\';\n				//Redirecciona segun la accion\n				if ($PCO_Accion==\"Iniciar_login\")\n					echo \'<form name=\"Acceso\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\"><input type=\"Hidden\" name=\"PCO_Accion\" value=\"\"></form><script type=\"\" language=\"JavaScript\">	document.Acceso.submit();  </script>\';\n				return 1;\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EjecutarNoSQL\n	Ejecuta consultas hacia motores NoSQL\n\n	Variables de entrada:\n\n		ConexionNoSQL - Variable de conexion previamente creada\n		LlaveRegistro - Consulta preformateada para ser ejecutada en el motor\n\n	Salida:\n		Retorna mensaje en pantalla con la descripcion devuelta por el driver en caso de error\n		Retorna una variable con el arreglo de resultados en caso de ser exitosa la consulta\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function ejecutar_nosql($ConexionNoSQL,$LlaveRegistro=\"\")\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework ejecutar_nosql().  En su lugar utilice PCO_EjecutarNoSQL() \"; }\nfunction PCO_EjecutarNoSQL($ConexionNoSQL,$LlaveRegistro=\"\")\n	{\n		global $ModoDepuracion;\n		global $MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Detalles,$MULTILANG_ErrorSoloAdmin;\n		global $PCO_Accion;\n		global $PCOSESS_LoginUsuario;\n		try\n			{\n				if ($ConexionNoSQL[TipoMotor]==\"couchbase\")\n					{\n						//Si la llave de registro para consulta unica fue entregada hace la operacion\n						if ($LlaveRegistro!=\"\")\n							$ResultadosNoSQL = $ConexionNoSQL[Enlace]->get($LlaveRegistro);\n					}\n				return $ResultadosNoSQL;\n			}\n		catch( Exception $CODError)\n			{\n				//Muestra detalles del query solo al admin y si el modo de depuracion se encuentra activo\n				if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario))\n					$mensaje_final=$CODError->getMessage().\'<br><b>\'.$MULTILANG_Detalles.\'</b>: \';\n				else\n					$mensaje_final=\'<b>\'.$MULTILANG_Detalles.\'</b>: \'.$MULTILANG_ErrorSoloAdmin;\n				//Presenta el mensaje sobre el HTML y como Emergente JS\n				PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$mensaje_final, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n				echo \'<script type=\"\" language=\"JavaScript\"> alert(\"\'.$MULTILANG_ErrorTiempoEjecucion.\'\\\\n\\\\n\'.$mensaje_final.\'\");</script>\';\n				//Redirecciona segun la accion\n				if ($PCO_Accion==\"Iniciar_login\")\n					echo \'<form name=\"Acceso\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\"><input type=\"Hidden\" name=\"PCO_Accion\" value=\"\"></form><script type=\"\" language=\"JavaScript\">	document.Acceso.submit();  </script>\';\n				return 1;\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_EjecutarSQLUnaria\n	Ejecuta consultas que no retornan registros tales como CREATE, INSERT, DELETE, UPDATE entre otros.\n\n	Variables de entrada:\n\n		query - Consulta preformateada para ser ejecutada en el motor\n		param - Lista de parametros que deben ser preparados para el query separados por coma\n		ConexionBD - Determina si la consulta debe ser ejecutada en otra conexion o motor.  Se hace obligatorio enviar parametros cuando se envia otra conexion\n		ReplicaRecursiva - Indica si se deben buscar o no conexiones adicionales para realizar replica de oepraciones.  Normalmente inicia en 1, pero las llamadas sucesivas se hacen en 0 para evitar llamadas infinitas\n\n	Salida:\n		Retorna una cadena que contiene una descripcion de error PDO en caso de error y agrega un mensaje en pantalla con la descripcion devuelta por el driver\n		Retorna una cadena vacia si la consulta es ejecutada sin problemas.\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function ejecutar_sql_unaria($query,$lista_parametros=\"\",$ConexionBD=\"\",$ReplicaRecursiva=1,$EvitarLogSQL=0)\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework ejecutar_sql_unaria().  En su lugar utilice PCO_EjecutarSQLUnaria() \"; }\nfunction PCO_EjecutarSQLUnaria($query,$lista_parametros=\"\",$ConexionBD=\"\",$ReplicaRecursiva=1,$EvitarLogSQL=0)\n	{\n		global $ListaCamposSinID_replicasbd,$TablasCore,$DepuracionSQL;\n		//Si aplica la replica recursiva entonces busca las conexiones\n		if ($ReplicaRecursiva==1)\n			{\n				//Busca conexiones configuradas como replica\n				$ConexionesReplica=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_replicasbd.\" FROM \".$TablasCore.\"replicasbd WHERE tipo_replica=1 \");\n				//Recorre cada conexion de replica encontrada para realizar la operacion\n				while ($registro_conexion = $ConexionesReplica->fetch())\n					{\n						global ${$registro_conexion[\"nombre\"]};\n						//Hace el llamado a la operacion de replica sobre la conexion encontrada\n						PCO_EjecutarSQLUnaria($query,$lista_parametros,${$registro_conexion[\"nombre\"]},0);\n					}\n			}\n\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionBD==\"\")\n			global $ConexionPDO;\n		else\n			$ConexionPDO=$ConexionBD;\n\n		global $ModoDepuracion;\n		global $PCOSESS_LoginUsuario,$_SeparadorCampos_;\n		global $MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Detalles,$MULTILANG_ErrorSoloAdmin,$MULTILANG_ContacteAdmin,$MULTILANG_MotorBD;\n		try\n			{\n				$consulta = $ConexionPDO->prepare($query);\n				//Cuando se reciben parametros entonces se asume recepcion de querys con  interrogaciones  ?\n				//que deben ser preparados antes de ejecutarse con cada uno de los parametros recibidos\n				if ($lista_parametros!=\"\")\n					{\n						$cantidad_parametros=substr_count($query,\'?\');\n						$parametros=@explode($_SeparadorCampos_,$lista_parametros);\n						// if ($cantidad_parametros!=count($parametros)) //La cantidad de parametros en query es diferente a los recibidos\n						//Recorre cada parametro y toma su valor\n						for ($i=1;$i<=$cantidad_parametros;$i++)\n							{\n								//Si no recibe valor en el parametro hace el bind con null para al menos hacerlo valido\n								/*\n								if($parametros[$i-1] == \'\')\n									//$consulta->bindValue($i,PDO::PARAM_NULL);\n									//$consulta->bindValue($i,\'\');\n									//$consulta->bindValue($i,$parametros[$i-1]);\n									$consulta->bindParam($i,$parametros[$i-1]);\n								else\n									//$consulta->bindValue($i, $parametros[$i-1]);\n								*/\n									//$consulta->bindValue($i, iconv(\"UTF-8\", \"ISO-8859-1//TRANSLIT\", $parametros[$i-1]));\n									//$consulta->bindValue($i, utf8_encode($parametros[$i-1]));\n									$consulta->bindValue($i, $parametros[$i-1]);\n								//echo \'Parametro \'.$i.\'=\'.$parametros[$i-1].\"<br>\"; //PARA DEPURACION\n							}\n					}\n				$consulta->execute();\n\n				//Lleva el log a auditoria en caso de estar encendido\n				if ($EvitarLogSQL==0)\n					if ($DepuracionSQL==1)\n						PCO_Auditar($query,\"SQLog:$PCOSESS_LoginUsuario\");\n\n				return $consulta;\n			}\n		catch( PDOException $ErrorPDO)\n			{\n				//Lleva el log de errores\n				PCO_Auditar($query,\"SQLog:error\");\n				$detalles_conexion=\' (CNX=\'.$ConexionPDO->getAttribute(PDO::ATTR_CONNECTION_STATUS).\') \';\n				//Muestra detalles del query solo al admin y si el modo de depuracion se encuentra activo\n				if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario))\n					echo \'<script language=\"JavaScript\"> alert(\"\'.$MULTILANG_ErrorTiempoEjecucion.\'\\n\'.$MULTILANG_Detalles.\': \'.PCO_CompletarParametros($query,$parametros).\'\\n\\n\'.$detalles_conexion.\'\\n\\n\'.$MULTILANG_MotorBD.\': \'.$ErrorPDO->getMessage().\'.\\n\\n\'.$MULTILANG_ContacteAdmin.\'\");  </script>\';\n				else\n					echo \'<script language=\"JavaScript\"> alert(\"\'.$MULTILANG_ErrorTiempoEjecucion.\'\\n\'.$MULTILANG_Detalles.\': \'.$detalles_conexion.\'\\n\\n\'.$MULTILANG_ErrorSoloAdmin.\'.\\n\\n\'.$MULTILANG_ContacteAdmin.\'\");  </script>\';\n				return $MULTILANG_ErrorTiempoEjecucion;\n			}\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ProcedimientoSQL\n	Ejecuta procedimientos almacenados por la base de datos\n\n	Variables de entrada:\n\n		procedimiento - Procedimiento que debe residir en la base de datos y que ha de ser ejecutado\n		ConexionBD - Determina si la consulta debe ser ejecutada en otra conexion o motor.  Se hace obligatorio enviar parametros cuando se envia otra conexion\n\n	Salida:\n		Retorna 0 en caso de tener problemas con la ejecucion del procedimiento\n		Retorna una cadena vacia si el procedimiento es llamado y ejecutado sin problemas\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function ejecutar_sql_procedimiento($procedimiento,$ConexionBD=\"\")\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework ejecutar_sql_procedimiento().  En su lugar utilice PCO_ProcedimientoSQL() \"; }\nfunction PCO_ProcedimientoSQL($procedimiento,$ConexionBD=\"\")\n	{\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionBD==\"\")\n			global $ConexionPDO;\n		else\n			$ConexionPDO=$ConexionBD;\n\n		try\n			{\n				$ConexionPDO->exec($procedimiento);\n				return \"\";\n			}\n		catch(PDOException $e)\n			{\n				return $e->getMessage();\n			}\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_Auditar\n	Lleva un registro de auditoria en el sistema\n\n	Variables de entrada:\n\n		accion - Descripcion de la accion a ser almacenada en la auditoria\n\n	Salida:\n\n		Registro de auditoria llevado sobre la tabla\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function auditar($PCO_Accion,$usuario=\"\")\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework auditar().  En su lugar utilice PCO_Auditar() \"; }\nfunction PCO_Auditar($PCO_Accion,$usuario=\"\")\n	{\n		global $ArchivoCORE,$TablasCore;\n		global $ListaCamposSinID_auditoria,$_SeparadorCampos_;\n		global $PCOSESS_LoginUsuario,$PCO_FechaOperacion,$PCO_HoraOperacion;\n		//Establece el usuario para el registro\n		if ($usuario==\"\")\n			$usuario_auditar=$PCOSESS_LoginUsuario;\n		else\n			$usuario_auditar=$usuario;\n		//Lleva el registro\n		PCO_EjecutarSQLUnaria(\"INSERT INTO \".$TablasCore.\"auditoria (\".$ListaCamposSinID_auditoria.\") VALUES (?,?,?,?)\",\"$usuario_auditar$_SeparadorCampos_$PCO_Accion$_SeparadorCampos_$PCO_FechaOperacion$_SeparadorCampos_$PCO_HoraOperacion\",\"\",\"\",1,1);\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ExisteValor\n	Busca dentro de alguna tabla para verificar si existe o no un valor determinado.  Funcion utilizada para validacion de unicidad de valores en formularios de datos.\n\n	Variables de entrada:\n\n		tabla - Nombre de la tabla donde se desea buscar.\n		campo - Campo de la tabla sobre el cual se desea comparar la existencia del valor.\n		valor - Valor a buscar dentro del campo.\n\n	Salida:\n		Retorna 1 en caso de encontrar un valor dentro de la tabla y campo especificadas y que coincida con el parametro buscado\n		Retorna 0 cuando no se encuentra un valor en la tabla que coincida con el buscado\n*/\nfunction PCO_ExisteValor($tabla,$campo,$valor)\n	{\n		global $ConexionPDO;\n		$consulta = $ConexionPDO->prepare(\"SELECT $campo FROM $tabla WHERE $campo=\'$valor\'\");\n		$consulta->execute();\n		$registro = $consulta->fetch();\n		if ($registro[0]!=\"\")\n			{\n				return 1;\n			}\n		else\n			{\n				return 0;\n			}\n	}\n\n\n\n########################################################################\n########################################################################\n	/*\n		Section: Funciones asociadas al retorno de informacion sobre la conexion y estructura de la BD\n	*/\n########################################################################\n########################################################################\n/*\n	Function: PCO_InformacionConexionBD\n	Imprime la informacion asociada a la conexion establecida mediante PDO.\n\n	Ver tambien:\n	<PCO_ImprimirDriversDisponiblesnBD> | <Definicion de conexion PDO>\n*/\nfunction PCO_InformacionConexionBD()\n	{\n		echo \"<hr><center><blink><b><font color=yellow>\".$MULTILANG_Detalles.\":</font></b></blink><br>\";\n		echo $MULTILANG_Controlador.\': \'.$ConexionPDO->getAttribute(PDO::ATTR_DRIVER_NAME).\'<br>\';\n		echo $MULTILANG_Version.\' \'.$MULTILANG_Servidor.\': \'.$ConexionPDO->getAttribute(PDO::ATTR_SERVER_VERSION).\'<br>\';\n		echo $MULTILANG_Estado.\': \'.$ConexionPDO->getAttribute(PDO::ATTR_CONNECTION_STATUS).\'<br>\';\n		echo $MULTILANG_Version.\' \'.$MULTILANG_Cliente.\': \'.$ConexionPDO->getAttribute(PDO::ATTR_CLIENT_VERSION).\'<br>\';\n		echo $MULTILANG_InfoAdicional.\': \'.$ConexionPDO->getAttribute(PDO::ATTR_SERVER_INFO).\'<hr>\';\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ImprimirDriversDisponiblesnBD\n	Imprime el arreglo devuelto por la funcion getAvailableDrivers() para conocer los drivers soportados por la instalacion actual de PHP del lado del servidor.\n\n	Salida:\n		Listado de drivers PDO soportados\n\n	Ver tambien:\n	<PCO_InformacionConexionBD>\n*/\nfunction PCO_ImprimirDriversDisponiblesnBD()\n	{\n		/*foreach(PDO::getAvailableDrivers() as $driver)\n			{\n				echo \"<hr>\".$driver;\n			}*/\n		print_r(PDO::getAvailableDrivers());\n	}\n\n\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ConsultarTablas\n	Determina las tablas en la base de datos activa para la conexion dependiendo del motor utilizado.\n\n	Variables de entrada:\n\n		prefijo - Prefijo del nombre de tablas que seran retornadas\n\n	Salida:\n		Resultado de un query con las tablas  o falso en caso de error\n\n	Ver tambien:\n	<Definicion de conexion PDO>\n*/\nfunction PCO_ConsultarTablas($prefijo=\"\",$ConexionAlterna=\"\",$MotorAlterno=\"\",$BaseDatosAlterna=\"\")\n	{\n		global $MULTILANG_ErrorTiempoEjecucion;\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionAlterna==\"\")\n			{\n				global $ConexionPDO;\n				global $MotorBD;\n				global $BaseDatos;\n			}\n		else\n			{\n				$ConexionPDO=$ConexionAlterna;\n				$MotorBD=$MotorAlterno;\n				$BaseDatos=$BaseDatosAlterna;\n			}\n\n		if($MotorBD==\"sqlsrv\" || $MotorBD==\"mssql\" || $MotorBD==\"ibm\" || $MotorBD==\"dblib\" || $MotorBD==\"odbc\")\n				$consulta = \"SELECT name FROM sysobjects WHERE xtype=\'U\';\";\n		if($MotorBD==\"sqlite\")\n				$consulta = \"SELECT name FROM sqlite_master WHERE type IN (\'table\',\'view\') AND name NOT LIKE \'sqlite_%\' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN (\'table\',\'view\') ORDER BY 1\";\n		if($MotorBD==\"oracle\")\n				$consulta = \"SELECT table_name FROM cat;\";  //  Si falla probar con esta:  $consulta = \"SELECT table_name FROM tabs;\";\n		if($MotorBD==\"ifmx\" || $MotorBD==\"fbd\")\n				$consulta = \"SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL ORDER BY RDB$RELATION_NAME;\";\n		if($MotorBD==\"mysql\")\n				$consulta = \"SHOW tables FROM \".$BaseDatos.\" \";\n		if($MotorBD==\"pgsql\")\n				$consulta = \"SELECT relname AS name FROM pg_stat_user_tables ORDER BY relname;\";\n\n		try\n			{\n				$consulta_tablas=PCO_EjecutarSQL($consulta,\"\",$ConexionPDO,1);\n				return $consulta_tablas;\n			}\n		catch( PDOException $ErrorPDO)\n			{\n				PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$ErrorPDO->getMessage(), \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n				return false;\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: consultar_nombres_columnas\n	Devuelve un arreglo escalar y asociativo con los nombres de las columnas de una tabla y sus datos generales\n\n	Variables de entrada:\n\n		tabla - Nombre de la tabla de la que se desea consultar los nombre de columnas o campos\n\n	Salida:\n		Vector de campos/columnas\n\n	Ver tambien:\n	<PCO_ConsultarTablas>\n*/\nfunction PCO_ConsultarColumnas($tabla,$ConexionAlterna=\"\",$MotorAlterno=\"\",$BaseDatosAlterna=\"\")\n	{\n		global $MULTILANG_ErrorTiempoEjecucion;\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionAlterna==\"\")\n			{\n				global $ConexionPDO;\n				global $MotorBD;\n				global $BaseDatos;\n			}\n		else\n			{\n				$ConexionPDO=$ConexionAlterna;\n				$MotorBD=$MotorAlterno;\n				$BaseDatos=$BaseDatosAlterna;\n			}\n\n		//Busca los campos dependiendo del motor de BD configurado actualmente\n		if ($MotorBD==\"mysql\" || $MotorBD==\"sqlsrv\" || $MotorBD==\"mssql\" || $MotorBD==\"ibm\" || $MotorBD==\"dblib\" || $MotorBD==\"odbc\" || $MotorBD==\"oracle\" || $MotorBD==\"ifmx\" || $MotorBD==\"fbd\")\n			{\n				$columna=0;\n				$resultado=PCO_EjecutarSQL(\"DESCRIBE $tabla \",\"\",$ConexionPDO,1);\n				//echo $resultado;\n				//Evalua si se retorno 1 (error) por la funcion para saber si sigue o no\n				//if($resultado!=\"1\")\n					{\n						while($registro = $resultado->fetch())\n							{\n								$columnas[$columna][\"nombre\"] = $registro[\"Field\"];\n								$columnas[$columna][\"tipo\"] = $registro[\"Type\"];\n								$columnas[$columna][\"nulo\"] = $registro[\"Null\"];\n								$columnas[$columna][\"llave\"] = $registro[\"Key\"];\n								$columnas[$columna][\"predefinido\"] = $registro[\"Default\"];\n								$columnas[$columna][\"extras\"] = $registro[\"Extra\"];\n								$columna++;\n							}\n					}\n				/*else\n					{\n								$columnas[$columna][\"nombre\"] = \"ERROR: Tabla no conectada\";\n								$columnas[$columna][\"tipo\"] = \"ERROR: Tabla no conectada\";\n								$columnas[$columna][\"nulo\"] = \"ERROR: Tabla no conectada\";\n								$columnas[$columna][\"llave\"] = \"ERROR: Tabla no conectada\";\n								$columnas[$columna][\"predefinido\"] = \"ERROR: Tabla no conectada\";\n								$columnas[$columna][\"extras\"] = \"ERROR: Tabla no conectada\";\n								$columna++;\n					}*/\n			}\n\n		if ($MotorBD==\"pgsql\")\n			{\n				$columna=0;\n				$resultado=PCO_EjecutarSQL(\"SELECT * from INFORMATION_SCHEMA.COLUMNS where table_name = ? \",\"$tabla\",$ConexionPDO,1);\n				while($registro = $resultado->fetch())\n					{\n						$columnas[$columna][\"nombre\"] = $registro[\"column_name\"];\n						$columnas[$columna][\"tipo\"] = $registro[\"data_type\"];\n						$columnas[$columna][\"nulo\"] = $registro[\"is_nullable\"];\n						$columnas[$columna][\"llave\"] = \"\";\n						$columnas[$columna][\"predefinido\"] = $registro[\"column_default\"];\n						$columnas[$columna][\"extras\"] = $registro[\"udt_name\"];\n						$columna++;\n					}\n			}\n\n		if ($MotorBD==\"sqlite\")\n			{\n				$columna=0;\n				$resultado=PCO_EjecutarSQL(\"SELECT * FROM sqlite_master WHERE type=\'table\' AND name=? \",\"$tabla\",$ConexionPDO,1);\n				$registro = $resultado->fetch();\n				//Toma los campos encontrados en el SQL de la tabla, los separa y los depura para devolver valores\n				$campos=explode(\",\",$registro[\"sql\"]);\n				for($i=0;$i<count($campos);$i++)\n					{\n						$campos[$i]=trim($campos[$i]);  // Elimina espacios al comienzo y final\n						$campos[$i]=str_replace(\"  \",\" \",$campos[$i]);  //Elimina espacios dobles\n						if ($i==0) $campos[$i]=str_replace(\"CREATE TABLE $tabla (\",\"\",$campos[$i]);  //Elimina instruccion create del primer campo\n						if ($i==count($campos)-1) $campos[$i]=str_replace(\"))\",\")\",$campos[$i]);  //Elimina ultimos parentesis\n						//echo $i.\" valor:\".$campos[$i].\"<hr>\"; //  Usado para depuracion en tiempo de desarrollo\n						$analisis_campo=explode(\" \",$campos[$i]);\n						$columnas[$columna][\"nombre\"] = $analisis_campo[0];\n						$columnas[$columna][\"tipo\"] = $analisis_campo[1];\n						$palabra_siguiente=2;\n						if (trim(strtoupper($analisis_campo[$palabra_siguiente]))==\"PRIMARY\")\n							{\n								$columnas[$columna][\"llave\"] = $analisis_campo[$palabra_siguiente];\n								$palabra_siguiente+=2;\n							}\n						if (trim(strtoupper($analisis_campo[$palabra_siguiente]))==\"NOT\")\n							{\n								$columnas[$columna][\"nulo\"] =  $analisis_campo[$palabra_siguiente].\" \".$analisis_campo[$palabra_siguiente+1];\n								$palabra_siguiente+=2;\n							}\n						if (trim(strtoupper($analisis_campo[$palabra_siguiente]))==\"DEFAULT\")\n							{\n								$columnas[$columna][\"predefinido\"] =  $analisis_campo[$palabra_siguiente+1];\n								$palabra_siguiente+=2;\n							}\n						$columnas[$columna][\"extras\"] = $registro[\"\"];\n						$columna++;\n					}\n			}\n\n\n		//Retorna el arreglo asociativo\n		return $columnas;\n\n\n		/*//Forma 1 (General solo nombres)\n		$resultado=PCO_EjecutarSQL(\"SELECT * FROM \".$tabla);\n		$columnas = array();\n		foreach($resultado->fetch(PDO::FETCH_ASSOC) as $key=>$val)\n			{\n				$columnas[][\"nombre\"] = $key;\n			}\n		return $columnas;*/\n\n		/*//Forma 2\n		$resultado=PCO_EjecutarSQL(\"SELECT * FROM \".$tabla);\n		$columnas = array();\n		for ($i = 0; $i < $resultado->columnCount(); $i++)\n			{\n				$col = $resultado->getColumnMeta($i);\n				$columnas[] = $col[\'name\'];\n			}\n		return $columnas;*/\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ExisteCampoTabla\n	Determina si un campo dado existe dentro de una tabla especifica\n\n	Variables de entrada:\n\n		tabla - Nombre de la tabla de la que se desea buscar el campo\n		campo - Nombre del campo a verificar\n\n	Salida:\n		verdadero o falso dependiendo de si existe o no el campo en la tabla\n\n	Ver tambien:\n	<PCO_ConsultarTablas>\n*/\nfunction PCO_ExisteCampoTabla($campo,$tabla,$ConexionAlterna=\"\",$MotorAlterno=\"\",$BaseDatosAlterna=\"\")\n	{\n		//Determina si se debe usar la conexion global del sistema o una especifica de usuario\n		if($ConexionAlterna==\"\")\n			{\n				global $ConexionPDO;\n				global $MotorBD;\n				global $BaseDatos;\n			}\n		else\n			{\n				$ConexionPDO=$ConexionAlterna;\n				$MotorBD=$MotorAlterno;\n				$BaseDatos=$BaseDatosAlterna;\n			}\n\n		//Asume que el campo no existe\n		$estado=false;\n\n		//Busca todos los campos de la tabla\n		if($ConexionAlterna!=\"\")\n			$resultadocampos=PCO_ConsultarColumnas($tabla,$ConexionPDO,$MotorBD,$BaseDatos);\n		else\n			$resultadocampos=PCO_ConsultarColumnas($tabla);\n\n		for($i=0;$i<count($resultadocampos);$i++)\n			{\n				//Si el campo en el arreglo es igual al campo buscado cambia el estado a verdadero\n				if ($resultadocampos[$i][\"nombre\"]==$campo)\n					$estado=true;\n			}\n\n		//Retorna el resultado\n		return $estado;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_FileGetContents_CURL\n	Un reemplazo para la funcion file_get_contents utilizando cURL\n\n	Salida:\n		Contenido de la URL recibida\n*/\nfunction PCO_FileGetContents_CURL($url)\n	{\n		global $MULTILANG_ErrExtension,$MULTILANG_ErrCURL;\n		//Verifica soporte para cURL\n		if (!extension_loaded(\'curl\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrCURL, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n		//Verifica que la funcion se encuentre activada\n		$funcion_evaluada=\'curl_init\'; $valor_esperado=\'1\';\n		if (ini_get($funcion_evaluada)==$valor_esperado)\n			{\n				//Inicializa el objeto cURL y procesa la solicitud\n				$objeto_curl = curl_init();\n				curl_setopt($objeto_curl, CURLOPT_HEADER, 0);\n				curl_setopt($objeto_curl, CURLOPT_RETURNTRANSFER, 1);\n				curl_setopt($objeto_curl, CURLOPT_URL, $url);\n				$datos_recibidos = curl_exec($objeto_curl);\n				curl_close($objeto_curl);\n			}\n		return $datos_recibidos;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_FileGetContents_SOCKET\n	Un reemplazo para la funcion file_get_contents utilizando Sockets\n*/\nfunction PCO_FileGetContents_SOCKET($url)\n	{\n		$url_parsed = parse_url($url);\n		$host = $url_parsed[\"host\"];\n		$port = $url_parsed[\"port\"];\n		if ($port==0)\n			$port = 80;\n		$path = $url_parsed[\"path\"];\n		if ($url_parsed[\"query\"] != \"\")\n			$path .= \"?\".$url_parsed[\"query\"];\n\n		$out = \"GET $path HTTP/1.0\\r\\nHost: $host\\r\\n\\r\\n\";\n\n		$fp = fsockopen($host, $port, $errno, $errstr, 30);\n\n		fwrite($fp, $out);\n		$body = false;\n		while (!feof($fp))\n			{\n				$s = fgets($fp, 1024);\n				if ( $body )\n					$in .= $s;\n				if ( $s == \"\\r\\n\" )\n					$body = true;\n			}\n		fclose($fp);\n		return $in;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_FileGetContents_NATIVO\n	Una personalizacion para la funcion file_get_contents de PHP agregando Agente de navegador y otros.\n\n	Salida:\n		Contenido de la URL recibida\n*/\nfunction PCO_FileGetContents_NATIVO($url)\n	{\n		//ORIGINAL$contenido_url = trim(file_get_contents($url));\n		//Define el contexto de navegacion\n		$opciones_navegacion = array(\n		  \'http\'=>array(\n			\'method\'=>\"GET\",\n			\'header\'=>\"Accept-language: en\\r\\n\" .\n					  \"Cookie: foo=bar\\r\\n\" .  // check function.stream-context-create on php.net\n					  \"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\\r\\n\" // i.e. An iPad\n		  )\n		);\n		//$opciones_navegacion  = array(\'http\' => array(\'user_agent\' => \'custom user agent string\'));\n\n		$contexto_navegacion = stream_context_create($opciones_navegacion);\n		$datos_recibidos = file_get_contents($url, false, $contexto_navegacion);\n		return $datos_recibidos;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarURL\n	Recibe una URL y pasa su contenido a una cadena de texto\n*/\nfunction PCO_CargarURL($url)\n	{\n		$contenido_url=\"\";\n\n		//Intenta con cURL si esta habilitado\n		$funcion_evaluada=\'curl_init\'; $valor_esperado=\'1\';\n		if (@$contenido_url==\"\")\n			if (ini_get($funcion_evaluada)==$valor_esperado)\n				$contenido_url = trim(PCO_FileGetContents_CURL($url));\n\n		$funcion_evaluada=\'allow_url_fopen\'; $valor_esperado=\'1\';\n		//Intenta con la funcion nativa de PHP si esta habilitada y no se pudo obtener nada con cURL\n		if (@$contenido_url==\"\")\n			if (ini_get($funcion_evaluada)==$valor_esperado)\n				$contenido_url = trim(PCO_FileGetContents_NATIVO($url));\n\n		//Intenta con funciones de socket si no se pudo obtener nada con file_get_contents\n		if (@$contenido_url==\"\")\n			$contenido_url = trim(PCO_FileGetContents_SOCKET($url));\n\n		//Retorna el resultado\n		return $contenido_url;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_VerificarExtensionesPHP\n	Verifica si las extensiones minimas requeridas por la herramienta se encuentran activadas y despliega mensaje de error si aplica.\n\n	Salida:\n		Mensajes de error asociados a la no activacion de cada extension\n*/\nfunction PCO_VerificarExtensionesPHP()\n	{\n		global $MotorBD;\n		global $Auth_TipoMotor;\n		global $Auth_TipoEncripcion;\n		global $MULTILANG_ErrExtensionGenerica,$MULTILANG_ErrExtension,$MULTILANG_ErrSimpleXML,$MULTILANG_ErrCURL,$MULTILANG_ErrLDAP,$MULTILANG_ErrHASH,$MULTILANG_ErrSESS,$MULTILANG_ErrGD,$MULTILANG_ErrPDO,$MULTILANG_ErrDriverPDO,$MULTILANG_ErrGoogleAPIMod,$MULTILANG_ErrFuncion,$MULTILANG_ErrDirectiva;\n\n		//Verifica estado de configuraciones PHP\n		$funcion_evaluada=\'allow_url_fopen\'; $valor_esperado=\'1\';\n			//Intenta encenderla (para servidores con suPHP)\n			if (ini_get($funcion_evaluada)!=$valor_esperado) {ini_set($funcion_evaluada,$valor_esperado);}\n			//Verifica si pudo ser encendida en tiempo de ejecucion, sino muestra mensaje y solamente si no hay cURL pues es un sustituto\n			if (ini_get($funcion_evaluada)!=$valor_esperado && !extension_loaded(\'curl\'))\n				PCO_Mensaje($MULTILANG_ErrFuncion,$funcion_evaluada.\': \'.$MULTILANG_ErrDirectiva, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para LDAP cuando esta activado en la herramienta\n		if ($Auth_TipoMotor==\'ldap\' &&  !extension_loaded(\'ldap\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrLDAP, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para HASH cuando se requiere encripcion\n		if ($Auth_TipoEncripcion!=\"plano\" && !extension_loaded(\'hash\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrHASH, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para sesiones\n		if (!extension_loaded(\'session\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrSESS, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para GD2\n		if (!extension_loaded(\'gd\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrGD, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para PDO\n		if (!extension_loaded(\'pdo\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrPDO, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para el driver PDO correspondiente al motor utilizado\n		if (!extension_loaded(\'pdo_\'.$MotorBD))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrDriverPDO, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para SimpleXML\n		if (!extension_loaded(\'SimpleXML\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrSimpleXML, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		//Verifica soporte para Multibyte strings\n		if (!extension_loaded(\'mbstring\'))\n			PCO_Mensaje($MULTILANG_ErrExtension,\'<b>mbstring:</b> \'.$MULTILANG_ErrExtensionGenerica, \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		// Bloqueos por IP/pais http://stackoverflow.com/questions/15835274/file-get-contents-failed-to-open-stream-connection-refused\n\n		// Verifica el soporte para funciones especificas PHP\n		$funcion_evaluada=\'file_get_contents\';\n		if (!function_exists($funcion_evaluada))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrFuncion.\'<b>\'.$funcion_evaluada.\'</b>\', \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		// Verifica el soporte para funciones especificas PHP\n		$funcion_evaluada=\'simplexml_load_string\';\n		if (!function_exists($funcion_evaluada))\n			PCO_Mensaje($MULTILANG_ErrExtension,$MULTILANG_ErrFuncion.\'<b>\'.$funcion_evaluada.\'</b>\', \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_BuscarActualizaciones\n	Compara la version actual del sistema frente a la ultima version publicada para determinar si existen o no actualizaciones\n\n	Salida:\n		Mensaje informativo en pantalla cuando se encuentren actualizaciones disponibles\n*/\nfunction PCO_BuscarActualizaciones($PCOSESS_LoginUsuario=\'\',$PCO_Accion)\n	{\n		global $MULTILANG_Atencion,$MULTILANG_ActAlertaVersion;\n		// Genera un aleatorio entre 1 y 10 para no sacar siempre el aviso y buscar nuevas versiones.\n		$buscar=rand(0,7);\n		if (PCO_EsAdministrador(@$PCOSESS_LoginUsuario) && $PCO_Accion==\"PCO_VerMenu\" && $buscar==1)\n			{\n				$path_ultima_version=\"http://devs.practico.org:3000/unix4you2/practico/raw/branch/master/dev/version_publicada.txt\";\n				$version_actualizada = @PCO_CargarURL($path_ultima_version);\n				$archivo_origen=\"inc/version_actual.txt\";\n				$archivo = fopen($archivo_origen, \"r\");\n				if ($archivo)\n					{\n						$version_practico = trim(fgets($archivo, 1024));\n						fclose($archivo);\n					}\n				if ($version_actualizada>$version_practico)\n					PCO_Mensaje($MULTILANG_Atencion,$MULTILANG_ActAlertaVersion.\'<br><a href=\"https://www.practico.org/descargas\" target=\"_blank\" class=\"btn btn-default btn-xs\" style=\"margin-left:90px;\"><i class=\"fa fa-download fa-fw\"></i> Descargar / Donwload </a><br><br>\',\'\',\'fa fa-exclamation-triangle fa-5x\',\'TextosEscritorio\');\n			}\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ConsultarBasesDeDatos\n	Determina las bases de datos existentes dependiendo del motor utilizado.\n\n	Salida:\n		Resultado de un query con las bases de datos o falso en caso de error\n\n	Ver tambien:\n	<Definicion de conexion PDO> | <PCO_ConsultarTablas>\n*/\nfunction PCO_ConsultarBasesDeDatos()\n	{\n		global $ConexionPDO;\n		global $MotorBD;\n		global $BaseDatos;\n		global $MULTILANG_ErrorTiempoEjecucion;\n\n		if($MotorBD==\"sqlsrv\" || $MotorBD==\"mssql\" || $MotorBD==\"ibm\" || $MotorBD==\"dblib\" || $MotorBD==\"odbc\" || $MotorBD==\"sqlite2\" || $MotorBD==\"sqlite3\")\n			$consulta = \"SELECT name FROM sys.Databases;\";\n		if($MotorBD==\"oracle\")\n			$consulta = \'SELECT * FROM v$database;\';  //Si falla intentar con este: $consulta = \"SELECT * FROM user_tablespaces\";\n		if($MotorBD==\"ifmx\" || $dbtype==\"fbd\")\n			$consulta = \"\";\n		if($MotorBD==\"mysql\")\n			$consulta = \"SHOW DATABASES;\";\n		if($MotorBD==\"pg\")\n			$consulta = \"SELECT datname AS name FROM pg_database;\";\n\n		try\n			{\n				$consulta_basesdatos = $ConexionPDO->prepare($consulta);\n				$consulta_basesdatos->execute();\n				return $consulta_basesdatos;\n			}\n		catch( PDOException $ErrorPDO)\n			{\n				PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$ErrorPDO->getMessage(), \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n				return false;\n			}\n}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ContarRegistrosTabla\n	Devuelve la cantidad de registros existentes dentro de una tabla con una condicion determinada\n\n	Salida:\n		Valor numerico que indica la cantidad de registros encontrados\n\n	Ver tambien:\n		<PCO_ConsultarTablas> | <PCO_ConsultarColumnas>\n*/\nfunction PCO_ContarRegistrosTabla($tabla,$condicion=\"\")\n	{\n		global $ConexionPDO;\n\n		//Si se recibe una concion la agrega a la consulta\n		$ComplementoConsultaConteo=\"\";\n		if ($condicion!=\"\") $ComplementoConsultaConteo=\" WHERE $condicion \";\n		//Ejecuta la consulta\n		$consulta = $ConexionPDO->prepare(\"SELECT count(*) FROM $tabla $ComplementoConsultaConteo\");\n		$consulta->execute();\n		$filas = $consulta->fetchColumn();\n		return $filas;\n	}\n\n\n########################################################################\n########################################################################\n	/*\n		Section: Funciones asociadas a la creacion de elementos graficos (ventanas, etc)\n	*/\n########################################################################\n########################################################################\n\nfunction PCO_CrearFormularioOauth($sitio)\n	{\n		global $ArchivoCORE;\n		// Crea el formulario correspondiente para llamar el login con el proveedor\n		$FormularioProveedor = \'\n			<form name=\"login_\'.$sitio.\'\" method=\"POST\" action=\"\'.$ArchivoCORE.\'\" style=\"margin: 2; display: inline!important;\">\n			<input type=\"hidden\" name=\"PCO_WSOn\" value=\"1\">\n			<input type=\"hidden\" name=\"OAuthSrv\" value=\"\'.$sitio.\'\">\n			<input type=\"hidden\" name=\"PCO_WSId\" value=\"PCO_AutenticacionOauth\">\n			<!--232x86|150x56|94x35|81x30-->\n			<button type=\"submit\" class=\"btn btn-default  btn-default btn-lg\" style=\"margin:10px; background-size: 100%; height: 56px; width:150px; background-position : center center; background-repeat:no-repeat; background-image : url(inc/oauth/logos/\'.strtolower($sitio).\'.png); \">&nbsp;</button>\n			</form>\';\n		// Retorna valor de activacion a variable AlMenosUnOAuth\n		return $FormularioProveedor;\n	}\n\n\nfunction PCO_ContarProveedoresOAuthConfigurados()\n	{\n		$Conteo=0;\n		global $APIGoogle_ClientId,$APIGoogle_ClientSecret,$APIFacebook_ClientId,$APIFacebook_ClientSecret,$APILinkedIn_ClientId,$APILinkedIn_ClientSecret,$APIInstagram_ClientId,$APIInstagram_ClientSecret,$APIDropbox_ClientId,$APIDropbox_ClientSecret,$APIMicrosoft_ClientId,$APIMicrosoft_ClientSecret,$APIFlickr_ClientId,$APIFlickr_ClientSecret,$APITwitter_ClientId,$APITwitter_ClientSecret,$APIFoursquare_ClientId,$APIFoursquare_ClientSecret,$APIXING_ClientId,$APIXING_ClientSecret,$APISalesforce_ClientId,$APISalesforce_ClientSecret,$APIBitbucket_ClientId,$APIBitbucket_ClientSecret,$APIYahoo_ClientId,$APIYahoo_ClientSecret,$APIBox_ClientId,$APIBox_ClientSecret,$APIDisqus_ClientId,$APIDisqus_ClientSecret,$APIEventful_ClientId,$APIEventful_ClientSecret,$APISurveyMonkey_ClientId,$APISurveyMonkey_ClientSecret,$APIRightSignature_ClientId,$APIRightSignature_ClientSecret,$APIFitbit_ClientId,$APIFitbit_ClientSecret,$APIScoopIt_ClientId,$APIScoopIt_ClientSecret,$APITumblr_ClientId,$APITumblr_ClientSecret,$APIStockTwits_ClientId,$APIStockTwits_ClientSecret,$APIVK_ClientId,$APIVK_ClientSecret,$APIWithings_ClientId,$APIWithings_ClientSecret;\n		// Crea los formularios de redireccion segun proveedor\n		$CadenaProveedoresOAuthDisponibles=\"\";\n		if ($APIGoogle_ClientId!=\'\'						&& $APIGoogle_ClientSecret!=\'\')						$Conteo++;\n		if ($APIFacebook_ClientId!=\'\'					&& $APIFacebook_ClientSecret!=\'\')					$Conteo++;\n		if ($APILinkedIn_ClientId!=\'\'					&& $APILinkedIn_ClientSecret!=\'\')					$Conteo++;\n		if ($APIInstagram_ClientId!=\'\'					&& $APIInstagram_ClientSecret!=\'\')					$Conteo++;\n		if ($APIDropbox_ClientId!=\'\'					&& $APIDropbox_ClientSecret!=\'\')					$Conteo++;\n		if ($APIMicrosoft_ClientId!=\'\'					&& $APIMicrosoft_ClientSecret!=\'\')					$Conteo++;\n		if ($APIFlickr_ClientId!=\'\'						&& $APIFlickr_ClientSecret!=\'\')						$Conteo++;\n		if ($APITwitter_ClientId!=\'\'					&& $APITwitter_ClientSecret!=\'\')					$Conteo++;\n		if ($APIFoursquare_ClientId!=\'\'					&& $APIFoursquare_ClientSecret!=\'\')					$Conteo++;\n		if ($APIXING_ClientId!=\'\'						&& $APIXING_ClientSecret!=\'\')						$Conteo++;\n		if ($APISalesforce_ClientId!=\'\'					&& $APISalesforce_ClientSecret!=\'\')					$Conteo++;\n		if ($APIBitbucket_ClientId!=\'\'					&& $APIBitbucket_ClientSecret!=\'\')					$Conteo++;\n		if ($APIYahoo_ClientId!=\'\'						&& $APIYahoo_ClientSecret!=\'\')						$Conteo++;\n		if ($APIBox_ClientId!=\'\'						&& $APIBox_ClientSecret!=\'\')						$Conteo++;\n		if ($APIDisqus_ClientId!=\'\'						&& $APIDisqus_ClientSecret!=\'\')						$Conteo++;\n		if ($APIEventful_ClientId!=\'\'					&& $APIEventful_ClientSecret!=\'\')					$Conteo++;\n		if ($APISurveyMonkey_ClientId!=\'\'				&& $APISurveyMonkey_ClientSecret!=\'\')				$Conteo++;\n		if ($APIRightSignature_ClientId!=\'\'				&& $APIRightSignature_ClientSecret!=\'\')				$Conteo++;\n		if ($APIFitbit_ClientId!=\'\'						&& $APIFitbit_ClientSecret!=\'\')						$Conteo++;\n		if ($APIScoopIt_ClientId!=\'\'					&& $APIScoopIt_ClientSecret!=\'\')					$Conteo++;\n		if ($APITumblr_ClientId!=\'\'						&& $APITumblr_ClientSecret!=\'\')						$Conteo++;\n		if ($APIStockTwits_ClientId!=\'\'					&& $APIStockTwits_ClientSecret!=\'\')					$Conteo++;\n		if ($APIVK_ClientId!=\'\'							&& $APIVK_ClientSecret!=\'\')							$Conteo++;\n		if ($APIWithings_ClientId!=\'\'					&& $APIWithings_ClientSecret!=\'\')					$Conteo++;\n		if ($API37Signals_ClientId!=\'\'					&& $API37Signals_ClientSecret!=\'\')					$Conteo++;\n		if ($APIAmazon_ClientId!=\'\'						&& $APIAmazon_ClientSecret!=\'\')						$Conteo++;\n		if ($APIAOL_ClientId!=\'\'						&& $APIAOL_ClientSecret!=\'\')						$Conteo++;\n		if ($APIBitly_ClientId!=\'\'						&& $APIBitly_ClientSecret!=\'\')						$Conteo++;\n		if ($APIBuffer_ClientId!=\'\'						&& $APIBuffer_ClientSecret!=\'\')						$Conteo++;\n		if ($APICopy_ClientId!=\'\'						&& $APICopy_ClientSecret!=\'\')						$Conteo++;\n		if ($APIDailymotion_ClientId!=\'\'				&& $APIDailymotion_ClientSecret!=\'\')				$Conteo++;\n		if ($APIDiscogs_ClientId!=\'\'					&& $APIDiscogs_ClientSecret!=\'\')					$Conteo++;\n		if ($APIEtsy_ClientId!=\'\'						&& $APIEtsy_ClientSecret!=\'\')						$Conteo++;\n		if ($APIGarmin_ClientId!=\'\'						&& $APIGarmin_ClientSecret!=\'\')						$Conteo++;\n		if ($APIGarmin2Legged_ClientId!=\'\'				&& $APIGarmin2Legged_ClientSecret!=\'\')				$Conteo++;\n		if ($APIiHealth_ClientId!=\'\'					&& $APIiHealth_ClientSecret!=\'\')					$Conteo++;\n		if ($APIimgur_ClientId!=\'\'						&& $APIimgur_ClientSecret!=\'\')						$Conteo++;\n		if ($APIInfusionsoft_ClientId!=\'\'				&& $APIInfusionsoft_ClientSecret!=\'\')				$Conteo++;\n		if ($APIIntuit_ClientId!=\'\'						&& $APIIntuit_ClientSecret!=\'\')						$Conteo++;\n		if ($APIJawbone_ClientId!=\'\'					&& $APIJawbone_ClientSecret!=\'\')					$Conteo++;\n		if ($APILivecoding_ClientId!=\'\'					&& $APILivecoding_ClientSecret!=\'\')					$Conteo++;\n		if ($APIMailChimp_ClientId!=\'\'					&& $APIMailChimp_ClientSecret!=\'\')					$Conteo++;\n		if ($APIMavenlink_ClientId!=\'\'					&& $APIMavenlink_ClientSecret!=\'\')					$Conteo++;\n		if ($APIMeetup_ClientId!=\'\'						&& $APIMeetup_ClientSecret!=\'\')						$Conteo++;\n		if ($APIMicrosoftOpenIDConnect_ClientId!=\'\'		&& $APIMicrosoftOpenIDConnect_ClientSecret!=\'\')		$Conteo++;\n		if ($APIMisfit_ClientId!=\'\'						&& $APIMisfit_ClientSecret!=\'\')						$Conteo++;\n		if ($APIoDesk_ClientId!=\'\'						&& $APIoDesk_ClientSecret!=\'\')						$Conteo++;\n		if ($APIOdnoklassniki_ClientId!=\'\'				&& $APIOdnoklassniki_ClientSecret!=\'\')				$Conteo++;\n		if ($APIPaypal_ClientId!=\'\'						&& $APIPaypal_ClientSecret!=\'\')						$Conteo++;\n		if ($APIPinterest_ClientId!=\'\'					&& $APIPinterest_ClientSecret!=\'\')					$Conteo++;\n		if ($APIRdio_ClientId!=\'\'						&& $APIRdio_ClientSecret!=\'\')						$Conteo++;\n		if ($APIReddit_ClientId!=\'\'						&& $APIReddit_ClientSecret!=\'\')						$Conteo++;\n		if ($APIRunKeeper_ClientId!=\'\'					&& $APIRunKeeper_ClientSecret!=\'\')					$Conteo++;\n		if ($APIUber_ClientId!=\'\'						&& $APIUber_ClientSecret!=\'\')						$Conteo++;\n		if ($APITeamViewer_ClientId!=\'\'					&& $APITeamViewer_ClientSecret!=\'\')					$Conteo++;\n		if ($APIVimeo_ClientId!=\'\'						&& $APIVimeo_ClientSecret!=\'\')						$Conteo++;\n		if ($APIWordpress_ClientId!=\'\'					&& $APIWordpress_ClientSecret!=\'\')					$Conteo++;\n		if ($APIXero_ClientId!=\'\'						&& $APIXero_ClientSecret!=\'\')						$Conteo++;\n		if ($APIYammer_ClientId!=\'\'						&& $APIYammer_ClientSecret!=\'\')						$Conteo++;\n		if ($APIYandex_ClientId!=\'\'						&& $APIYandex_ClientSecret!=\'\')						$Conteo++;\n\n		return $Conteo;\n	}\n\n\nfunction PCO_ContarProveedoresSAML2Configurados()\n	{\n		$Conteo=0;\n		$Conteo=PCO_EjecutarSQL(\"SELECT COUNT(*) FROM core_samlconector \")->fetchColumn();\n		return $Conteo;\n	}\n\n\nfunction PCO_GenerarOpcionesProveedoresOAuth()\n	{\n		global $APIGoogle_ClientId,$APIGoogle_ClientSecret,$APIFacebook_ClientId,$APIFacebook_ClientSecret,$APILinkedIn_ClientId,$APILinkedIn_ClientSecret,$APIInstagram_ClientId,$APIInstagram_ClientSecret,$APIDropbox_ClientId,$APIDropbox_ClientSecret,$APIMicrosoft_ClientId,$APIMicrosoft_ClientSecret,$APIFlickr_ClientId,$APIFlickr_ClientSecret,$APITwitter_ClientId,$APITwitter_ClientSecret,$APIFoursquare_ClientId,$APIFoursquare_ClientSecret,$APIXING_ClientId,$APIXING_ClientSecret,$APISalesforce_ClientId,$APISalesforce_ClientSecret,$APIBitbucket_ClientId,$APIBitbucket_ClientSecret,$APIYahoo_ClientId,$APIYahoo_ClientSecret,$APIBox_ClientId,$APIBox_ClientSecret,$APIDisqus_ClientId,$APIDisqus_ClientSecret,$APIEventful_ClientId,$APIEventful_ClientSecret,$APISurveyMonkey_ClientId,$APISurveyMonkey_ClientSecret,$APIRightSignature_ClientId,$APIRightSignature_ClientSecret,$APIFitbit_ClientId,$APIFitbit_ClientSecret,$APIScoopIt_ClientId,$APIScoopIt_ClientSecret,$APITumblr_ClientId,$APITumblr_ClientSecret,$APIStockTwits_ClientId,$APIStockTwits_ClientSecret,$APIVK_ClientId,$APIVK_ClientSecret,$APIWithings_ClientId,$APIWithings_ClientSecret;\n		global $API37Signals_ClientId,$API37Signals_ClientSecret,$APIAmazon_ClientId,$APIAmazon_ClientSecret,$APIAOL_ClientId,$APIAOL_ClientSecret,$APIBitly_ClientId,$APIBitly_ClientSecret,$APIBuffer_ClientId,$APIBuffer_ClientSecret,$APICopy_ClientId,$APICopy_ClientSecret,$APIDailymotion_ClientId,$APIDailymotion_ClientSecret,$APIDiscogs_ClientId,$APIDiscogs_ClientSecret,$APIEtsy_ClientId,$APIEtsy_ClientSecret,$APIGarmin_ClientId,$APIGarmin_ClientSecret,$APIGarmin2Legged_ClientId,$APIGarmin2Legged_ClientSecret,$APIiHealth_ClientId,$APIiHealth_ClientSecret,$APIimgur_ClientId,$APIimgur_ClientSecret,$APIInfusionsoft_ClientId,$APIInfusionsoft_ClientSecret,$APIIntuit_ClientId,$APIIntuit_ClientSecret,$APIJawbone_ClientId,$APIJawbone_ClientSecret,$APILivecoding_ClientId,$APILivecoding_ClientSecret,$APIMailChimp_ClientId,$APIMailChimp_ClientSecret,$APIMavenlink_ClientId,$APIMavenlink_ClientSecret,$APIMeetup_ClientId,$APIMeetup_ClientSecret,$APIMicrosoftOpenIDConnect_ClientId,$APIMicrosoftOpenIDConnect_ClientSecret,$APIMisfit_ClientId,$APIMisfit_ClientSecret,$APIoDesk_ClientId,$APIoDesk_ClientSecret,$APIOdnoklassniki_ClientId,$APIOdnoklassniki_ClientSecret,$APIPaypal_ClientId,$APIPaypal_ClientSecret,$APIPinterest_ClientId,$APIPinterest_ClientSecret,$APIRdio_ClientId,$APIRdio_ClientSecret,$APIReddit_ClientId,$APIReddit_ClientSecret,$APIRunKeeper_ClientId,$APIRunKeeper_ClientSecret,$APIUber_ClientId,$APIUber_ClientSecret,$APITeamViewer_ClientId,$APITeamViewer_ClientSecret,$APIVimeo_ClientId,$APIVimeo_ClientSecret,$APIWordpress_ClientId,$APIWordpress_ClientSecret,$APIXero_ClientId,$APIXero_ClientSecret,$APIYammer_ClientId,$APIYammer_ClientSecret,$APIYandex_ClientId,$APIYandex_ClientSecret;\n		// Crea los formularios de redireccion segun proveedor\n		$CadenaProveedoresOAuthDisponibles=\"\";\n		if ($APIGoogle_ClientId!=\'\'						&& $APIGoogle_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Google\');\n		if ($APIFacebook_ClientId!=\'\'					&& $APIFacebook_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Facebook\');\n		if ($APILinkedIn_ClientId!=\'\'					&& $APILinkedIn_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'LinkedIn\');\n		if ($APIInstagram_ClientId!=\'\'					&& $APIInstagram_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Instagram\');\n		if ($APIDropbox_ClientId!=\'\'					&& $APIDropbox_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Dropbox\');\n		if ($APIMicrosoft_ClientId!=\'\'					&& $APIMicrosoft_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Microsoft\');\n		if ($APIFlickr_ClientId!=\'\'						&& $APIFlickr_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Flickr\');\n		if ($APITwitter_ClientId!=\'\'					&& $APITwitter_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Twitter\');\n		if ($APIFoursquare_ClientId!=\'\'					&& $APIFoursquare_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Foursquare\');\n		if ($APIXING_ClientId!=\'\'						&& $APIXING_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'XING\');\n		if ($APISalesforce_ClientId!=\'\'					&& $APISalesforce_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Salesforce\');\n		if ($APIBitbucket_ClientId!=\'\'					&& $APIBitbucket_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Bitbucket\');\n		if ($APIYahoo_ClientId!=\'\'						&& $APIYahoo_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Yahoo\');\n		if ($APIBox_ClientId!=\'\'						&& $APIBox_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Box\');\n		if ($APIDisqus_ClientId!=\'\'						&& $APIDisqus_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Disqus\');\n		if ($APIEventful_ClientId!=\'\'					&& $APIEventful_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Eventful\');\n		if ($APISurveyMonkey_ClientId!=\'\'				&& $APISurveyMonkey_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'SurveyMonkey\');\n		if ($APIRightSignature_ClientId!=\'\'				&& $APIRightSignature_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'RightSignature\');\n		if ($APIFitbit_ClientId!=\'\'						&& $APIFitbit_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Fitbit\');\n		if ($APIScoopIt_ClientId!=\'\'					&& $APIScoopIt_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'ScoopIt\');\n		if ($APITumblr_ClientId!=\'\'						&& $APITumblr_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Tumblr\');\n		if ($APIStockTwits_ClientId!=\'\'					&& $APIStockTwits_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'StockTwits\');\n		if ($APIVK_ClientId!=\'\'							&& $APIVK_ClientSecret!=\'\')							$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'VK\');\n		if ($APIWithings_ClientId!=\'\'					&& $APIWithings_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Withings\');\n		if ($API37Signals_ClientId!=\'\'					&& $API37Signals_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'37Signals\');\n		if ($APIAmazon_ClientId!=\'\'						&& $APIAmazon_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Amazon\');\n		if ($APIAOL_ClientId!=\'\'						&& $APIAOL_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'AOL\');\n		if ($APIBitly_ClientId!=\'\'						&& $APIBitly_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Bitly\');\n		if ($APIBuffer_ClientId!=\'\'						&& $APIBuffer_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Buffer\');\n		if ($APICopy_ClientId!=\'\'						&& $APICopy_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Copy\');\n		if ($APIDailymotion_ClientId!=\'\'				&& $APIDailymotion_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Dailymotion\');\n		if ($APIDiscogs_ClientId!=\'\'					&& $APIDiscogs_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Discogs\');\n		if ($APIEtsy_ClientId!=\'\'						&& $APIEtsy_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Etsy\');\n		if ($APIGarmin_ClientId!=\'\'						&& $APIGarmin_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Garmin\');\n		if ($APIGarmin2Legged_ClientId!=\'\'				&& $APIGarmin2Legged_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Garmin2Legged\');\n		if ($APIiHealth_ClientId!=\'\'					&& $APIiHealth_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'iHealth\');\n		if ($APIimgur_ClientId!=\'\'						&& $APIimgur_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'imgur\');\n		if ($APIInfusionsoft_ClientId!=\'\'				&& $APIInfusionsoft_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Infusionsoft\');\n		if ($APIIntuit_ClientId!=\'\'						&& $APIIntuit_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Intuit\');\n		if ($APIJawbone_ClientId!=\'\'					&& $APIJawbone_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Jawbone\');\n		if ($APILivecoding_ClientId!=\'\'					&& $APILivecoding_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Livecoding\');\n		if ($APIMailChimp_ClientId!=\'\'					&& $APIMailChimp_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'MailChimp\');\n		if ($APIMavenlink_ClientId!=\'\'					&& $APIMavenlink_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Mavenlink\');\n		if ($APIMeetup_ClientId!=\'\'						&& $APIMeetup_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Meetup\');\n		if ($APIMicrosoftOpenIDConnect_ClientId!=\'\'		&& $APIMicrosoftOpenIDConnect_ClientSecret!=\'\')		$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'MicrosoftOpenIDConnect\');\n		if ($APIMisfit_ClientId!=\'\'						&& $APIMisfit_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Misfit\');\n		if ($APIoDesk_ClientId!=\'\'						&& $APIoDesk_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'oDesk\');\n		if ($APIOdnoklassniki_ClientId!=\'\'				&& $APIOdnoklassniki_ClientSecret!=\'\')				$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Odnoklassniki\');\n		if ($APIPaypal_ClientId!=\'\'						&& $APIPaypal_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Paypal\');\n		if ($APIPinterest_ClientId!=\'\'					&& $APIPinterest_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Pinterest\');\n		if ($APIRdio_ClientId!=\'\'						&& $APIRdio_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Rdio\');\n		if ($APIReddit_ClientId!=\'\'						&& $APIReddit_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Reddit\');\n		if ($APIRunKeeper_ClientId!=\'\'					&& $APIRunKeeper_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'RunKeeper\');\n		if ($APIUber_ClientId!=\'\'						&& $APIUber_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Uber\');\n		if ($APITeamViewer_ClientId!=\'\'					&& $APITeamViewer_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'TeamViewer\');\n		if ($APIVimeo_ClientId!=\'\'						&& $APIVimeo_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Vimeo\');\n		if ($APIWordpress_ClientId!=\'\'					&& $APIWordpress_ClientSecret!=\'\')					$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Wordpress\');\n		if ($APIXero_ClientId!=\'\'						&& $APIXero_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Xero\');\n		if ($APIYammer_ClientId!=\'\'						&& $APIYammer_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Yammer\');\n		if ($APIYandex_ClientId!=\'\'						&& $APIYandex_ClientSecret!=\'\')						$AlMenosUnOAuth.=PCO_CrearFormularioOauth(\'Yandex\');\n\n		return $AlMenosUnOAuth;\n	}\n\nfunction PCO_VentanaLogin()\n	{\n		/*\n			Function: PCO_VentanaLogin\n			Despliega la ventana de ingreso al sistema con el formulario para usuario, contrasena y captcha.\n		*/\n		  global $ArchivoCORE,$LlaveDePaso,$Auth_TipoMotor,$MULTILANG_OauthButt,$NombreRAD,$Auth_PresentarOauthInicio,$TipoCaptchaLogin;\n		  global $Auth_PermitirAutoRegistro,$Auth_PermitirReseteoClaves,$CaracteresCaptcha,$IdiomaEnLogin;\n		  global $UbicacionProveedoresOAuth,$IdiomaPredeterminado,$MULTILANG_IdiomaPredeterminado,$MULTILANG_Cerrar,$MULTILANG_Usuario,$MULTILANG_Contrasena,$MULTILANG_CodigoSeguridad,$MULTILANG_IngreseCodigoSeguridad,$MULTILANG_TituloLogin,$MULTILANG_Importante,$MULTILANG_AccesoExclusivo,$MULTILANG_Ingresar,$MULTILANG_OauthLogin,$MULTILANG_LoginClasico,$MULTILANG_LoginOauthDes,$MULTILANG_Registrarme,$MULTILANG_OlvideClave;\n\n		  //Variables para el sistema de captcha\n		  global $MULTILANG_TipoCaptchaPrefijo,$MULTILANG_TipoCaptchaPosfijo;\n		  global $MULTILANG_Aplicacion,$MULTILANG_SimboloCaptchaCarro,	$MULTILANG_SimboloCaptchaTijeras,	$MULTILANG_SimboloCaptchaCalculadora,	$MULTILANG_SimboloCaptchaBomba,	$MULTILANG_SimboloCaptchaLibro,	$MULTILANG_SimboloCaptchaPastel,	$MULTILANG_SimboloCaptchaCafe,	$MULTILANG_SimboloCaptchaNube,	$MULTILANG_SimboloCaptchaDiamante,	$MULTILANG_SimboloCaptchaMujer,	$MULTILANG_SimboloCaptchaHombre,	$MULTILANG_SimboloCaptchaBalon,	$MULTILANG_SimboloCaptchaControl,	$MULTILANG_SimboloCaptchaCasa,	$MULTILANG_SimboloCaptchaCelular,	$MULTILANG_SimboloCaptchaArbol,	$MULTILANG_SimboloCaptchaTrofeo,	$MULTILANG_SimboloCaptchaSombrilla,	$MULTILANG_SimboloCaptchaUniversidad,	$MULTILANG_SimboloCaptchaCamara,	$MULTILANG_SimboloCaptchaAmbulancia,	$MULTILANG_SimboloCaptchaAvion,	$MULTILANG_SimboloCaptchaTren,	$MULTILANG_SimboloCaptchaBicicleta,	$MULTILANG_SimboloCaptchaCamion,	$MULTILANG_SimboloCaptchaCorazon;\n\n			//Variables posiblemente recibidas desde un autoregistro\n			global $AUTO_uid,$AUTO_clave;\n\n			// Variables para OAuth desde el archivo de configuracion\n			global $APIGoogle_ClientId,$APIGoogle_ClientSecret;\n			global $APIFacebook_ClientId,$APIFacebook_ClientSecret;\n			global $APILinkedIn_ClientId,$APILinkedIn_ClientSecret;\n			global $APIInstagram_ClientId,$APIInstagram_ClientSecret;\n			global $APIDropbox_ClientId,$APIDropbox_ClientSecret;\n			global $APIMicrosoft_ClientId,$APIMicrosoft_ClientSecret;\n			global $APIFlickr_ClientId,$APIFlickr_ClientSecret;\n			global $APITwitter_ClientId,$APITwitter_ClientSecret;\n			global $APIFoursquare_ClientId,$APIFoursquare_ClientSecret;\n			global $APIXING_ClientId,$APIXING_ClientSecret;\n			global $APISalesforce_ClientId,$APISalesforce_ClientSecret;\n			global $APIBitbucket_ClientId,$APIBitbucket_ClientSecret;\n			global $APIYahoo_ClientId,$APIYahoo_ClientSecret;\n			global $APIBox_ClientId,$APIBox_ClientSecret;\n			global $APIDisqus_ClientId,$APIDisqus_ClientSecret;\n			global $APIEventful_ClientId,$APIEventful_ClientSecret;\n			global $APISurveyMonkey_ClientId,$APISurveyMonkey_ClientSecret;\n			global $APIRightSignature_ClientId,$APIRightSignature_ClientSecret;\n			global $APIFitbit_ClientId,$APIFitbit_ClientSecret;\n			global $APIScoopIt_ClientId,$APIScoopIt_ClientSecret;\n			global $APITumblr_ClientId,$APITumblr_ClientSecret;\n			global $APIStockTwits_ClientId,$APIStockTwits_ClientSecret;\n			global $APIVK_ClientId,$APIVK_ClientSecret;\n			global $APIWithings_ClientId,$APIWithings_ClientSecret;\n			global $API37Signals_ClientId,$API37Signals_ClientSecret;\n			global $APIAmazon_ClientId,$APIAmazon_ClientSecret;\n			global $APIAOL_ClientId,$APIAOL_ClientSecret;\n			global $APIBitly_ClientId,$APIBitly_ClientSecret;\n			global $APIBuffer_ClientId,$APIBuffer_ClientSecret;\n			global $APICopy_ClientId,$APICopy_ClientSecret;\n			global $APIDailymotion_ClientId,$APIDailymotion_ClientSecret;\n			global $APIDiscogs_ClientId,$APIDiscogs_ClientSecret;\n			global $APIEtsy_ClientId,$APIEtsy_ClientSecret;\n			global $APIGarmin_ClientId,$APIGarmin_ClientSecret;\n			global $APIGarmin2Legged_ClientId,$APIGarmin2Legged_ClientSecret;\n			global $APIiHealth_ClientId,$APIiHealth_ClientSecret;\n			global $APIimgur_ClientId,$APIimgur_ClientSecret;\n			global $APIInfusionsoft_ClientId,$APIInfusionsoft_ClientSecret;\n			global $APIIntuit_ClientId,$APIIntuit_ClientSecret;\n			global $APIJawbone_ClientId,$APIJawbone_ClientSecret;\n			global $APILivecoding_ClientId,$APILivecoding_ClientSecret;\n			global $APIMailChimp_ClientId,$APIMailChimp_ClientSecret;\n			global $APIMavenlink_ClientId,$APIMavenlink_ClientSecret;\n			global $APIMeetup_ClientId,$APIMeetup_ClientSecret;\n			global $APIMicrosoftOpenIDConnect_ClientId,$APIMicrosoftOpenIDConnect_ClientSecret;\n			global $APIMisfit_ClientId,$APIMisfit_ClientSecret;\n			global $APIoDesk_ClientId,$APIoDesk_ClientSecret;\n			global $APIOdnoklassniki_ClientId,$APIOdnoklassniki_ClientSecret;\n			global $APIPaypal_ClientId,$APIPaypal_ClientSecret;\n			global $APIPinterest_ClientId,$APIPinterest_ClientSecret;\n			global $APIRdio_ClientId,$APIRdio_ClientSecret;\n			global $APIReddit_ClientId,$APIReddit_ClientSecret;\n			global $APIRunKeeper_ClientId,$APIRunKeeper_ClientSecret;\n			global $APIUber_ClientId,$APIUber_ClientSecret;\n			global $APITeamViewer_ClientId,$APITeamViewer_ClientSecret;\n			global $APIVimeo_ClientId,$APIVimeo_ClientSecret;\n			global $APIWordpress_ClientId,$APIWordpress_ClientSecret;\n			global $APIXero_ClientId,$APIXero_ClientSecret;\n			global $APIYammer_ClientId,$APIYammer_ClientSecret;\n			global $APIYandex_ClientId,$APIYandex_ClientSecret;\n\n			//Determina si se tiene un login SAML activado\n			$RegistroSAML=PCO_EjecutarSQL(\"SELECT * FROM core_samlconector WHERE activado=\'S\' ORDER BY nombre_conector LIMIT 0,1 \")->fetch();\n			$CadenaMargen_LoginSAML=\"\";\n			$CadenaOcultamiento_LoginEstandarPRE=\"\";\n			$CadenaOcultamiento_LoginEstandarPOS=\"\";\n			if ($RegistroSAML[\"nombre_conector\"]!=\"\")\n				{\n					//Presenta boton para ir al login estandar de aplicacion\n					$CadenaOcultamiento_LoginEstandarPRE=\"<details><summary><div id=\'PCO_BotonLoginEstandar\' onclick=\'$(\\\"#PCO_BotonLoginEstandar\\\").hide(); $(\\\"#PCO_MarcoLoginSAML\\\").hide();\' class=\'btn btn-info\'><b>{$MULTILANG_LoginClasico}</b> ($MULTILANG_Aplicacion)</div></summary>\";\n					$CadenaOcultamiento_LoginEstandarPOS=\"</details>\";\n					$CadenaMargen_LoginSAML=\"<br><br>\";\n					$CadenaOpcionesSAML=\"\";\n					$NombreConectorSSO=$RegistroSAML[\"nombre_conector\"];\n					$ImagenConectorSSO=\"\";\n					if ($RegistroSAML[\"ruta_logo\"]!=\"\")\n						{\n							$ImagenConectorSSO=explode(\"|\",$RegistroSAML[\"ruta_logo\"]);\n							$ImagenConectorSSO=$ImagenConectorSSO[0];\n							$ImagenConectorSSO=\"<img style=\'border-radius: 5%;\' width=\'50\' height=\'50\' src=\'{$ImagenConectorSSO}\'>\";\n						}\n					$EnlaceSSO=\"inc/php-saml/practico/?sso\";\n					$CadenaOpcionesSAML.=\"\n						<br><a href=\'{$EnlaceSSO}\' style=\'text-decoration:none;\'>\n							<div>\n								{$ImagenConectorSSO}\n							</div>\n							<div>\n								{$NombreConectorSSO}\n							</div>\n						</a>\";\n					$CadenaOpcionesSAML=\"{$CadenaOpcionesSAML}<br>\";\n				}\n			\n\n\n			$CadenaProveedoresOAuthDisponibles=PCO_GenerarOpcionesProveedoresOAuth();\n			//Si se desea ubicar las opciones oAuth a traves de un boton genera el marco flotante correspondiente\n			if ($UbicacionProveedoresOAuth==\'0\')\n				{\n					?>\n						<!-- Modal LoginOauth -->\n						<div class=\"modal fade\" id=\"myModalLOGINOAUTH\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n						  <div class=\"modal-dialog\">\n							<div class=\"modal-content\">\n							  <div class=\"modal-body mdl-primary\">\n								<?php\n										PCO_Mensaje($MULTILANG_OauthButt,$MULTILANG_LoginOauthDes,\'\',\'fa fa-info-circle fa-3x text-info\',\'alert alert-info\');\n								?>\n								<table class=\"table\">\n										<tr><td align=\"center\"><font face=\"Verdana,Tahoma, Arial\" style=\"font-size: 9px;\">\n											<?php\n												echo $CadenaProveedoresOAuthDisponibles;\n											?>\n										</td></tr>\n								</table>\n							  </div>\n							  <div class=\"modal-footer\">\n								<button class=\"btn btn-info\" type=\"button\" data-dismiss=\"modal\">\n									<?php echo $MULTILANG_LoginClasico; ?> <?php echo $NombreRAD; ?>\n									{<i class=\"fa fa-paypal\"></i>}\n								</button>\n								<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?php echo $MULTILANG_Cerrar; ?> {<i class=\"fa fa-keyboard-o\"></i> Esc}</button>\n							  </div>\n							</div>\n						  </div>\n						</div>\n					<?php\n				}\n			?>\n\n\n				<!--Login Estandar-->\n				<div id=\"PCODIV_BarraArribaLogin\"></div>\n\n				<div class=\"row\">\n					<?php echo $CadenaMargen_LoginSAML; ?>\n					<div class=\"col-xs-12 col-sm-4 col-md-4 col-lg-4 col-xs-offset-0 col-sm-offset-4 col-md-offset-4 col-lg-offset-4\" >\n					<br>\n					<div id=\"PCODIV_ArribaLogin\"></div>\n					<div id=\"EnfasisLoginZoom\" class=\"EnfasisLoginZoom\" style=\"box-shadow: 3px 3px 3px gray;\">\n						<div class=\"panel panel-default\">\n							<div class=\"panel-heading\">\n								<h3 class=\"panel-title\"><?php echo $MULTILANG_TituloLogin; ?></h3>\n							</div>\n							<div align=center class=\"panel-body btn-xs\">\n					<?php echo $CadenaOcultamiento_LoginEstandarPRE; ?>\n\n									<form role=\"form\" name=\"login_usuario\" method=\"POST\" action=\"<?php echo $ArchivoCORE; ?>\" style=\"margin-top: 0px; margin-bottom: 0px;\" onsubmit=\"if (document.login_usuario.captcha.value==\'\' || document.login_usuario.uid.value==\'\' || document.login_usuario.clave.value==\'\') { alert(\'Debe diligenciar los valores necesarios (Usuario, Clave y Codigo de seguridad).\'); return false; }\">\n									<input type=\"Hidden\" name=\"PCO_Accion\" value=\"Iniciar_login\">\n										<div class=\"form-group\">\n											<img name=\"img_login\" id=\"img_login\" width=\"100%\" style=\"max-width:232px; max-height:160px;\" src=\"img/practico_login.png?<?php echo filemtime(\'img/practico_login.png\'); ?>\" alt=\"\" border=\"0\"><br><br>\n										</div>\n										<div class=\"form-group input-group\">\n											<span class=\"input-group-addon\"><i class=\"fa fa-user fa-fw\"></i></span>\n											<input name=\"uid\" value=\"<?php echo $AUTO_uid; ?>\" type=\"text\" class=\"form-control\" placeholder=\"<?php echo $MULTILANG_Usuario; ?>\" AutoCompleteType=\"Disabled\" autocomplete=\"Off\">\n										</div>\n										<div class=\"form-group input-group\">\n											<span class=\"input-group-addon\"><i class=\"fa fa-key fa-fw\"></i></span>\n											<input name=\"clave\" value=\"<?php echo $AUTO_clave; ?>\" type=\"password\" class=\"form-control\" placeholder=\"<?php echo $MULTILANG_Contrasena; ?>\" AutoCompleteType=\"Disabled\" autocomplete=\"Off\">\n										</div>\n\n										<div id=\"PCODIV_PostClaveLogin\"></div>\n\n										<?php\n											//Presenta selector de idiomas si esta habilitado\n											if ($IdiomaEnLogin==1)\n												{\n										?>\n											<div class=\"form-group input-group\">\n												<span class=\"input-group-addon\"><i class=\"fa fa-language fa-fw\"></i></span>\n												<select id=\"idioma_login\" name=\"idioma_login\" class=\"selectpicker\" >\n													<?php\n													// Incluye archivos de idioma para ser seleccionados\n													$path_idiomas=\"inc/practico/idiomas/\";\n													$directorio_idiomas=opendir($path_idiomas);\n													$IdiomaPredeterminadoActual=$IdiomaPredeterminado;\n													while (($PCOVAR_Elemento=readdir($directorio_idiomas))!=false)\n														{\n															//Lo procesa solo si es un archivo diferente del index\n															if (!is_dir($path_idiomas.$PCOVAR_Elemento) && $PCOVAR_Elemento!=\".\" && $PCOVAR_Elemento!=\"..\"  && $PCOVAR_Elemento!=\"index.html\")\n																{\n																	include($path_idiomas.$PCOVAR_Elemento);\n																	//Establece espanol como predeterminado\n																	$seleccion=\"\";\n																	$valor_opcion=str_replace(\".php\",\"\",$PCOVAR_Elemento);\n																	if ($valor_opcion==$IdiomaPredeterminadoActual) $seleccion=\"SELECTED\";\n																	//Presenta la opcion\n																	echo \'<option value=\"\'.$valor_opcion.\'\" \'.$seleccion.\'>\'.$MULTILANG_DescripcionIdioma.\' (\'.$PCOVAR_Elemento.\')</option>\';\n																}\n														}\n													//Vuelve a cargar el predeterminado actual\n													include(\"inc/practico/idiomas/\".$IdiomaPredeterminado.\".php\");\n													?>\n												</select>\n											</div>\n											<?php\n													}\n											?>\n\n\n										<?php\n											//Si el captcha es tradicional\n											if ($CaracteresCaptcha>0 && ($TipoCaptchaLogin==\"tradicional\" || $TipoCaptchaLogin==\"\"))\n												{\n													echo \'<div class=\"well\">\n														<div class=\"form-group col-xs-12\">\n															\'.$MULTILANG_CodigoSeguridad.\':\n															<img src=\"core/captcha.php\">\n														</div>\n														<div class=\"form-group input-group input-group-sm\">\n															<span class=\"input-group-addon\"><i class=\"fa fa-hand-o-right fa-fw\"></i></span>\n															<input type=\"text\" name=\"captcha\" maxlength=6 class=\"form-control\"  placeholder=\"\'.$MULTILANG_IngreseCodigoSeguridad.\'\">\n														</div>\n														</div>\';\n												}\n\n											//Si el captcha es visual\n											if ($CaracteresCaptcha>0 && $TipoCaptchaLogin==\"visual\")\n												{\n													//Llama de todas formas al archivo generador de captcha, solo que este se usa para la variable de sesion solamente\n													include (\"core/captcha.php\");\n												}\n										?>\n\n										<div class=\"form-group input-group input-group-sm col-xs-12\">\n											<a class=\"btn btn-success btn-block\" href=\"javascript:document.login_usuario.submit();\"><i class=\"fa fa-check-circle\"></i> <?php echo $MULTILANG_Ingresar; ?></a>\n										</div>\n									</form>\n\n\n										<?php\n											// Muestra boton de login por red social si aplica\n											if ($CadenaProveedoresOAuthDisponibles!=\"\")\n												{\n													//Si se desea ubicar las opciones oAuth a traves de un boton genera el marco flotante correspondiente\n													if ($UbicacionProveedoresOAuth==\'0\')\n														{\n															echo \'<hr>\n																<a id=\"boton_login_oauth\" data-toggle=\"modal\" href=\"#myModalLOGINOAUTH\" class=\"btn btn-info  btn-block\">\n																	<div>\n																		\'.$MULTILANG_OauthLogin.\'<br>\n																		<i class=\"fa fa-2x fa-facebook-square\"></i>\n																		<i class=\"fa fa-2x fa-google-plus-square\"></i>\n																		<i class=\"fa fa-2x fa-twitter\"></i>\n																		<i class=\"fa fa-2x fa-linkedin-square\"></i>\n																		<i class=\"fa fa-2x fa-dropbox\"></i>\n																	</div>\n																</a>\';\n\n															//Si esta predeterminado mostrar las opciones al comienzo entonces hace el trigger sobre el enlace\n															if ($Auth_PresentarOauthInicio==1)\n																{\n																	echo \'<script language=\"JavaScript\">\n																	$( document ).ready(function() {\n																		$(\"#boton_login_oauth\").trigger(\"click\");\n																		});\n																	</script>\';\n																}\n														}\n\n													//Si se desean las opciones directamente en el login\n													if ($UbicacionProveedoresOAuth==\'1\')\n														{\n															echo \'\n																<table class=\"table\">\n																		<tr><td align=\"center\">\';\n																		echo \"<b><i><font color=lightgray>\".$MULTILANG_OauthLogin.\":</font></i></b><br>\";\n															echo $CadenaProveedoresOAuthDisponibles;\n															echo \'\n																		</td></tr>\n																</table>\';\n														}\n												}\n										?>\n									<?php\n										//PCO_Mensaje($MULTILANG_Importante,$MULTILANG_AccesoExclusivo,\'\',\'fa fa-info-circle fa-3x texto-azul\',\'alert alert-info\');\n									?>\n\n									<div class=\"row\">\n										<div class=\"col-md-6\">\n											<?php\n												//Presenta opciones de recuperacion solamente cuando el motor de autenticacion sea practico\n												if ($Auth_TipoMotor==\"practico\" && $Auth_PermitirAutoRegistro==1)\n													{\n											?>\n														<br>\n														<form name=\"auto_registro\" id=\"auto_registro\" action=\"<?php echo $ArchivoCORE; ?>\" method=\"POST\"  style=\"display:inline; height: 0px; border-width: 0px; width: 0px; padding: 0; margin: 0;\">\n														<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_AgregarUsuarioAutoregistro\">\n														</form>\n														<a class=\"btn btn-xs\" onClick=\"document.auto_registro.submit();\">\n															<i class=\"typcn fa typcn-user-add\"></i>\n															<?php echo $MULTILANG_Registrarme; ?>\n														</a>\n											<?php\n													}\n											?>\n										</div>\n										<div class=\"col-md-6\">\n											<?php\n												//Presenta opciones de recuperacion solamente cuando el motor de autenticacion sea practico\n												if ($Auth_TipoMotor==\"practico\" && $Auth_PermitirReseteoClaves==1)\n													{\n											?>\n														<br>\n														<form name=\"recuperacion\" id=\"recuperacion\" action=\"<?php echo $ArchivoCORE; ?>\" method=\"POST\"  style=\"display:inline; height: 0px; border-width: 0px; width: 0px; padding: 0; margin: 0;\">\n														<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_RecuperarContrasena\">\n														<input type=\"Hidden\" name=\"PCO_SubAccion\" value=\"formulario_recuperacion\">\n														</form>\n														<a class=\"btn btn-xs\" onClick=\"document.recuperacion.submit();\">\n															<i class=\"fa fa-unlock-alt\"></i>\n															<?php echo $MULTILANG_OlvideClave; ?>\n														</a>\n											<?php\n													}\n											?>\n										</div>\n									</div>\n\n\n							<script language=\"JavaScript\"> login_usuario.uid.focus(); </script>\n\n					<?php echo $CadenaOcultamiento_LoginEstandarPOS; ?>\n					<div id=\"PCO_MarcoLoginSAML\">\n						<?php echo $CadenaOpcionesSAML; ?>	\n					</div>\n					\n\n							</div> <!-- /panel-body -->\n						</div>\n					</div>  <!--FIN Class EnfasisLoginZoom -->\n\n					<div id=\"PCODIV_AbajoLogin\"></div>\n\n					</div>  <!--FIN Class col -->\n				</div>  <!--FIN Class row -->\n				<!--FIN Login Estandar-->\n				<div id=\"PCODIV_BarraAbajoLogin\"></div>\n\n<?php\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Procedure: PCO_AbrirVentana\n	Abre los espacios de trabajo dinamicos sobre el contenedor principal donde se despliega informacion\n\n	Variables de entrada:\n\n	titulo - Nombre de la ventana a visualizar en la parte superior.\n	tipo_panel - Recibe el tipo de panel bootstrap a crear:\n\n	* panel-primary,panel-success,panel-info,panel-warning,panel-danger\n	* col-md-8 col-md-offset-2 col-sm-8 col-sm-offset-\n	* Otros asociados a clases de bootstrap\n\n	barra_herramientas - Lista de barras de herramientas a ser impresas\n\n	Ver tambien:\n	<PCO_CerrarVentana>\n*/\nfunction PCO_AbrirVentana($titulo,$tipo_panel=\"panel-default\",$css_personalizado=\'\',$barra_herramientas=\'\')\n	{\n		echo \'\n			<div class=\"panel \'.$tipo_panel.\'\" style=\"\'.$css_personalizado.\'\">\n			<div class=\"panel-heading\">\'.$titulo;\n		if ($barra_herramientas!=\'\')\n			echo $barra_herramientas;\n		echo \'</div>\n			<div class=\"panel-body\">\';\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CerrarVentana\n	Cierra los espacios de trabajo dinamicos generados por <PCO_AbrirVentana>\n\n	Ver tambien:\n	<PCO_AbrirVentana>\n*/\nfunction PCO_CerrarVentana()\n	{\n		echo \'\n		  </div>  <!-- CIERRA panel-body -->\n		</div>  <!-- CIERRA panel panel-default -->\';\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Procedure: PCO_AbrirBarraEstado\n	Abre los espacios para despliegue de informacion en la parte inferior de los objetos tales como botones o mensajes\n\n	Ver tambien:\n	<PCO_CerrarBarraEstado>\n*/\nfunction PCO_AbrirBarraEstado($DEPRECATED_alineacion=\"CENTER\")\n	{\n		echo \'<div class=\"panel-footer\">\';\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CerrarBarraEstado\n	Cierra los espacios de trabajo dinamicos generados por <PCO_AbrirBarraEstado>\n\n	Ver tambien:\n	<PCO_AbrirBarraEstado>\n*/\nfunction PCO_CerrarBarraEstado()\n  {\n		echo \'</div> <!-- CIERRA panel-footer -->\';\n  }\n\n\n\n########################################################################\n########################################################################\n/*\n	Procedure: PCO_AbrirDialogoModal\n	Crea un dialogo modal que puede ser activado luego por un anchor <a>\n\n	Variables de entrada:\n\n	titulo - Nombre de la ventana a visualizar en la parte superior.\n	tipo_panel - Recibe el tipo de panel bootstrap a crear:\n\n	* panel-primary,panel-success,panel-info,panel-warning,panel-danger\n	* col-md-8 col-md-offset-2 col-sm-8 col-sm-offset-\n	* Otros asociados a clases de bootstrap\n\n	Ver tambien:\n	<PCO_CerrarDialogoModal>\n*/\nfunction PCO_AbrirDialogoModal($identificador,$titulo=\"\",$estilo_modal=\"\",$impresion_directa=1,$subtitulo=\"\")\n	{\n		$salida= \'\n			<div class=\"modal fade \'.$estilo_modal.\'\" id=\"\'.$identificador.\'\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n				<div class=\"modal-dialog\">\n					<div class=\"modal-content\">\n						<div class=\"modal-header\">\n							<button type=\"button\" class=\"close\" data-dismiss=\"modal\"><span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">Close</span></button>\n							<h4 class=\"modal-title\" id=\"myModalLabel\">\'.$titulo.\'</h4>\';\n\n		//Si se recibe un subtitulo lo agrega al modal\n		if ($subtitulo!=\"\")\n			$salida.=\'<h6 id=\"myModalLabelSubtitulo\"><i>\'.$subtitulo.\'</i></h6>\';\n\n		$salida.=\'				</div>\n						<div class=\"modal-body mdl-primary\">\';\n		if($impresion_directa==1)\n			echo $salida;\n		else\n			return $salida;\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CerrarDialogoModal\n	Cierra los espacios de trabajo por <abrir_modal>\n\n	Ver tambien:\n	<abrir_modal>\n*/\nfunction PCO_CerrarDialogoModal($contenido_piepagina,$impresion_directa=1)\n	{\n		$salida= \'\n							</div>\n							<div class=\"modal-footer\">\n								\'.$contenido_piepagina.\'\n							</div>\n						</div>\n					</div>\n				</div>\';\n		if($impresion_directa==1)\n			echo $salida;\n		else\n			return $salida;\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ObtenerMicrotime\n	Obtiene un tiempo en microsegundos utilizado para calcular tiempos de inicio y fin de operaciones\n*/\nfunction PCO_ObtenerMicrotime()\n	{\n		list($useg, $seg) = explode(\" \", microtime());\n		return ((float)$useg + (float)$seg);\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_Mensaje\n	Funcion generica para la presentacion de mensajes.  Ver variables para personalizacion.\n\n	Variables de entrada:\n\n		titulo - Texto que aparece en resaltado como encabezado del texto.  Acepta modificadores HTML.\n		texto - Mensaje completo a desplegar en formato de texto normal.  Acepta modificadores HTML.\n		icono - Formato Awesome Fonts o Iconos de Bootstrap\n		ancho - Ancho del espacio de trabajo definido en pixels o porcentaje sobre el contenedor principal.\n		estilo - Especifica el punto donde sera publicado el mensaje para definir la hoja de estilos correspondiente.\n*/\nfunction PCO_Mensaje($titulo,$texto,$DEPRECATED_ancho=\"\",$icono,$estilo)\n	{\n		global $MULTILANG_Cerrar;\n		echo \'<div class=\"\'.$estilo.\'\" role=\"alert\">\n			<i class=\"\'.$icono.\' pull-left\"></i>\n			<button type=\"button\" class=\"close\" data-dismiss=\"alert\"><span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">\'.$MULTILANG_Cerrar.\'</span></button>\n			<strong>\'.$titulo.\'</strong><br>\'.$texto.\'\n		</div>\';\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_SelectorObjetosMenu\n	Despliega marco para seleccionar objetos de formulario e informes durante creacion de menues\n\n	Ver tambien:\n\n		<PCOFUNC_AdministrarMenu> | <detalles_menu>\n*/\nfunction PCO_SelectorObjetosMenu()\n	{\n		global $MULTILANG_SeleccioneUno,$MULTILANG_Formularios,$MULTILANG_MnuHlpComandoInf,$MULTILANG_Si,$MULTILANG_No,$MULTILANG_Informes,$MULTILANG_FrmVentana,$MULTILANG_Guardar,$MULTILANG_Cerrar;\n		global $ListaCamposSinID_formulario,$ListaCamposSinID_informe,$TablasCore;\n		global $registro_informes;\n		?>\n			<!-- Modal Selector de objetos -->\n			<div class=\"modal fade\" id=\"myModalSelectorObjetos\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n			  <div class=\"modal-dialog\">\n				<div class=\"modal-content\">\n				  <div class=\"modal-header\">\n					<button type=\"button\" class=\"close\" data-dismiss=\"modal\"><span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">Close</span></button>\n					<h4 class=\"modal-title\" id=\"myModalLabel\"><?php echo $MULTILANG_SeleccioneUno; ?></h4>\n				  </div>\n				  <div class=\"modal-body mdl-primary\">\n\n					<form name=\"selector_objetos\" method=\"POST\">\n\n						<label for=\"objeto_seleccionado\"><?php echo $MULTILANG_Formularios; ?> / <?php echo $MULTILANG_Informes; ?>:</label>\n						<select id=\"objeto_seleccionado\" name=\"objeto_seleccionado\" class=\"form-control\" >\n							<option value=\"\"><?php echo $MULTILANG_SeleccioneUno; ?></option>\n							<optgroup label=\"<?php echo $MULTILANG_Formularios; ?>\">\n								<?php\n									$consulta_forms=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario.\" FROM \".$TablasCore.\"formulario WHERE id>=0 ORDER BY titulo\");\n									while($registro_forms = $consulta_forms->fetch())\n										echo \'<option value=\"frm:\'.$registro_forms[\"id\"].\'\">(Id.\'.$registro_forms[\"id\"].\') \'.$registro_forms[\"titulo\"].\'</option>\';\n								?>\n							</optgroup>\n							<optgroup label=\"<?php echo $MULTILANG_Informes; ?>\">\n								<?php\n									$consulta_informs=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id>=0 ORDER BY titulo\");\n									while($registro_informes = $consulta_informs->fetch())\n										echo \'<option value=\"inf:\'.$registro_informes[\"id\"].\'\">(Id.\'.$registro_informes[\"id\"].\') \'.$registro_informes[\"titulo\"].\'</option>\';\n								?>\n							</optgroup>\n						</select>\n\n						<label for=\"definir_ventana_propia\"><?php echo $MULTILANG_FrmVentana; ?></label>\n						<select id=\"definir_ventana_propia\" name=\"definir_ventana_propia\" class=\"form-control\" >\n							<option value=\":1\"><?php echo $MULTILANG_Si; ?></option>\n							<option value=\":0\"><?php echo $MULTILANG_No; ?></option>\n						</select>\n						<br>\n						<?php echo $MULTILANG_MnuHlpComandoInf; ?>\n					</form>\n\n				  </div>\n				  <div class=\"modal-footer\">\n					<button onClick=\"document.PCO_FormItemMenu.comando.value=document.selector_objetos.objeto_seleccionado.options[document.selector_objetos.objeto_seleccionado.selectedIndex].value + document.selector_objetos.definir_ventana_propia.options[document.selector_objetos.definir_ventana_propia.selectedIndex].value;\" type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"><?php echo $MULTILANG_Guardar; ?></button>\n					<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?php echo $MULTILANG_Cerrar; ?> {<i class=\"fa fa-keyboard-o\"></i> Esc}</button>\n				  </div>\n				</div>\n			  </div>\n			</div>\n<?php\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_SelectorIconosAwesome\n	Despliega marco para seleccionar iconos\n\n	Ver tambien:\n\n		<PCOFUNC_AdministrarMenu> | <detalles_menu>\n*/\nfunction PCO_SelectorIconosAwesome()\n	{\n		global $MULTILANG_MnuSelImagen,$MULTILANG_MnuHlpAwesome,$MULTILANG_Cerrar;\n?>\n\n			<div class=\"modal fade modal-wide\" id=\"myModalSelectorIconos\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n			  <div class=\"modal-dialog\">\n				<div class=\"modal-content\">\n				  <div class=\"modal-header\">\n					<button type=\"button\" class=\"close\" data-dismiss=\"modal\"><span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">Close</span></button>\n					<h4 class=\"modal-title\" id=\"myModalLabel\"><?php echo $MULTILANG_MnuSelImagen; ?></h4>\n				  </div>\n				  <div class=\"modal-body mdl-primary\">\n\n					<table class=\"table table-responsive table-unbordered btn-xs\">\n						<tr>\n							<td>GlyphIcon</td>\n							<td>IonIcon</td>\n							<td>FontAwesome</td>\n							<td>WeatherIcon</td>\n							<td>MapIcon</td>\n							<td>OctIcon</td>\n							<td>TypIcon</td>\n							<td>ElusiveIcon</td>\n						</tr>\n						<tr>\n							<td><button id=\"lib_glyphicon\" class=\"btn btn-default\" data-iconset=\"glyphicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_ionicon\" class=\"btn btn-default\" data-iconset=\"ionicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_fontawesome\" class=\"btn btn-default\" data-iconset=\"fontawesome\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_weathericon\" class=\"btn btn-default\" data-iconset=\"weathericon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_mapicon\" class=\"btn btn-default\" data-iconset=\"mapicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_octicon\" class=\"btn btn-default\" data-iconset=\"octicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_typicon\" class=\"btn btn-default\" data-iconset=\"typicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n							<td><button id=\"lib_elusiveicon\" class=\"btn btn-default\" data-iconset=\"elusiveicon\" role=\"iconpicker\" data-search=\"false\" data-search-text=\"Buscar...\" data-rows=\"5\" data-cols=\"8\"></button></td>\n						</tr>\n					</table>\n\n				  </div>\n				  <div class=\"modal-footer\">\n					<button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"><?php echo $MULTILANG_Cerrar; ?> {<i class=\"fa fa-keyboard-o\"></i> Esc}</button>\n				  </div>\n				</div>\n			  </div>\n			</div>\n<?php\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoTextoCorto\n	Genera el codigo HTML y CSS correspondiente a un campo de texto (text) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n		formulario - ID unico del formulario al cual pertenece el objeto\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoTextoCorto($registro_campos,$registro_datos_formulario,$formulario,$en_ventana)\n	{\n		global $TablasCore,$PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD,$IdiomaPredeterminado;\n		global $funciones_activacion_datepickers;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio,$MULTILANG_Contrasena;\n		global $TabIndex_Elemento;\n\n		//Busca datos del formulario\n		$RegistroDisenoFormulario=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario WHERE id=?\", \"$formulario\")->fetch();\n		$IdHTMLFormulario=$RegistroDisenoFormulario[\"id_html\"];\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n		$tipo_entrada=\"text\"; // Se cambia a date si se trata de un campo con validacion de fecha, si se cambia a password es tipo clave...\n\n		// Especifica longitud visual de campo en caso de haber sido definida\n		$cadena_longitud_visual=\' size=\"20\" \';\n		if ($registro_campos[\"ancho\"]!=\"0\")\n			$cadena_longitud_visual=\' size=\"\'.$registro_campos[\"ancho\"].\'\" \';\n\n		// Especifica longitud maxima de caracteres en caso de haber sido definida\n		$cadena_longitud_permitida=\' \';\n		if ($registro_campos[\"maxima_longitud\"]!=0)\n			$cadena_longitud_permitida=\' maxlength=\"\'.$registro_campos[\"maxima_longitud\"].\'\" \';\n\n		// Especifica textos de placeholder si existen\n		$cadena_placeholder=\'\';\n		if ($registro_campos[\"valor_placeholder\"]!=\"\")\n			$cadena_placeholder=\' placeholder=\"\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"valor_placeholder\"],$registro_datos_formulario).\'\" \';\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=\' value=\"\'.$registro_campos[\"valor_predeterminado\"].\'\" \';\n		//Reemplaza segundas variables sobre valores predeterminados\n		$cadena_valor=\' value=\"\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"valor_predeterminado\"],$registro_datos_formulario).\'\" \';\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		//Conserva compatibilidad hacia atras en versiones donde las variables comienzan solamente con el signo pesos y se permite solo una\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=\' value=\"\'.$valor_variable.\'\" \';\n					}\n			}\n\n		//Evalua si el campo en cuestion pertenece a la tabla.  Si es asi entonces intenta buscar su valor desde registro y cambiar el predeterminado.\n		if (PCO_ExisteCampoTabla($nombre_campo,$RegistroDisenoFormulario[\"tabla_datos\"])==true)\n			{\n				$valor_variable_escapada=$registro_datos_formulario[\"$nombre_campo\"];\n				//$valor_variable_escapada=addslashes ( \'\"\'.$valor_variable_escapada.\'\"\' );\n				//$valor_variable_escapada=htmlentities($valor_variable_escapada); //Presenta la cadena como caracteres especiales HTML para ayudar a presentar correctamente tildes, comillas y barras\n				if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=\' value=\"\'.$valor_variable_escapada.\'\" \';\n			}\n\n		// Define cadenas en caso de tener validaciones\n		$cadena_validacion=\'\';\n		if ($registro_campos[\"validacion_datos\"]!=\"\" && $registro_campos[\"validacion_datos\"]!=\"fecha\" && $registro_campos[\"validacion_datos\"]!=\"hora\" && $registro_campos[\"validacion_datos\"]!=\"fechahora\" && $registro_campos[\"validacion_datos\"]!=\"fechaxanos\" && $registro_campos[\"validacion_datos\"]!=\"fechahorafull\")\n			$cadena_validacion=\' onkeypress=\"return PCOJS_ValidarTeclado(event, \\\'\'.$registro_campos[\"validacion_datos\"].\'\\\', \\\'\'.$registro_campos[\"validacion_extras\"].\'\\\');\" \';\n\n		$cadena_complementaria_datepicker=\'\';\n		$cadena_ID_datepicker=\'\';\n		$cadena_clase_datepicker=\'\';\n		$cadena_ID_datepickerEspecifica=\'\';\n		//Genera cadenas especificas segun el datepicker requerido\n		if ($registro_campos[\"validacion_datos\"]==\"fecha\" || $registro_campos[\"validacion_datos\"]==\"hora\" || $registro_campos[\"validacion_datos\"]==\"fechahora\" || $registro_campos[\"validacion_datos\"]==\"fechaxanos\" || $registro_campos[\"validacion_datos\"]==\"fechahorafull\")\n			{\n				if ($registro_campos[\"validacion_datos\"]==\"fecha\")\n					{\n						$cadena_ID_datepickerEspecifica=\"\n								pickTime: false\";\n						$cadena_complementaria_datepicker=\' data=\"DateTimePicker\" data-date-format=\"YYYY-MM-DD\" \';\n					}\n				if ($registro_campos[\"validacion_datos\"]==\"fechaxanos\")\n					{\n						$cadena_ID_datepickerEspecifica=\"\n								viewMode: \'years\',\n								pickTime: false\";\n						$cadena_complementaria_datepicker=\' data=\"DateTimePicker\" data-date-format=\"YYYY-MM-DD\" \';\n					}\n				if ($registro_campos[\"validacion_datos\"]==\"hora\")\n					{\n						$cadena_ID_datepickerEspecifica=\"\n								pickDate: false,\n								pickTime: true\";\n						$cadena_complementaria_datepicker=\' data=\"DateTimePicker\" data-date-format=\"HH:mm:00\" \';\n					}\n				if ($registro_campos[\"validacion_datos\"]==\"fechahora\")\n					{\n						$cadena_ID_datepickerEspecifica=\"\n								pickDate: true,\n								pickTime: true\";\n						$cadena_complementaria_datepicker=\' data=\"DateTimePicker\" data-date-format=\"YYYY-MM-DD HH:mm:ss\" \';\n					}\n				if ($registro_campos[\"validacion_datos\"]==\"fechahorafull\")\n					{\n						$cadena_ID_datepickerEspecifica=\"\n								sideBySide: true,\n								pickDate: true,\n								pickTime: true\";\n						$cadena_complementaria_datepicker=\' data=\"DateTimePicker\" data-date-format=\"YYYY-MM-DD HH:mm:ss\" \';\n					}\n				//Genera parametros finales para los datepicker\n				$cadena_ID_datepicker=\' id=\"DatePicker_\'.$registro_campos[\"campo\"].\'\" \';\n				$cadena_clase_datepicker=\' date \';\n				@$funciones_activacion_datepickers.=\"\n					$(function () {\n						$(\'#DatePicker_\".$registro_campos[\"campo\"].\"\').datetimepicker({\n							//locale: \'es\',\n							language: \'$IdiomaPredeterminado\',\n							\".$cadena_ID_datepickerEspecifica.\"\n						});\n					});\";\n			}\n\n		// Si el campo es de tipo clave cambia el input a password\n		if ($registro_campos[\"tipo\"]==\"texto_clave\")\n			{\n				$tipo_entrada=\"password\";\n			}\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label id=\"PCOEtiqueta_\'.$registro_campos[\"campo\"].\'\" for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos style=\"display:inline;\"\n		$salida.=\'<div class=\"form-group input-group \'.$cadena_clase_datepicker.\'\" \'.$cadena_ID_datepicker.\'>\';\n		// Muestra el campo\n		$salida.=\'<input tabindex=\'.$TabIndex_Elemento.\' type=\"\'.$tipo_entrada.\'\" id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" \'.$cadena_valor.\' \'.$cadena_longitud_visual.\' \'.$cadena_longitud_permitida.\' class=\"form-control \" \'.$cadena_validacion.\' \'.$registro_campos[\"solo_lectura\"].\' \'.$cadena_complementaria_datepicker.\'  \'.$registro_campos[\"personalizacion_tag\"].\' \'.$cadena_placeholder.\' >\';\n\n		// Muestra boton de busqueda cuando el campo sea usado para esto\n		if ($registro_campos[\"etiqueta_busqueda\"]!=\"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n					$salida.= \'<input type=\"Button\" class=\"btn btn-default btn-xs\" value=\"\'.$registro_campos[\"etiqueta_busqueda\"].\'\" onclick=\"document.\'.$IdHTMLFormulario.\'.PCO_ValorBusquedaBD.value=document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value;document.\'.$IdHTMLFormulario.\'.PCO_Accion.value=\\\'PCO_CargarObjeto\\\';document.\'.$IdHTMLFormulario.\'.submit()\">\';\n					$salida.= \'<input type=\"hidden\" name=\"PCO_Objeto\" value=\"frm:\'.$formulario.\'\">\';\n					$salida.= \'<input type=\"Hidden\" name=\"en_ventana\" value=\"\'.$en_ventana.\'\" >\';\n					$salida.= \'<input type=\"Hidden\" name=\"PCO_CampoBusquedaBD\" value=\"\'.$registro_campos[\"campo\"].\'\" >\';\n					$salida.= \'<input type=\"Hidden\" name=\"PCO_ValorBusquedaBD\" \'.$cadena_valor.\'>\';\n				$salida.= \'</span>\';\n			}\n\n\n		// Si el campo es de clave agrega icono para mostrarla (cambiando el tipo de control dinamicamente)\n		if ($registro_campos[\"tipo\"]==\"texto_clave\")\n			{\n				$IdCampoClave=$registro_campos[\"id_html\"];\n				$salida.= \'<script languaje=\"JavaScript\">\n								//Cambia un tipo de control de formulario para poder presentar un boton de cambio a texto o password\n								function CambiarTipoControl_\'.$IdCampoClave.\'(Control)\n									{\n										if (document.getElementById(Control).type == \"text\")\n											document.getElementById(Control).type = \"password\";\n										else\n											document.getElementById(Control).type = \"text\";\n									}\n							</script>\n						<span class=\"input-group-addon\">\';\n					$salida.= \'<a title=\"\'.$MULTILANG_Contrasena.\'\" onclick=\"CambiarTipoControl_\'.$IdCampoClave.\'(\\\'\'.$IdCampoClave.\'\\\');\"><i class=\"fa fa-eye-slash fa-fw\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n\n\n		//Agrega el icono de calendario a campos con validaciones tipo datepicker al detectar una cadena de ID para algun datepicker\n		if ($cadena_ID_datepicker!=\"\")\n			{\n				$salida.=\'\n				<span class=\"input-group-addon\">\n					<i class=\"glyphicon glyphicon-calendar\"></i>\n				</span>\';\n			}\n\n		// Muestra indicadores de obligatoriedad o ayuda\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				if ($registro_campos[\"valor_unico\"] == \"1\") $salida.= \'<a href=\"#\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitValorUnico.\'</b><br>\'.$MULTILANG_DesValorUnico.\'\"><i class=\"fa fa-key fa-flip-horizontal texto-rojo\"></i></a>\';\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\"  title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoOculto\n	Genera el codigo HTML y CSS correspondiente a un campo de texto pero oculto (hidden) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n		formulario - ID unico del formulario al cual pertenece el objeto\n\n	Salida:\n\n		HTML asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoOculto($registro_campos,$registro_datos_formulario,$formulario,$en_ventana)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n		$tipo_entrada=\"hidden\";\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=\' value=\"\'.$registro_campos[\"valor_predeterminado\"].\'\" \';\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					$cadena_valor=${$nombre_variable};\n			}\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n\n		// Muestra el campo\n		$salida.=\'<input type=\"\'.$tipo_entrada.\'\" name=\"\'.$registro_campos[\"campo\"].\'\" value=\"\'.$cadena_valor.\'\" >\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoTextoLargo\n	Genera el codigo HTML y CSS correspondiente a un campo de texto largo (textarea) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoTextoLargo($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadenas de tamano de campo\n		$cadena_ancho_visual=\' cols=\"\'.$registro_campos[\"ancho\"].\'\" \';\n		$cadena_alto_visual=\' rows=\"\'.$registro_campos[\"alto\"].\'\" \';\n		$cadena_longitud_visual=$cadena_ancho_visual.$cadena_alto_visual;\n\n		// Especifica textos de placeholder si existen\n		$cadena_placeholder=\'\';\n		if ($registro_campos[\"valor_placeholder\"]!=\"\")\n			$cadena_placeholder=\' placeholder=\"\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"valor_placeholder\"],$registro_datos_formulario).\'\" \';\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"valor_predeterminado\"],$registro_datos_formulario);\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.  COMPATIBILIDAD HACIA ATRAS\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=\' value=\"\'.$valor_variable.\'\" \';\n					}\n			}\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n\n		// Define cadenas en caso de tener validaciones\n		$cadena_validacion=\'\';\n		if ($registro_campos[\"validacion_datos\"]!=\"\" && $registro_campos[\"validacion_datos\"]!=\"fecha\" && $registro_campos[\"validacion_datos\"]!=\"hora\" && $registro_campos[\"validacion_datos\"]!=\"fechahora\" && $registro_campos[\"validacion_datos\"]!=\"fechaxanos\" && $registro_campos[\"validacion_datos\"]!=\"fechahorafull\")\n			$cadena_validacion=\' onkeypress=\"return PCOJS_ValidarTeclado(event, \\\'\'.$registro_campos[\"validacion_datos\"].\'\\\', \\\'\'.$registro_campos[\"validacion_extras\"].\'\\\');\" \';\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n		// Muestra el campo\n		$salida.= \'<textarea tabindex=\'.$TabIndex_Elemento.\' id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" \'.$cadena_longitud_visual.\' class=\"form-control\" \'.$registro_campos[\"solo_lectura\"].\'  \'.$registro_campos[\"personalizacion_tag\"].\' \'.$cadena_placeholder.\'  \'.$cadena_validacion.\' >\'.$cadena_valor.\'</textarea>\';\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoAreaResponsive\n	Genera el codigo HTML y CSS correspondiente a un campo de texto con formato responsive usando SummerNote\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoAreaResponsive($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $IdiomaPredeterminado,$MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=$registro_campos[\"valor_predeterminado\"];\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=\' value=\"\'.$valor_variable.\'\" \';\n					}\n			}\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n\n		// Muestra el campo\n		$salida.= \'<div id=\"Summer_\'.$registro_campos[\"campo\"].\'\" class=\"summernote\" ></div>\';\n\n		// Agrega el campo del form pero oculto\n		$salida.= \'<textarea tabindex=\'.$TabIndex_Elemento.\' id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" \'.$registro_campos[\"solo_lectura\"].\'  \'.$registro_campos[\"personalizacion_tag\"].\' style=\"visibility:hidden; display:none;\" >\'.$cadena_valor.\'</textarea>\';\n\n		//Busca el id_html de formulario para usarlo en la creacion del summernote\n		$NombreFormulario=PCO_EjecutarSQL(\"SELECT id_html FROM core_formulario WHERE id=\'\".$registro_campos[\"formulario\"].\"\' \")->fetchColumn();\n\n		//Si el campo tiene una altura la agrega, sino la deja vacia para ser responsive\n		$cadena_altura=\"\";\n		if ($registro_campos[\"alto\"]!=\"\" && $registro_campos[\"alto\"]!=\"0\")\n			$cadena_altura=\"height: \".$registro_campos[\"alto\"].\", \";\n\n		//Construye el tipo de barra de herramientas, iniciando por la completa o sino asignando la que corresponda\n		$cadena_barraherramientas_Base=\"\n				[\'Operaciones\', [\'undo\', \'redo\']],\";\n		$cadena_barraherramientas_Basica=\"\n			[\'Caracter\', [\'bold\', \'italic\', \'underline\', \'strikethrough\', \'clear\', \'color\']],\n			[\'Parrafo1\', [\'ul\', \'ol\']],\n			[\'Parrafo2\', [\'paragraph\']],\n			[\'Parrafo3\', [\'height\']],\";\n		$cadena_barraherramientas_Estandar=\"\n			[\'Estilos\', [\'style\']],\n			[\'Fuentes1\', [\'fontname\']],\n			[\'Fuentes2\', [\'fontsize\']],\";\n		$cadena_barraherramientas_Extendida=\"\n			[\'Insertar1\', [\'link\', \'table\', \'hr\']],\";\n		$cadena_barraherramientas_Avanzada=\"\n			[\'Otros\', [\'fullscreen\', \'codeview\']], \";\n		$cadena_barraherramientas_Completa=\"\n			[\'Insertar2\', [\'picture\', \'video\']], \";\n\n		$cadena_barraherramientas=$cadena_barraherramientas_Base;\n		if ($registro_campos[\"barra_herramientas\"]==\"5\") //BASICA\n			$cadena_barraherramientas=$cadena_barraherramientas_Base.$cadena_barraherramientas_Basica;\n		if ($registro_campos[\"barra_herramientas\"]==\"6\") //ESTANDAR\n			$cadena_barraherramientas=$cadena_barraherramientas_Estandar.$cadena_barraherramientas_Base.$cadena_barraherramientas_Basica;								\n		if ($registro_campos[\"barra_herramientas\"]==\"7\") //EXTENDIDA\n			$cadena_barraherramientas=$cadena_barraherramientas_Estandar.$cadena_barraherramientas_Base.$cadena_barraherramientas_Basica.$cadena_barraherramientas_Extendida;\n		if ($registro_campos[\"barra_herramientas\"]==\"8\") //AVANZADA\n			$cadena_barraherramientas=$cadena_barraherramientas_Estandar.$cadena_barraherramientas_Base.$cadena_barraherramientas_Basica.$cadena_barraherramientas_Extendida.$cadena_barraherramientas_Avanzada;\n		if ($registro_campos[\"barra_herramientas\"]==\"9\") //COMPLETA\n			$cadena_barraherramientas=$cadena_barraherramientas_Estandar.$cadena_barraherramientas_Base.$cadena_barraherramientas_Basica.$cadena_barraherramientas_Extendida.$cadena_barraherramientas_Avanzada.$cadena_barraherramientas_Completa;\n		$cadena_barraherramientas=\"toolbar: [\".$cadena_barraherramientas.\"],\";\n\n		$salida.= \"\n			<script language=\'JavaScript\'>\n				$ (function() { \n					$(\'#Summer_\".$registro_campos[\"campo\"].\"\').summernote({\n					lang: \'\".$IdiomaPredeterminado.\"-\".strtoupper($IdiomaPredeterminado).\"\', // default: \'en-US\'\n					  $cadena_altura\n					  $cadena_barraherramientas\n					  callbacks: {\n						onChange: function(contents) {\n						  document.$NombreFormulario.\".$registro_campos[\"campo\"].\".value=contents;\n						}\n					  }\n					});\n		\n				//Asigna el valor inicial del textarea al marco visual a manera de codigo\n				$(\'#Summer_\".$registro_campos[\"campo\"].\"\').summernote(\'code\',document.$NombreFormulario.\".$registro_campos[\"campo\"].\".value);\n				\n				});\n			</script>\";\n\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoTextoFormato\n	Genera el codigo HTML y CSS correspondiente a un campo de texto largo (textarea alterado por CKEditor) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n		existe_campo_textoformato - Variable que determina si ya han sido cargadas las librerias del CKEditor para evitar una segunda carga y errores derivados de JavaScript\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoTextoFormato($registro_campos,$registro_datos_formulario,$existe_campo_textoformato)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadenas de tamano de campo\n		$cadena_ancho_visual=\' cols=\"\'.$registro_campos[\"ancho\"].\'\" \';\n		$cadena_alto_visual=\' rows=\"\'.$registro_campos[\"alto\"].\'\" \';\n		$cadena_longitud_visual=$cadena_ancho_visual.$cadena_alto_visual;\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=$registro_campos[\"valor_predeterminado\"];\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=\' value=\"\'.$valor_variable.\'\" \';\n					}\n			}\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n\n		// Muestra el campo\n		$salida.= \'<textarea tabindex=\'.$TabIndex_Elemento.\' id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" \'.$cadena_longitud_visual.\' \'.$registro_campos[\"solo_lectura\"].\'  \'.$registro_campos[\"personalizacion_tag\"].\'  >\'.$cadena_valor.\'</textarea>\';\n\n		// Define las barras posibles para el editor\n		$barra_documento=\"\'sourceEditing\',\'|\',\'heading\'\";\n		$barra_basica=\"\'bold\', \'italic\', \'underline\', \'strikethrough\',\'subscript\',\'superscript\',\'|\',\'removeFormat\'\";\n		$barra_parrafo=\"\'numberedList\',\'bulletedList\',\'|\',\'outdent\',\'indent\',\'|\',\'blockQuote\',\'|\',\'alignment\'\";\n		$barra_enlaces=\"\'link\'\";\n		$barra_estilos=\"\'fontSize\',\'fontFamily\'\";\n		$barra_portapapeles=\"\'|\',\'undo\',\'redo\'\";\n		$barra_edicion=\"\'findAndReplace\',\'selectAll\',\'|\'\";\n		$barra_insertar=\"\'insertTable\',\'horizontalLine\',\'specialCharacters\',\'pageBreak\',\'htmlEmbed\'\";\n		$barra_colores=\"\'fontColor\',\'fontBackgroundColor\',\'highlight\'\";\n		$barra_formularios=\"\"; //DEPRECATED en version 5\n		$barra_otros=\"\'code\', \'codeBlock\'\";\n\n		// Construye las barras de herramientas de acuerdo a la seleccion del usuario\n		@$barra_editor.=\"\'|\'\";\n		if ($registro_campos[\"barra_herramientas\"]==\"0\")\n			{\n				$barra_editor.=\",\".$barra_documento;\n				$barra_editor.=\",\".$barra_basica;\n				$barra_editor.=\",\".$barra_parrafo;\n			}\n		if ($registro_campos[\"barra_herramientas\"]==\"1\")\n			{\n				$barra_editor.=\",\".$barra_documento;\n				$barra_editor.=\",\".$barra_basica;\n				$barra_editor.=\",\".$barra_parrafo;\n				$barra_editor.=\",\".$barra_enlaces;\n				$barra_editor.=\",\".$barra_estilos;\n			}\n		if ($registro_campos[\"barra_herramientas\"]==\"2\")\n			{\n				$barra_editor.=\",\".$barra_documento;\n				$barra_editor.=\",\".$barra_basica;\n				$barra_editor.=\",\".$barra_parrafo;\n				$barra_editor.=\",\".$barra_enlaces;\n				$barra_editor.=\",\".$barra_estilos;\n				$barra_editor.=\",\".$barra_portapapeles;\n				$barra_editor.=\",\".$barra_edicion;\n			}\n		if ($registro_campos[\"barra_herramientas\"]==\"3\")\n			{\n				$barra_editor.=\",\".$barra_documento;\n				$barra_editor.=\",\".$barra_basica;\n				$barra_editor.=\",\".$barra_parrafo;\n				$barra_editor.=\",\".$barra_enlaces;\n				$barra_editor.=\",\".$barra_estilos;\n				$barra_editor.=\",\".$barra_portapapeles;\n				$barra_editor.=\",\".$barra_edicion;\n				$barra_editor.=\",\".$barra_insertar;\n				$barra_editor.=\",\".$barra_colores;\n			}\n		if ($registro_campos[\"barra_herramientas\"]==\"4\")\n			{\n				$barra_editor.=\",\".$barra_documento;\n				$barra_editor.=\",\".$barra_basica;\n				$barra_editor.=\",\".$barra_parrafo;\n				$barra_editor.=\",\".$barra_enlaces;\n				$barra_editor.=\",\".$barra_estilos;\n				$barra_editor.=\",\".$barra_portapapeles;\n				$barra_editor.=\",\".$barra_edicion;\n				$barra_editor.=\",\".$barra_insertar;\n				$barra_editor.=\",\".$barra_colores;\n				//$barra_editor.=\",\".$barra_formularios;\n				$barra_editor.=\",\".$barra_otros;\n			}\n		// Aplica el script del ckeditor al campo\n		if (!$existe_campo_textoformato)\n			$salida.= \'<script type=\"text/javascript\" src=\"inc/ckeditor/ckeditor.js\"></script>\';\n		\n		//Determina si se requiere un tamano especifico del control y lo usa, sino lo deja en blanco para responsive\n		\n		$CadenaTamanoControl=\'\';\n		if ($registro_campos[\"alto\"]!=\"\" && $registro_campos[\"alto\"]!=\"0\" && $registro_campos[\"ancho\"]!=\"\" && $registro_campos[\"ancho\"]!=\"0\")\n			$CadenaTamanoControl=\'  editor.ui.element.style.height = \"\'.$registro_campos[\"alto\"].\'px\";\n									editor.ui.element.style.width = \"\'.$registro_campos[\"ancho\"].\'px\";\';\n		\n		$salida.= \'<script>\n						ClassicEditor\n							.create( document.querySelector( \"#\'.$registro_campos[\"id_html\"].\'\" ), {\n								toolbar: [ \'.$barra_editor.\' ]\n							} )\n							.then( editor => {\n								window.editor = editor;\n								\'.$CadenaTamanoControl.\'\n							} )\n							.catch( err => {\n								console.error( err.stack );\n							} );\n					</script>\';\n\n		// Muestra indicadores de obligatoriedad o ayuda\n		if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\"  title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n		if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\"  title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n\n		//Activa booleana de existencia de tipo de campo para evitar doble inclusion de javascript\n		$existe_campo_textoformato=1;\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoListaSeleccion\n	Genera el codigo HTML y CSS correspondiente a un campo de lista (select - ComboBox) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoListaSeleccion($registro_campos,$registro_datos_formulario,$formulario,$en_ventana)\n	{\n		global $TablasCore,$PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $PCO_ScriptsListaCombosPostCarga,$PCO_ListaCombosMultiplesJoin;\n		global $MULTILANG_Cargando,$MULTILANG_Buscar,$MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio,$MULTILANG_SeleccioneUno,$MULTILANG_FrmActualizaAjax;\n		global $TabIndex_Elemento;\n\n		//Busca datos del formulario\n		$RegistroDisenoFormulario=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario WHERE id=?\", \"$formulario\")->fetch();\n		$IdHTMLFormulario=$RegistroDisenoFormulario[\"id_html\"];\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\")\n			{\n				//Si se tiene un valor de registro entonces lo prefiere, sino usa el de busqueda\n				if ($registro_datos_formulario[\"$nombre_campo\"]!=\"\")\n					$cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n				else\n					{\n						//Asigna el valor solo si no se trata de una lista multiple, pues listas multiples no son validas para recuperar registros unicos.\n						if (!strstr($registro_campos[\"personalizacion_tag\"],\"multiple\")!=FALSE && $nombre_campo==$PCO_CampoBusquedaBD)\n							$cadena_valor=$PCO_ValorBusquedaBD;\n					}\n			}\n\n		// Define si el control es un ComboBox o un ListBox dependiendo de su altura (!=0 es listbox)\n		if ($registro_campos[\"alto\"]!=\'0\')\n			$cadena_altura=\'size=\'.$registro_campos[\"alto\"];\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label id=\"PCOEtiqueta_\'.$registro_campos[\"campo\"].\'\" for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n\n		// Define si el control es solo lectura o no\n		$EstadoLecturaControl=\"\";\n		if ($registro_campos[\"solo_lectura\"]==\'READONLY\')\n			$EstadoLecturaControl=\' disabled \';\n\n		//Si la lista tiene activada la recuperacion por AJAX mientras se escribe agrega el modificador\n		$EstadoRecuperacionDinamica=\"\";\n		$EstadoObligadoLiveSerachRecuperacionDinamica=\"\";\n		if ($registro_campos[\"ajax_busqueda_dinamica\"]==\"1\")\n			{\n				$EstadoRecuperacionDinamica=\" with-ajax \";				\n				$EstadoObligadoLiveSerachRecuperacionDinamica=\" data-live-search=true \";\n			}\n\n		//Define cadenas para el ancho del control (si aplica)\n		$CadenaAnchoSelect=\'  \';\n		$CadenaAnchoOption=\'  \';\n		if ($registro_campos[\"ancho\"]!=\"\" && $registro_campos[\"ancho\"] !=\"0\")\n			{\n				$CadenaAnchoSelect=\' data-width=\"\'.$registro_campos[\"ancho\"].\'px\" \';\n				$CadenaAnchoOption=\" style=\'width : \".$registro_campos[\"ancho\"].\"px;\' \";\n			}\n\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n		// Muestra el campo\n		$salida.= \'<select \'.$CadenaAnchoSelect.\' tabindex=\'.$TabIndex_Elemento.\' id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" data-container=\"body\" class=\"selectpicker \'.$EstadoRecuperacionDinamica.\' combo-\'.$registro_campos[\"campo\"].\' show-tick\" \'.@$cadena_altura.\' title=\"\'.$MULTILANG_SeleccioneUno.\'\" \'.$registro_campos[\"personalizacion_tag\"].\' \'.$EstadoObligadoLiveSerachRecuperacionDinamica.\' \'.$EstadoLecturaControl.\' >\';\n\n\n			//Genera Script Ajax y DIV para cambio de opciones en caliente\n			$nombre_tabla_opciones = explode(\".\", $registro_campos[\"origen_lista_opciones\"]);\n			$nombre_tabla_opciones = $nombre_tabla_opciones[0];\n\n			//Define algunas variables de construccion de la cadena final\n			$PCO_Prefijo=\'\';\n			$PCO_Infijo=\'|\';\n			$PCO_Posfijo=\'!\';\n\n			echo \'\n				<script type=\"text/javascript\">\n					function PCO_ObtenerListaOpciones_\'.$registro_campos[\"campo\"].\'()\n						{\n							//Limpia el combo\n							const variablecombo_\'.$registro_campos[\"campo\"].\' = document.getElementById(\"\'.$registro_campos[\"campo\"].\'\");\n							document.getElementById(\"\'.$registro_campos[\"campo\"].\'\").options.length=0;\n\n							const xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\");\n\n							//funcion que se llama cada vez que cambia la propiedad readyState\n							xmlhttp.onreadystatechange=function()\n								{\n									//readyState 4: peticion finalizada y respuesta lista\n									//status 200: OK\n									if (xmlhttp.readyState===4 && xmlhttp.status===200)\n										{\n											//Pasar la respuesta html al div correspondiente\n											//document.getElementById(\"PCO_ListaOpciones_\'.$registro_campos[\"campo\"].\'\").innerHTML=xmlhttp.responseText;\n											contenido_recibido=xmlhttp.responseText;\n											contenido_recibido = contenido_recibido.trim();\n											arreglo_opciones = contenido_recibido.split(\"!\");\n\n											//Agrega la primera opcion vacia\n											const etiqueta_option = document.createElement(\"option\");\n											etiqueta_option.value = \"\";\n											etiqueta_option.text = \"\";\n											variablecombo_\'.$registro_campos[\"campo\"].\'.add(etiqueta_option);\n\n											//Recorre el arreglo de opciones y las agrega al combo\n											for (x=0;x<arreglo_opciones.length-1;x++)\n												{\n													arreglo_elementos_opciones=arreglo_opciones[x].split(\"|\");\n													//Agrega el elemento\n													const etiqueta_option = document.createElement(\"option\");\n													etiqueta_option.value = arreglo_elementos_opciones[0];\n													etiqueta_option.text = arreglo_elementos_opciones[1];\n													variablecombo_\'.$registro_campos[\"campo\"].\'.add(etiqueta_option);\n												}\n\n											//Actualiza el combo con las nuevas opciones\n											$(\".combo-\'.$registro_campos[\"campo\"].\'\").selectpicker(\"refresh\");\n										}\n								};\n\n							/* open(metodo, url, asincronico)\n							* metodo: post o get\n							* url: localizacion del archivo en el servidor\n							* asincronico: comunicacion asincronica true o false.*/\n							xmlhttp.open(\"POST\",\"index.php\",true);\n\n							//establece el header para la respuesta\n							xmlhttp.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\");\n\n							//enviamos las variables al archivo get_combo2.php\n							//xmlhttp.send();\n							xmlhttp.send(\"PCO_Accion=opciones_combo_box&Presentar_FullScreen=1&origen_lista_tablas=\'.$nombre_tabla_opciones.\'&origen_lista_opciones=\'.$registro_campos[\"origen_lista_opciones\"].\'&origen_lista_valores=\'.$registro_campos[\"origen_lista_valores\"].\'&condicion_filtrado_listas=\'.str_replace(\'\"\',\'\\\"\',$registro_campos[\"condicion_filtrado_listas\"]).\'&PCO_Prefijo=\'.$PCO_Prefijo.\'&PCO_Infijo=\'.$PCO_Infijo.\'&PCO_Posfijo=\'.$PCO_Posfijo.\'\");\n						}\n				</script>\n\n			<div id=\"PCO_ListaOpciones_\'.$registro_campos[\"campo\"].\'\" style=\"display: inline-table;\">\';\n\n\n\n\n\n				// Toma los valores desde la lista de opciones (cuando es estatico)\n				//Si el campo es una simple coma entonces es para agregar el vacio al comienzo, sino hace la lista\n				if ($registro_campos[\"lista_opciones\"]!=\'\')\n					{\n						//Es diferente de vacio asi que ahora verifica si es solo una coma para poner valor inicial en blanco o si debe expandir todo\n						if ($registro_campos[\"lista_opciones\"]==\',\')\n							{\n								$opciones_lista[] = \"\";\n								$valores_lista[] = \"\";\n							}\n						else\n							{\n								$opciones_lista = explode(\",\", $registro_campos[\"lista_opciones\"]);\n								$valores_lista = explode(\",\", $registro_campos[\"lista_opciones\"]);\n							}\n					}\n\n				// Si se desea tomar los valores del combo desde una tabla hace la consulta\n					if ($registro_campos[\"origen_lista_opciones\"]!=\"\" && $registro_campos[\"origen_lista_valores\"]!=\"\")\n						{\n							$nombre_tabla_opciones = explode(\".\", $registro_campos[\"origen_lista_valores\"]); //Usa el campo de valor de la lista que se asume es unico\n							$nombre_tabla_opciones = $nombre_tabla_opciones[0];\n							$campo_valores=$registro_campos[\"origen_lista_valores\"];\n							$campo_opciones=$registro_campos[\"origen_lista_opciones\"];\n							//Define si los registros a mostrar en la lista deben estar filtrados por alguna condicion\n							$condicion_filtrado_listas=PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"condicion_filtrado_listas\"],$registro_datos_formulario);\n							\n							if ($condicion_filtrado_listas==\"\")\n								$condicion_filtrado_listas=\"1\";\n							else\n								{\n									//Mientras existan llaves abriendo y cerrando dentro de la condicion intenta establecer valor de variables\n									$SalidaFiltradoBypass=0;\n									while(strpos($condicion_filtrado_listas,\"{\")!==FALSE && strpos($condicion_filtrado_listas,\"}\")!==FALSE && $SalidaFiltradoBypass==0)\n										{\n											//Evalua casos donde se tienen variables PHP escapadas por llaves.  Ej  \"%{$Variable}%\" si fuera para un LIKE, por ejemplo o para una variable en un where  campo=\"{$Variable}\"\n											if (strpos($condicion_filtrado_listas,\"{\")!==FALSE && strpos($condicion_filtrado_listas,\"}\")!==FALSE)\n												{\n													//Determina las posiciones de las llaves en la cadena\n													$PosLlaveIzquierda=strpos($condicion_filtrado_listas,\"{\");\n													$PosLlaveDerecha=strpos($condicion_filtrado_listas,\"}\");\n													//Toma solo el pedazo entre llaves para intentar ubicar el valor de la variable por su nombre\n													$NombreVariable=substr($condicion_filtrado_listas,$PosLlaveIzquierda+2,$PosLlaveDerecha-$PosLlaveIzquierda-2);\n													//Si la variable no esta definida la busca en el entorno global\n													global ${$NombreVariable};\n													if (@isset($NombreVariable))\n														{\n															$ValorVariable=${$NombreVariable};\n															//Reemplaza el valor encontrado en la cadena de valor original\n															$condicion_filtrado_listas=str_replace(\'{$\'.$NombreVariable.\'}\',$ValorVariable,$condicion_filtrado_listas);\n														}\n													else\n														{\n															//Puede que no se logre reemplazar nada porque la variable no esta definida entonces sale por ByPass para evitar ciclo infinito\n															$SalidaFiltradoBypass=1;\n														}\n												}\n										}\n								}\n	\n							//Recupera los datos para la lista.  En listas de llenado estandar recupera todo SINO solo los posibles valores ya seleccionados\n							if ($registro_campos[\"ajax_busqueda_dinamica\"]==\"0\")\n								{\n									// Consulta los campos para el tag select\n									$resultado_opciones=PCO_EjecutarSQL(\"SELECT $campo_valores as valores, $campo_opciones as opciones FROM $nombre_tabla_opciones WHERE $condicion_filtrado_listas\");   //Deprecated.  ORDER BY $campo_opciones\n									// Muestra resultados solo si $resultado_opciones es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch()\n									while ($resultado_opciones!=\"1\" && $registro_opciones = $resultado_opciones->fetch())\n										{\n											$opciones_lista[] = $registro_opciones[\"opciones\"];\n											$valores_lista[] = $registro_opciones[\"valores\"];\n										}\n								}\n							else\n								{\n									//Solo si tiene datos intenta recuperar registros coincidentes\n									if ($registro_datos_formulario[\"$nombre_campo\"]!=\"\")\n										{\n											$nombre_tabla_opciones = explode(\".\", $registro_campos[\"origen_lista_valores\"]); //Usa el campo de valor de la lista que se asume es unico\n											$nombre_tabla_opciones = $nombre_tabla_opciones[0];\n											$campo_valores=$registro_campos[\"origen_lista_valores\"];\n											$campo_opciones=$registro_campos[\"origen_lista_opciones\"];\n\n											//Construye el comentento de la condicion para obtener como minimo aquellos registros seleccionados y no traer todos los datos\n											$ComplementoValoresYaSeleccionados=\" ( \";\n											//$ComplementoValoresYaSeleccionados=\"  (documento=\'1128282578\' OR documento=\'52,965,018\' OR documento=\'71782341\' OR documento=\'52305908\' OR documento=\'55180918\') AND \";  //,\n											$ListaPosiblesValores=explode(\",\",$registro_datos_formulario[\"$nombre_campo\"]);\n											foreach ($ListaPosiblesValores as $PosibleValor)\n												if (trim($PosibleValor)!=\"\")\n													$ComplementoValoresYaSeleccionados.= \" $campo_valores=\'$PosibleValor\' OR \";\n											$ComplementoValoresYaSeleccionados=substr($ComplementoValoresYaSeleccionados, 0, strlen($ComplementoValoresYaSeleccionados)-3);\n											$ComplementoValoresYaSeleccionados.=\" )  \";  //AND\n\n											// Consulta los campos para el tag select\n											$resultado_opciones=PCO_EjecutarSQL(\"SELECT $campo_valores as valores, $campo_opciones as opciones FROM $nombre_tabla_opciones WHERE $ComplementoValoresYaSeleccionados  \");  \n											// Muestra resultados solo si $resultado_opciones es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch()\n											while ($resultado_opciones!=\"1\" && $registro_opciones = $resultado_opciones->fetch())\n												{\n													$opciones_lista[] = $registro_opciones[\"opciones\"];\n													$valores_lista[] = $registro_opciones[\"valores\"];\n												}\n										}\n								}\n						}\n\n				for ($i=0;$i<count(@$opciones_lista);$i++)\n					{\n						// Determina si la opcion a agregar es la misma del valor del registro\n						$cadena_predeterminado=\'\';\n						if ($valores_lista[$i]==@$cadena_valor)\n							$cadena_predeterminado=\' SELECTED \';\n\n						//Determina si la opcion es una agrupadora o no\n						//Busca el valor de etiqueta para el grupo\n						$PartesOpcionCombo= explode ( \"|\" , $valores_lista[$i] );\n						if ( strpos ( $valores_lista[$i] , \"_OPTGROUP_\" ) !== FALSE )\n							if ( $PartesOpcionCombo[1]!=\"\")\n								$salida.= \"<optgroup label=\'\".$PartesOpcionCombo[1].\"\'>\";\n							else\n								$salida.= \"</optgroup>\";  //Si no se encuentra valor de etiqueta alguno entonces cierra el grupo\n						else\n							$salida.= \"<option \".$CadenaAnchoOption.\" value=\'\".PCO_ReemplazarVariablesPHPEnCadena($valores_lista[$i],$registro_datos_formulario).\"\' \".$cadena_predeterminado.\">\".PCO_ReemplazarVariablesPHPEnCadena($opciones_lista[$i],$registro_datos_formulario).\"</option>\";\n					}\n\n			//Cierra DIV para cambio de opciones en caliente\n			echo \'</div>\';\n\n		$salida.= \'</select>\';\n\n			//Si la lista tiene activada la recuperacion por AJAX mientras se escribe construye las variables y define funcion de recuperacion\n			if ($registro_campos[\"ajax_busqueda_dinamica\"]==\"1\")\n				{\n					//Determina la tabla y campos desde los valores de lista definidos para usarlos como parametros en el AJAX\n					//Obtiene PCO_TablaConsulta\n					$TablaRecuperacionDinamica=explode(\".\",$registro_campos[\"origen_lista_opciones\"]);\n					$TablaRecuperacionDinamica=$TablaRecuperacionDinamica[0];\n					//Obtiene PCO_ListaCamposRetorno (Campo de valor)\n					$CampoValorRecuperacionDinamica=explode(\".\",$registro_campos[\"origen_lista_valores\"]);\n					$CampoValorRecuperacionDinamica=$CampoValorRecuperacionDinamica[1];\n					//Obtiene PCO_ListaCamposRetorno (Campo de texto)\n					$CampoBusquedaRecuperacionDinamica=explode(\".\",$registro_campos[\"origen_lista_opciones\"]);\n					$CampoBusquedaRecuperacionDinamica=$CampoBusquedaRecuperacionDinamica[1];\n					//Obtiene la condicion de filtrado si aplica\n					$CondicionFiltradoConsulta=$registro_campos[\"condicion_filtrado_listas\"];\n					if (trim($CondicionFiltradoConsulta)!=\"\")\n						{\n							$CondicionFiltradoConsulta=\" AND \".$CondicionFiltradoConsulta;\n							//Si encuentra comillas dobles las reemplaza por simples pues son las aceptadas en JS\n							$CondicionFiltradoConsulta=str_replace(\'\"\',\"\'\",$CondicionFiltradoConsulta);\n							$CondicionFiltradoConsulta=PCO_ReemplazarVariablesPHPEnCadena($CondicionFiltradoConsulta,$registro_datos_formulario);\n						}\n					\n					echo \'<script type=\"text/javascript\">\n							const OrigenListaOpciones\'.$registro_campos[\"id_html\"].\' = {\n							  values: \"a, b, c\",\n							  ajax: {\n								url: \"index.php\",\n								type: \"POST\",\n								dataType: \"json\",\n								// Use \"{{{q}}}\" as a placeholder and Ajax Bootstrap Select will automatically replace it with the value of the search query.\n								data: {\n								  q: \"{{{q}}}\",\n								  PCO_Accion: \"PCO_ObtenerOpcionesAjaxSelect\",\n								  Presentar_FullScreen: \"1\",\n								  PCO_TablaConsulta: \"\'.$TablaRecuperacionDinamica.\'\",\n								  PCO_ListaCamposRetorno: \"\'.$CampoValorRecuperacionDinamica.\',\'.$CampoBusquedaRecuperacionDinamica.\'\", //Campos en el siguiente orden: Valor, Texto o etiqueta, Subtexto, Icono tipo glyphicon\n								  PCO_ListaCamposBusqueda: \"\'.$CampoBusquedaRecuperacionDinamica.\'\",\n								  PCO_CondicionFiltrado: \"\'.$CondicionFiltradoConsulta.\'\"\n								}\n							  },\n							  minLength: 3,\n							  locale: {\n								emptyTitle: \"Seleccione y digite para buscar\",\n								statusInitialized: \"Empiece a digitar para recuperar registros\",\n								statusSearching: \"\'.$MULTILANG_Cargando.\'...\",\n								currentlySelected: \"Actualmente seleccionado(s):\",\n								errorText: \"No se pueden recuperar registros\",\n								statusTooShort: \"Ingrese al menos tres caracteres\",\n								statusNoResults: \"No se encuentran resultados\",\n								searchPlaceholder: \"\'.$MULTILANG_Buscar.\'...\"\n							  },\n							  log: 0, //Nivel de console.log del combo\n							  preprocessData: (data) => data.length ? data.map(({ T: text, V: value, S: subtext, I: icon }) => ({\n                                    text,\n                                    value,\n                                    data: {\n                                      subtext,\n                                      icon,\n                                    }\n                                })) : []\n							};\n\n							$( document ).ready(function() {\n								$(\"#\'.$registro_campos[\"id_html\"].\'\").selectpicker().filter(\".with-ajax\").ajaxSelectPicker(OrigenListaOpciones\'.$registro_campos[\"id_html\"].\');\n								$(\"#\'.$registro_campos[\"id_html\"].\'\").trigger(\"change\");\n							});\n							//  function chooseSelectpicker(index, selectpicker) {\n							//   $(selectpicker).val(index);\n							//   $(selectpicker).selectpicker(\"refresh\");\n							//  }\n						</script>\';\n				}\n\n\n		// Muestra boton de busqueda cuando el campo sea usado para esto\n		if ($registro_campos[\"etiqueta_busqueda\"]!=\"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\"><input type=\"Button\" class=\"btn btn-default btn-xs\" value=\"\'.$registro_campos[\"etiqueta_busqueda\"].\'\" onclick=\"document.\'.$IdHTMLFormulario.\'.PCO_ValorBusquedaBD.value=document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value;document.\'.$IdHTMLFormulario.\'.PCO_Accion.value=\\\'PCO_CargarObjeto\\\';document.\'.$IdHTMLFormulario.\'.submit()\"></span>\';\n				$salida.= \'<input type=\"hidden\" name=\"PCO_Objeto\" value=\"frm:\'.$formulario.\'\">\';\n				$salida.= \'<input type=\"Hidden\" name=\"en_ventana\" value=\"\'.$en_ventana.\'\" >\';\n				$salida.= \'<input type=\"Hidden\" name=\"PCO_CampoBusquedaBD\" value=\"\'.$registro_campos[\"campo\"].\'\" >\';\n				$salida.= \'<input type=\"Hidden\" name=\"PCO_ValorBusquedaBD\" \'.$cadena_valor.\'>\';\n			}\n\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"ajax_busqueda\"] == \"1\" || $registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				//if ($registro_campos[\"ajax_busqueda\"] == \"1\") $salida.= \'<a class=\"btn btn-default btn-xs\" href=\"javascript:PCO_ObtenerListaOpciones_\'.$registro_campos[\"campo\"].\'();\" title=\"\'.$MULTILANG_Actualizar.\'\"><i class=\"fa fa-refresh icon-blue\"></i></a>\';\n				if ($registro_campos[\"ajax_busqueda\"] == \"1\")   $salida.= \'<a data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"<b>\'.$MULTILANG_FrmActualizaAjax.\'</b>\" class=\"btn btn-success btn-xs\" href=\"javascript:PCO_ObtenerListaOpciones_\'.$registro_campos[\"campo\"].\'();\"><i class=\"fa fa-refresh\"></i></a>&nbsp;&nbsp;&nbsp;\';\n				if ($registro_campos[\"valor_unico\"] == \"1\")     $salida.= \'<a href=\"#\" data-toggle=\"tooltip\" data-html=\"true\" data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitValorUnico.\'</b><br>\'.$MULTILANG_DesValorUnico.\'\"><i class=\"fa fa-key fa-flip-horizontal texto-rojo\"></i></a>\';\n				if ($registro_campos[\"obligatorio\"])            $salida.= \'<a href=\"#\" data-toggle=\"tooltip\" data-html=\"true\" data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\")     $salida.= \'<a href=\"#\" data-toggle=\"tooltip\" data-html=\"true\" data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n\n		//Si es multiple carga sus valores indepediente si es delayed o no\n		if (strstr($registro_campos[\"personalizacion_tag\"],\"multiple\")!=FALSE)\n			{\n				//Evita la carga atrasada del valor de la lista cuando es multiple y su nombre EXISTE en base de datos\n				if (PCO_ExisteCampoTabla($registro_campos[\"campo\"],$RegistroDisenoFormulario[\"tabla_datos\"]))\n					{\n						//$CadenaAsignacionMultiples=\"[\'\".str_replace(\',\',\"\',\'\",$cadena_valor).\"\']\";\n						$PCO_ScriptsListaCombosPostCarga.=\'$(\"#\'.$registro_campos[\"id_html\"].\'\").val(\"\'.$cadena_valor.\'\".split(\",\")); PCOJS_ActualizarComboBox(\"\'.$registro_campos[\"id_html\"].\'\");\';\n						$PCO_ListaCombosMultiplesJoin.=$registro_campos[\"id_html\"].\"|\";\n						//Agrega un campo hidden para el combo multiple para trasportar luego sus datos sanitizados.\n						$salida.= \'<input type=hidden value=\"\'.$cadena_valor.\'\" id=\"PCO_ComboMultiple_\'.$registro_campos[\"id_html\"].\'\" name=\"PCO_ComboMultiple_\'.$registro_campos[\"id_html\"].\'\" >\';\n					}\n			}\n\n		//Si es delayed porque el usuario asi lo quiere pero que no sea multiple, que por defecto ya es delayed\n		if (strstr($registro_campos[\"personalizacion_tag\"],\"PCO_Delayed\")!=FALSE ) // && strstr($registro_campos[\"personalizacion_tag\"],\"multiple\")!=FALSE\n			{\n				if (!strstr($registro_campos[\"personalizacion_tag\"],\"multiple\")!=FALSE)\n					$PCO_ScriptsListaCombosPostCarga.=\'$(\"#\'.$registro_campos[\"id_html\"].\'\").val(\"\'.$cadena_valor.\'\"); PCOJS_ActualizarComboBox(\"\'.$registro_campos[\"id_html\"].\'\");\';\n			}\n\n		//Mejora velocidad de carga para listas de seleccion\n		$salida.= \'<script type=\"text/javascript\">$(\"#\'.$registro_campos[\"id_html\"].\'\").selectpicker(\"render\");</script>\';\n\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoEtiqueta\n	Genera el codigo HTML y CSS correspondiente a un campo de etiqueta sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoEtiqueta($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		$salida.= \'<div id=\"\'.$registro_campos[\"id_html\"].\'\">\';\n		$salida.=PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"valor_etiqueta\"],$registro_datos_formulario);\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoCampoEtiqueta\n	Genera el codigo HTML para imprimir el valor de un campo directamente, sin control de datos.\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoCampoEtiqueta($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		$salida=\"\";\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		$Contenido_BARRAS=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=$registro_campos[\"valor_predeterminado\"];\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=$valor_variable;\n					}\n			}\n		//Si viene de una busqueda de registro pone el valor de registro\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\")\n			{\n				$cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n				$Contenido_BARRAS=$cadena_valor; //En caso que se requiera para imprimir en formato especial\n			}\n\n		//Si el formato de salida es especial entonces muestra lo que corresponda\n		if ($registro_campos[\"formato_salida\"]!=\"\")\n			{\n				$Tipo_BARRAS=$registro_campos[\"formato_salida\"];\n\n				//Establece tamanos de imagen segun tipo de grafico (codigo barras o datamatrix)\n				if ($Tipo_BARRAS!=\"datamatrix\")\n					{\n						$Ancho_BARRAS=$registro_campos[\"ancho\"];\n						//Si no se definio un ancho fijo entonces trata de calcularlo por la longitud del texto a mostrar\n						if ($Ancho_BARRAS==\"\" || $Ancho_BARRAS==\"0\")\n							$Ancho_BARRAS=110+strlen($Contenido_BARRAS)*10;\n						$Alto_BARRAS=$registro_campos[\"alto\"];\n					}\n				if ($Tipo_BARRAS==\"datamatrix\")\n					{\n						$Ancho_BARRAS=$registro_campos[\"ancho\"];\n						$Alto_BARRAS=$registro_campos[\"alto\"];\n					}\n\n				//Si es un codigo desde la libreria de codigos de barras lo muestra, si es un QR usa la otra funcion\n				if ($Tipo_BARRAS!=\"qrcode\")\n					$cadena_valor=\'<img src=\"core/codigobarras.php?Cadena=\'.$Contenido_BARRAS.\'&Tipo=\'.$Tipo_BARRAS.\'&AnchoCodigo=2&AltoCodigo=\'.($Alto_BARRAS-6).\'&AnchoImagen=\'.$Ancho_BARRAS.\'&AltoImagen=\'.$Alto_BARRAS.\'\" border=0>\';\n				else\n					$cadena_valor=PCO_CodigoQR($Contenido_BARRAS);\n			}\n\n		//Identifica si el contenido es una imagen y agrega el tag para esta sino pone el contenido crudo\n		if (substr ( $registro_datos_formulario[\"$nombre_campo\"] , 0,10 )==\"data:image\")\n			{\n				$cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n				$cadena_valor=\"<img src=\'$cadena_valor\' border=0 width=100%>\";\n			}\n\n		//$salida=$cadena_valor;\n		//Agrega ademas el valor como hidden para disponer de el cuando se requiera en otro llamado o funcion personalizada\n		$tipo_entrada=\"hidden\";\n		// Muestra el campo\n		//$salida.=\'<input type=\"\'.$tipo_entrada.\'\" name=\"\'.$registro_campos[\"campo\"].\'\" value=\"\'.$cadena_valor.\'\" >\';\n\n		//Agrega marco bootstrap antes de devolver contenidos\n		if ($registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		$salida.=\'<div id=\"\'.$registro_campos[\"campo\"].\'\">\'.$cadena_valor.\'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoIFrame\n	Genera el codigo HTML correspondiente a un campo de IFRAME para empotrar paginas externas sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoIFrame($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		$salida=\'\n		<div class=\"embed-responsive embed-responsive-4by3\"  \'.$registro_campos[\"personalizacion_tag\"].\' >\n			<iframe id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"titulo\"].\'\" src=\"\'.$registro_campos[\"url_iframe\"].\'\" width=\"\'.$registro_campos[\"ancho\"].\'\" height=\"\'.$registro_campos[\"alto\"].\'\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\">Cargando...</iframe>\n		</div>\';\n		return $salida;\n		/*\n		ALTERNATIVA 1:\n		<object data=\"http://www.web-source.net\" width=\"600\" height=\"400\">\n			<embed src=\"http://www.web-source.net\" width=\"600\" height=\"400\"> </embed>\n			Error: Embedded data could not be displayed.\n		</object>\n\n		ALTERNATIVA 2:\n		<div id=\"divId\"></div>\n		<script type=\'text/javascript\'>\n			$(document).ready(function (){\n				$(\'#divId\').load(URL of target);\n			});\n		</script>\n\n		ALTERNATIVA 3:\n		$(\'#SampleElement\').load(\'YourURL\');\n		*/\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoListaRadio\n	Genera el codigo HTML y CSS correspondiente a los radio-button (Radio) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoListaRadio($registro_campos,$registro_datos_formulario,$formulario,$en_ventana)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\") $cadena_valor=$registro_datos_formulario[\"$nombre_campo\"];\n\n		// Toma los valores desde la lista de opciones (cuando es estatico)\n		$opciones_lista = explode(\",\", $registro_campos[\"lista_opciones\"]);\n		$valores_lista = explode(\",\", $registro_campos[\"lista_opciones\"]);\n\n		//Elimina los elementos vacios de los arreglos\n		$opciones_lista = array_filter($opciones_lista);\n		$valores_lista = array_filter($valores_lista);\n\n		// Si se desea tomar los valores del combo desde una tabla hace la consulta\n		if ($registro_campos[\"origen_lista_opciones\"]!=\"\" && $registro_campos[\"origen_lista_valores\"]!=\"\")\n			{\n				$nombre_tabla_opciones = explode(\".\", $registro_campos[\"origen_lista_valores\"]);\n				$nombre_tabla_opciones = $nombre_tabla_opciones[0];\n				$campo_valores=$registro_campos[\"origen_lista_valores\"];\n				$campo_opciones=$registro_campos[\"origen_lista_opciones\"];\n				//Define si los registros a mostrar en la lista deben estar filtrados por alguna condicion\n				$condicion_filtrado_listas=$registro_campos[\"condicion_filtrado_listas\"];\n				if ($condicion_filtrado_listas==\"\")\n					$condicion_filtrado_listas=\"1\";\n				else\n					{\n						//Mientras existan llaves abriendo y cerrando dentro de la condicion intenta establecer valor de variables\n						$SalidaFiltradoBypass=0;\n						while(strpos($condicion_filtrado_listas,\"{\")!==FALSE && strpos($condicion_filtrado_listas,\"}\")!==FALSE && $SalidaFiltradoBypass==0)\n							{\n								//Evalua casos donde se tienen variables PHP escapadas por llaves.  Ej  \"%{$Variable}%\" si fuera para un LIKE, por ejemplo o para una variable en un where  campo=\"{$Variable}\"\n								if (strpos($condicion_filtrado_listas,\"{\")!==FALSE && strpos($condicion_filtrado_listas,\"}\")!==FALSE)\n									{\n										//Determina las posiciones de las llaves en la cadena\n										$PosLlaveIzquierda=strpos($condicion_filtrado_listas,\"{\");\n										$PosLlaveDerecha=strpos($condicion_filtrado_listas,\"}\");\n										//Toma solo el pedazo entre llaves para intentar ubicar el valor de la variable por su nombre\n										$NombreVariable=substr($condicion_filtrado_listas,$PosLlaveIzquierda+2,$PosLlaveDerecha-$PosLlaveIzquierda-2);\n										//Si la variable no esta definida la busca en el entorno global\n										global ${$NombreVariable};\n										if (@isset($NombreVariable))\n											{\n												$ValorVariable=${$NombreVariable};\n												//Reemplaza el valor encontrado en la cadena de valor original\n												$condicion_filtrado_listas=str_replace(\'{$\'.$NombreVariable.\'}\',$ValorVariable,$condicion_filtrado_listas);\n											}\n										else\n											{\n												//Puede que no se logre reemplazar nada porque la variable no esta definida entonces sale por ByPass para evitar ciclo infinito\n												$SalidaFiltradoBypass=1;\n											}\n									}\n							}\n					}\n				// Consulta los campos para el tag select\n				$resultado_opciones=PCO_EjecutarSQL(\"SELECT $campo_valores as valores, $campo_opciones as opciones FROM $nombre_tabla_opciones WHERE $condicion_filtrado_listas ORDER BY $campo_opciones\");\n				// Muestra resultados solo si $resultado_opciones es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch()\n				while ($resultado_opciones!=\"1\" && $registro_opciones = $resultado_opciones->fetch())\n					{\n						$opciones_lista[] = $registro_opciones[\"opciones\"];\n						$valores_lista[] = $registro_opciones[\"valores\"];\n					}\n			}\n\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n		// Muestra el campo\n		for ($i=0;$i<count($opciones_lista);$i++)\n			{\n				// Determina si la opcion a agregar es la misma del valor del registro\n				$cadena_predeterminado=\'\';\n				if ($valores_lista[$i]==$cadena_valor)\n					$cadena_predeterminado=\' CHECKED \';\n				$salida.= \"<input tabindex={$TabIndex_Elemento} class=\'Radios\' type=\'radio\' name=\'\".$registro_campos[\"campo\"].\"\' value=\'\".PCO_ReemplazarVariablesPHPEnCadena($valores_lista[$i],$registro_datos_formulario).\"\' \".$cadena_predeterminado.\" \".$registro_campos[\"personalizacion_tag\"].\" >\".PCO_ReemplazarVariablesPHPEnCadena($opciones_lista[$i],$registro_datos_formulario).\"<br>\";\n			}\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"valor_unico\"] == \"1\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitValorUnico.\'</b><br>\'.$MULTILANG_DesValorUnico.\'\"><i class=\"fa fa-key fa-flip-horizontal texto-rojo\"></i></a>\';\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoCasillaCheck\n	Genera el codigo HTML y CSS correspondiente a una casilla de verificacion (checkbox) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n		formulario - ID unico del formulario al cual pertenece el objeto\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoCasillaCheck($registro_campos,$registro_datos_formulario,$formulario,$en_ventana)\n	{\n		global $TablasCore,$PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD,$IdiomaPredeterminado;\n		global $funciones_activacion_datepickers;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		//Busca datos del formulario\n		$RegistroDisenoFormulario=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario WHERE id=?\", \"$formulario\")->fetch();\n		$IdHTMLFormulario=$RegistroDisenoFormulario[\"id_html\"];\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n\n\n		//Toma el valor predeterminado y lo asigna\n		$cadena_valor_almacenada=$registro_campos[\"valor_predeterminado\"];\n		//Si el valor predeterminado es el mismo de valor check activo entonces activa el control\n		if ($registro_campos[\"valor_predeterminado\"]==$registro_campos[\"valor_check_activo\"])\n			$cadena_valor=\"checked\";\n\n		//Reemplaza el valor del campo en caso de tener alguno viniendo del registro\n		$nombre_campo=$registro_campos[\"campo\"];\n		$valor_de_registro=$registro_datos_formulario[\"$nombre_campo\"];\n		if ($valor_de_registro!=\"\")\n			{\n				$cadena_valor_almacenada=$valor_de_registro;\n				//Si el valor de registro es el asociado al valor de activo entonces activa el control, sino lo desactiva\n				if ($valor_de_registro==$registro_campos[\"valor_check_activo\"])\n					$cadena_valor=\"checked\";\n				else\n					$cadena_valor=\"\";\n			}\n\n		// Muestra el campo\n		$CadenaEtiquetaCheck=PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario);\n		if($registro_campos[\"ocultar_etiqueta\"]==\"1\") $CadenaEtiquetaCheck=\"\";\n\n		$salida.= \'\n			<input type=\"hidden\" id=\"\'.$registro_campos[\"campo\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" value=\"\'.$cadena_valor_almacenada.\'\">\n			<div class=\"checkbox\">\n				<label>\n					<input tabindex=\'.$TabIndex_Elemento.\' onchange=\"JSFUNC_Actualizar_\'.$registro_campos[\"campo\"].\'(this);\" type=\"checkbox\" id=\"JSVAR_\'.$registro_campos[\"campo\"].\'\" name=\"JSVAR_\'.$registro_campos[\"campo\"].\'\" \'.$cadena_valor.\' \'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"personalizacion_tag\"],$registro_datos_formulario).\' > \'.$CadenaEtiquetaCheck.\'\n				</label>\n			</div>\n			<script language=\"JavaScript\">\n				function JSFUNC_Actualizar_\'.$registro_campos[\"campo\"].\'(objeto_checkbox)\n					{\n						//Si es marcado asigna el valor, sino asigna el otro\n						if (objeto_checkbox.checked)\n							document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value=\"\'.$registro_campos[\"valor_check_activo\"].\'\";\n						else\n							document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value=\"\'.$registro_campos[\"valor_check_inactivo\"].\'\";\n					}\n			</script>\n		\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoDeslizador\n	Genera el codigo HTML y CSS correspondiente a un campo tipo range de HTML5 vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoDeslizador($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD,$funciones_activacion_sliders;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		$valor_de_campo=\"0\";\n		// Si tiene valor predeterminado se asume\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $valor_de_campo=$registro_campos[\"valor_predeterminado\"];\n		// toma el valor predeterminado como el minimo (formulario de registro nuevo) en caso de no tener un predeterminado\n		if ($registro_campos[\"valor_predeterminado\"]==\"\") $valor_de_campo=$registro_campos[\"valor_minimo\"];\n		// Busca el valor segun registro en caso de recibir un registro recuperado\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\")\n			$valor_de_campo=$registro_datos_formulario[\"$nombre_campo\"];\n		$cadena_valor=\' data-slider-value=\"\'.$valor_de_campo.\'\" value=\"\'.$valor_de_campo.\'\" \';\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n		// Muestra el campo\n		$salida.= \'<input tabindex=\'.$TabIndex_Elemento.\' class=\"span2\" type=\"text\" id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" data-slider-min=\"\'.$registro_campos[\"valor_minimo\"].\'\" data-slider-max=\"\'.$registro_campos[\"valor_maximo\"].\'\" data-slider-step=\"\'.$registro_campos[\"valor_salto\"].\'\" \'.$cadena_valor.\' \'.$registro_campos[\"personalizacion_tag\"].\' >\';\n		//  data-slider-selection=\"after\" data-slider-tooltip=\"hide\">\n\n		//Guarda la funcion para activar el slider posterior a su carga\n		@$funciones_activacion_sliders.=\"\n				$(function(){\n					window.prettyPrint && prettyPrint();\n				$(\'#\".$registro_campos[\"campo\"].\"\').slider({\n				  formater: function(value) {\n					return \'Valor: \'+value;\n				  }\n				});\n			});\";\n\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoArchivoAdjunto\n	Genera el codigo HTML y CSS correspondiente a un campo de archivo (file) vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoArchivoAdjunto($registro_campos,$registro_datos_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio,$MULTILANG_FrmArchivoLink,$MULTILANG_Tipo;\n		global $TabIndex_Elemento;\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n		$tipo_entrada=\"file\";\n\n		// Especifica longitud visual de campo en caso de haber sido definida\n		$cadena_longitud_visual=\' size=\"20\" \';\n		if ($registro_campos[\"ancho\"]!=\"0\")\n			$cadena_longitud_visual=\' size=\"\'.$registro_campos[\"ancho\"].\'\" \';\n\n		// Especifica longitud maxima de caracteres en caso de haber sido definida\n		$cadena_longitud_permitida=\' \';\n		if ($registro_campos[\"maxima_longitud\"]!=0)\n			$cadena_longitud_permitida=\' maxlength=\"\'.$registro_campos[\"maxima_longitud\"].\'\" \';\n\n		// Define cadena en caso de tener valor predeterminado o el valor tomado desde el registro buscado\n		$cadena_valor=\'\';\n		if ($registro_campos[\"valor_predeterminado\"]!=\"\") $cadena_valor=\' value=\"\'.$registro_campos[\"valor_predeterminado\"].\'\" \';\n		//Evalua si el valor predeterminado tiene signo $ al comienzo y ademas es una variable definida para poner su valor.\n		if (substr($registro_campos[\"valor_predeterminado\"], 0,1)==\"$\")\n			{\n				$nombre_variable = substr($registro_campos[\"valor_predeterminado\"], 1);\n				global ${$nombre_variable};\n				if (isset($nombre_variable))\n					{\n						$valor_variable=${$nombre_variable};\n						$cadena_valor=\' value=\"\'.$valor_variable.\'\" \';\n					}\n			}\n\n		// Si detecta un path de archivo en el registro entonces agrega el enlace\n		$partes_adjunto_archivo=explode(\"|\",$registro_datos_formulario[\"$nombre_campo\"]);\n		$adjunto_url_archivo=$partes_adjunto_archivo[0];\n		$adjunto_tipo_archivo=$partes_adjunto_archivo[1];\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\" && $registro_datos_formulario[\"$nombre_campo\"]!=\"\")\n			$salida.=\'<a target=\"_BLANK\" href=\"\'.$adjunto_url_archivo.\'\"><i class=\"fa fa-search\"></i><b>\'.$MULTILANG_FrmArchivoLink.\'</b><i class=\"fa fa-floppy-o fa-fw\"></i></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>(\'.$MULTILANG_Tipo.\': \'.$adjunto_tipo_archivo.\')</i><br>\';\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n		// Muestra el campo\n		$salida.=\'<input tabindex=\'.$TabIndex_Elemento.\' type=\"\'.$tipo_entrada.\'\" id=\"\'.$registro_campos[\"id_html\"].\'\" name=\"\'.$registro_campos[\"campo\"].\'\" \'.$cadena_valor.\' \'.$cadena_longitud_visual.\' \'.$cadena_longitud_permitida.\' class=\"form-control btn-default\" \'.$cadena_validacion.\' \'.$registro_campos[\"solo_lectura\"].\' \'.$registro_campos[\"personalizacion_tag\"].\' >\';\n\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoCanvas\n	Genera el codigo HTML y CSS correspondiente a un campo de canvas vinculado a un campo de datos sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoCanvas($registro_campos,$registro_datos_formulario,$formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD,$TablasCore;\n		global $MULTILANG_Cerrar,$MULTILANG_FrmCanvasLink,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $funciones_activacion_canvas;\n\n		//Busca datos del formulario\n		$RegistroDisenoFormulario=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario WHERE id=?\", \"$formulario\")->fetch();\n		$IdHTMLFormulario=$RegistroDisenoFormulario[\"id_html\"];\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Si detecta un valor en el registro entonces agrega el contenido\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\" && $registro_datos_formulario[\"$nombre_campo\"]!=\"\")\n			{\n				$cadena_decodificada=$registro_datos_formulario[\"$nombre_campo\"];\n				//$cadena_decodificada=gzdecode($cadena_decodificada);\n				$salida.=\'\n				<a href=\"javascript:CargarImagenCANVAS_\'.$registro_campos[\"id_html\"].\'();\"><i class=\"fa fa-picture-o\"></i><b>\'.$MULTILANG_FrmCanvasLink.\'</b></a><br>\n					<script language=\"JavaScript\">\n						function CargarImagenCANVAS_\'.$registro_campos[\"id_html\"].\'()\n							{\n								PCOJS_MostrarMensaje(\"\'.$MULTILANG_FrmCanvasLink.\'\",\"Cargando...\",\"modal-wide\");\n								$(\"#PCO_Modal_MensajeCuerpo\").html(\\\'<img src=\"\'.$cadena_decodificada.\'\" border=1>\\\');\n							}\n					</script>\';\n			}\n\n				$salida.=\'\n					<script language=\"JavaScript\">\n						// returns true if all color channels in each pixel are 0 (or \"blank\")\n						function isCanvasBlank(canvas) {\n						  return !canvas.getContext(\"2d\")\n							.getImageData(0, 0, canvas.width, canvas.height).data\n							.some(channel => channel !== 0);\n						}\n\n\n						function RedimensionarCanvas(canvas,PorcentajeAncho,PorcentajeAlto){\n						  const tempCanvas = canvas.ownerDocument.createElement(\"canvas\");\n						  const tctx=tempCanvas.getContext(\"2d\");\n						  const cw=canvas.width;\n						  const ch=canvas.height;\n						  tempCanvas.width=cw;\n						  tempCanvas.height=ch;\n						  tctx.drawImage(canvas,0,0);\n						  canvas.width*=PorcentajeAncho;\n						  canvas.height*=PorcentajeAlto;\n						  const ctx=canvas.getContext(\"2d\");\n						  ctx.drawImage(tempCanvas,0,0,cw,ch,0,0,cw*PorcentajeAncho,ch*PorcentajeAlto);\n						}\n\n						const RecortarCANVAS_\'.$registro_campos[\"id_html\"].\' = (function() {\n							function rowBlank(imageData, width, y) {\n								for (var x = 0; x < width; ++x) {\n									if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false;\n								}\n								return true;\n							}\n						\n							function columnBlank(imageData, width, x, top, bottom) {\n								for (var y = top; y < bottom; ++y) {\n									if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false;\n								}\n								return true;\n							}\n						\n							return function(canvas) {\n								const ctx = canvas.getContext(\"2d\");\n								const width = canvas.width;\n								const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n								const top = 0, bottom = imageData.height, left = 0, right = imageData.width;\n						\n								while (top < bottom && rowBlank(imageData, width, top)) ++top;\n								while (bottom - 1 > top && rowBlank(imageData, width, bottom - 1)) --bottom;\n								while (left < right && columnBlank(imageData, width, left, top, bottom)) ++left;\n								while (right - 1 > left && columnBlank(imageData, width, right - 1, top, bottom)) --right;\n						\n								constconst trimmed = ctx.getImageData(left, top, right - left, bottom - top);\n								const copy = canvas.ownerDocument.createElement(\"canvas\");\n								const copyCtx = copy.getContext(\"2d\");\n								copy.width = trimmed.width;\n								copy.height = trimmed.height;\n								copyCtx.putImageData(trimmed, 0, 0);\n						\n								return copy;\n							};\n						})();\n					</script>\';\n\n\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\" style=\"display: block !important; \">\';\n		\n		//Verifica si el ancho o el alto tienen alguna barra de proporcion indicando porcentaje final de escalado\n		$PartesAncho=explode(\"|\",$registro_campos[\"ancho\"]);\n		$AnchoCanvas=$PartesAncho[0]; //Toma el ancho inicial del canvas\n		$ProporcionFinalAnchoCanvas=$PartesAncho[1]; if ($ProporcionFinalAnchoCanvas==\"\") $ProporcionFinalAnchoCanvas=1; //Define Proporcion final (0.5,2,1.5,etc)\n		$PartesAlto=explode(\"|\",$registro_campos[\"alto\"]);\n		$AltoCanvas=$PartesAlto[0]; //Toma el ancho inicial del canvas\n		$ProporcionFinalAltoCanvas=$PartesAlto[1]; if ($ProporcionFinalAltoCanvas==\"\") $ProporcionFinalAltoCanvas=1; //Define Proporcion final (0.5,2,1.5,etc)\n\n		// Muestra el campo\n		$salida.=\'<canvas id=\"CANVAS_\'.$registro_campos[\"campo\"].\'\" width=\"\'.$AnchoCanvas.\'\" height=\"\'.$AltoCanvas.\'\" style=\"border: 1px solid #acc; display: inline;\">Su navegador no soporta Canvas</canvas>\n			<a href=\"javascript:limpiar_CANVAS_\'.$registro_campos[\"campo\"].\'();\"><i class=\"fa fa-times fa-2x\"></i></a>\n\n			<script type=\"text/javascript\">\';\n\n		//Prepara la funcion de reactivacion del canvas para el final del script\n		$funciones_activacion_canvas.=\'\n				$(function ()\n					{\n						$(\\\'#CANVAS_\'.$registro_campos[\"campo\"].\'\\\').sketch({defaultColor: \"\'.$registro_campos[\"color_trazo\"].\'\", defaultSize: \"\'.$registro_campos[\"tamano_pincel\"].\'\"});\n					});\';\n\n		$salida.=\'\n				/*\n				// Genera el vinculo entre el enlace de upload y la funcion\n				$(\"#upload\").on(\"click\", function ()\n					{\n						const oCanvas = document.getElementById(\"CANVAS_\'.$registro_campos[\"campo\"].\'\");\n						const strDataURI = oCanvas.toDataURL();\n						//alert(strDataURI); //Muestra el resultado en base64\n					});\n				*/\n\n				function limpiar_CANVAS_\'.$registro_campos[\"campo\"].\'()\n					{\n						// Busca el contexto del canvas y le reasigna ancho y alto para limpiarlo\n						const oCanvas = document.getElementById(\"CANVAS_\'.$registro_campos[\"campo\"].\'\");\n						const oContext = oCanvas.getContext(\"2d\");\n						//FORMA1:\n							oContext.clearRect(0, 0, oCanvas.width, oCanvas.height);\n						/*//FORMA2:\n							oCanvas.width = oCanvas.width;*/\n						/*//FORMA3:\n							oContext.save();\n							oContext.fillStyle = \"#FFF\";\n							oContext.fillRect(0, 0, oCanvas.width, oCanvas.height);\n							oContext.restore();\n							oCanvas.clear();*/\n						/*//FORMA4:\n							const ancho_anterior = oCanvas.width;\n							oCanvas.width = 1;\n							oCanvas.width = ancho_anterior;*/\n					}\n\n				function actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'()\n					{\n						// Pasa el valor del canvas al campo que se usa en almacenamiento\n						if (!isCanvasBlank(CANVAS_\'.$registro_campos[\"campo\"].\'))\n							{\n								oCanvas=RecortarCANVAS_\'.$registro_campos[\"campo\"].\'(CANVAS_\'.$registro_campos[\"campo\"].\');\n								//document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value=oCanvas.toDataURL();	 //Almacena imagen al 100%\n\n								//Redimensiona el canvas sobre otro (Si aplica)\n								RedimensionarCanvas(oCanvas,\'.$ProporcionFinalAnchoCanvas.\',\'.$ProporcionFinalAltoCanvas.\');\n								document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value=oCanvas.toDataURL();		 //Almacena imagen redimensionada\n							}\n						window.setTimeout(\"actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'()\",1000);\n					}\n\n				$( document ).ready(function() {\n					actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'();\n				});\n			</script>\n			<input type=\"hidden\" name=\"\'.$registro_campos[\"campo\"].\'\">\';\n\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoCamara\n	Genera el codigo HTML y CSS correspondiente a un campo de canvas usado para la captura de una imagen desde webcam\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoCamara($registro_campos,$registro_datos_formulario,$formulario)\n	{\n		global $TablasCore,$PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD;\n		global $MULTILANG_Cerrar,$MULTILANG_FrmCanvasLink,$MULTILANG_Capturar,$MULTILANG_FrmErrorCam,$MULTILANG_DesObligatorio,$MULTILANG_TitObligatorio;\n\n		//Busca datos del formulario\n		$RegistroDisenoFormulario=PCO_EjecutarSQL(\"SELECT * FROM \".$TablasCore.\"formulario WHERE id=?\", \"$formulario\")->fetch();\n		$IdHTMLFormulario=$RegistroDisenoFormulario[\"id_html\"];\n\n		$salida=\'\';\n		$nombre_campo=$registro_campos[\"campo\"];\n\n		// Si detecta un valor en el registro entonces agrega el contenido\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\" && $registro_datos_formulario[\"$nombre_campo\"]!=\"\")\n			{\n				$cadena_decodificada=$registro_datos_formulario[\"$nombre_campo\"];\n				$cadena_decodificada=gzdecode($cadena_decodificada);\n				$salida.=\'<a href=\"javascript:AbrirPopUp(\\\'CANVASPrevio\'.$registro_campos[\"campo\"].\'\\\');\"><i class=\"fa fa-picture-o\"></i><b>\'.$MULTILANG_FrmCanvasLink.\'</b></a><br>\n					<!-- INICIO DE MARCOS POPUP -->\n					<div id=\"CANVASPrevio\'.$registro_campos[\"campo\"].\'\" class=\"FormularioPopUps\">\n						<div align=center>\n							<table bgcolor=\"#FFFFFF\"><tr><td>\n								<img src=\"\'.$cadena_decodificada.\'\" border=1>\n							</td></tr></table>\n						</br>\n						<input type=\"Button\"  class=\"Botones\" value=\" -- \'.$MULTILANG_Cerrar.\' -- \" onClick=\"OcultarPopUp(\\\'CANVASPrevio\'.$registro_campos[\"campo\"].\'\\\')\">\n						</div>\n					<!-- FIN DE MARCOS POPUP -->\n					</div>\';\n			}\n\n		// Muestra el campo\n		$escala_reduccion=1;\n		//Agrega etiqueta del campo si es diferente de vacio\n		if ($registro_campos[\"titulo\"]!=\"\" && $registro_campos[\"ocultar_etiqueta\"]==\"0\")\n			$salida.=\'<label for=\"\'.$registro_campos[\"campo\"].\'\">\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\':</label>\';\n		//Abre el marco del control de datos\n		$salida.=\'<div class=\"form-group input-group\">\';\n\n		$salida.=\'\n			<table border=0>\n				<tr>\n					<td valign=top>\n						<div id=\"container\" style=\"margin: 0px auto; width: \'.$registro_campos[\"ancho\"].\'px; height: \'.$registro_campos[\"alto\"].\'px; border: 1px solid #acc;\">\n							<video autoplay id=\"videoElement\"  style=\"width: \'.$registro_campos[\"ancho\"].\'px; height: \'.$registro_campos[\"alto\"].\'px;\">\n							</video>\n						</div>\n					</td>\n					<td valign=top>\n						<i class=\"fa fa-camera\" OnClick=\"draw(v,context,w,h);\"></i>\n						<br>\n						<canvas id=\"CANVAS_\'.$registro_campos[\"campo\"].\'\" width=\"\'.(($registro_campos[\"ancho\"]/$escala_reduccion)).\'\" height=\"\'.(($registro_campos[\"alto\"]/$escala_reduccion)).\'\" style=\"width: \'.(($registro_campos[\"ancho\"]/$escala_reduccion)).\'px; height: \'.(($registro_campos[\"alto\"]/$escala_reduccion)).\'px; background-color: #CCC; visibility:visible;\"></canvas>\n					</td>\n				</tr>\n			</table>\n\n			<script>\n				const video = document.querySelector(\"#videoElement\");\n				navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;\n\n				if (navigator.getUserMedia) {\n					navigator.getUserMedia({video: true}, handleVideo, videoError);\n				}\n\n				function handleVideo(stream) {\n					video.src = window.URL.createObjectURL(stream);\n				}\n\n				function videoError(e) {\n					alert(\"\'.$MULTILANG_FrmErrorCam.\'\");\n				}\n\n				var v,CANVAS_\'.$registro_campos[\"campo\"].\',context,w,h;\n				const sel = document.getElementById(\\\'fileselect\\\');\n\n				document.addEventListener(\\\'DOMContentLoaded\\\', function(){\n				v = document.getElementById(\\\'videoElement\\\');\n				CANVAS_\'.$registro_campos[\"campo\"].\' = document.getElementById(\\\'CANVAS_\'.$registro_campos[\"campo\"].\'\\\');\n				context = CANVAS_\'.$registro_campos[\"campo\"].\'.getContext(\\\'2d\\\');\n				w = CANVAS_\'.$registro_campos[\"campo\"].\'.width;\n				h = CANVAS_\'.$registro_campos[\"campo\"].\'.height;\n				},false);\n\n				function draw(v,c,w,h) {\n				if(v.paused || v.ended) return false;\n				context.drawImage(v,0,0,w,h);\n				const uri = CANVAS_\'.$registro_campos[\"campo\"].\'.toDataURL(\"image/png\");\n				}\n\n				sel.addEventListener(\\\'change\\\',function(e){\n				const f = sel.files[0];\n				const fr = new FileReader();\n				fr.readAsDataURL(f);\n				})\n			</script>\';\n\n		$salida.=\'\n			<script>\n				function actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'()\n					{\n						// Pasa el valor del canvas al campo que se usa en almacenamiento\n						const oCanvas = document.getElementById(\"CANVAS_\'.$registro_campos[\"campo\"].\'\");\n						const strDataURI = oCanvas.toDataURL();\n						document.\'.$IdHTMLFormulario.\'.\'.$registro_campos[\"campo\"].\'.value=strDataURI;\n						window.setTimeout(\"actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'()\",1000);\n					}\n				window.setTimeout(\"actualizar_CANVAS_\'.$registro_campos[\"campo\"].\'()\",1000);\n			</script>\n			<input type=\"hidden\" name=\"\'.$registro_campos[\"campo\"].\'\">\';\n		//Si hay algun indicador adicional del campo abre los add-ons\n		if ($registro_campos[\"valor_unico\"] == \"1\" || $registro_campos[\"obligatorio\"] || $registro_campos[\"ayuda_titulo\"] != \"\")\n			{\n				$salida.= \'<span class=\"input-group-addon\">\';\n				// Muestra indicadores de obligatoriedad o ayuda\n				if ($registro_campos[\"obligatorio\"]) $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.$MULTILANG_TitObligatorio.\'</b><br>\'.$MULTILANG_DesObligatorio.\'\"><i class=\"fa fa-exclamation-triangle icon-orange\"></i></a>\';\n				if ($registro_campos[\"ayuda_titulo\"] != \"\") $salida.= \'<a href=\"#\"   data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"auto\" title=\"<b>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_titulo\"],$registro_datos_formulario).\'</b><br>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"ayuda_texto\"],$registro_datos_formulario).\'\"><i class=\"fa fa-question-circle\"></i></a>\';\n				$salida.= \'</span>\';\n			}\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n\n\n\n\n		$salidaNuevo=\'\';\n		$salidaNuevo.=\'\n			<table border=0>\n				<tr>\n					<td valign=top>\n						<div id=\"container\" style=\"margin: 0px auto; width: \'.$registro_campos[\"ancho\"].\'px; height: \'.$registro_campos[\"alto\"].\'px; border: 1px solid #acc;\">\n							<video id=\"PCO_WebCam_\'.$registro_campos[\"campo\"].\'\" playsinline autoplay style=\"width: \'.$registro_campos[\"ancho\"].\'px; height: \'.$registro_campos[\"alto\"].\'px;\"></video>\n							<div id=\"CANVAS_ErrorMsg\'.$registro_campos[\"campo\"].\'\"></div>\n						</div>\n					</td>\n					<td valign=top>\n						<i id=\"BotonCaptura_CANVAS_\'.$registro_campos[\"campo\"].\'\" class=\"fa fa-camera\" OnClick=\"const context = canvas.getContext(\"2d\"); context.drawImage(videoPCO_WebCam_\'.$registro_campos[\"campo\"].\', 0, 0, \'.$registro_campos[\"ancho\"].\', \'.$registro_campos[\"alto\"].\');\"></i>\n						<br>\n						<canvas id=\"CANVAS_\'.$registro_campos[\"campo\"].\'\" width=\"\'.(($registro_campos[\"ancho\"])).\'\" height=\"\'.(($registro_campos[\"alto\"])).\'\" style=\"width: \'.(($registro_campos[\"ancho\"])).\'px; height: \'.(($registro_campos[\"alto\"])).\'px; background-color: #CCC; visibility:visible;\"></canvas>\n					</td>\n				</tr>\n			</table>\n\n			<script language=\"JavaScript\">\n				\\\'use strict\\\';\n				\n				const videoPCO_WebCam_\'.$registro_campos[\"campo\"].\' = document.getElementById(\"PCO_WebCam_\'.$registro_campos[\"campo\"].\'\");\n				const canvas = document.getElementById(\"CANVAS_\'.$registro_campos[\"campo\"].\'\");\n				const snap = document.getElementById(\"snap\");\n				const errorMsgElement = document.querySelector(\"errorMsg\");\n				\n				const constraints = {\n				  audio: true,\n				  video: {\n					width: \'.$registro_campos[\"ancho\"].\', height: \'.$registro_campos[\"alto\"].\'\n				  }\n				};\n				\n				// Access webcam\n				async function init() {\n				  try {\n					const stream = await navigator.mediaDevices.getUserMedia(constraints);\n					handleSuccess(stream);\n				  } catch (e) {\n					$(\"#CANVAS_ErrorMsg\'.$registro_campos[\"campo\"].\'\").html(\"<b>Error Camara</b><br> \"+\"navigator.getUserMedia error:\"+e.toString());\n				  }\n				}\n				\n				// Success\n				function handleSuccess(stream) {\n				  window.stream = stream;\n				  videoPCO_WebCam_\'.$registro_campos[\"campo\"].\'.srcObject = stream;\n				}\n				\n				// Load init\n				init();\n			</script>\';\n\n		$salida = $salidaNuevo;\n\n\n\n\n\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarObjetoBotonComando\n	Genera el codigo HTML y CSS correspondiente a un boton de comando sobre un formulario\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		registro_datos_formulario - Arreglo asociativo con nombres de campo y valores cuando se hacen llamados de registro especificos\n		formulario - ID unico del formulario al cual pertenece el objeto\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_CargarObjetoBotonComando($registro_campos,$registro_datos_formulario,$registro_formulario)\n	{\n		global $PCO_CampoBusquedaBD,$PCO_ValorBusquedaBD,$IdiomaPredeterminado;\n		global $funciones_activacion_datepickers;\n		global $MULTILANG_TitValorUnico,$MULTILANG_DesValorUnico,$MULTILANG_TitObligatorio,$MULTILANG_DesObligatorio;\n		global $TabIndex_Elemento;\n		$salida=\'\';\n\n		//Determina si el estilo del objeto debe ser inline o no\n		$cadena_modo_inline=\'\';\n		if ($registro_campos[\"modo_inline\"])\n			$cadena_modo_inline=\'display:inline;\';\n\n		//Transfiere variables de mensajes de retorno asociadas al boton\n		$comando_javascript=\"\";\n		if ($registro_campos[\"retorno_titulo\"]!=\"\")\n			$comando_javascript=\"document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorTitulo.value=\'\".$registro_botones[\"retorno_titulo\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorDescripcion.value=\'\".$registro_botones[\"retorno_texto\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorIcono.value=\'\".$registro_botones[\"retorno_icono\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorEstilo.value=\'\".$registro_botones[\"retorno_estilo\"].\"\';\";\n\n		//Define el tipo de boton de acuerdo al tipo de accion\n		switch ($registro_campos[\"tipo_accion\"]) {\n\n			case \'interna_guardar\':	$comando_javascript.=\"PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\'); \";	 break;\n			case \'interna_limpiar\':	$comando_javascript.=\"document.getElementById(\'\".$registro_formulario[\"id_html\"].\"\').reset();\"; break;\n			case \'interna_escritorio\': $comando_javascript.=\"document.PCO_FormVerMenu.submit();\"; break;\n			case \'interna_actualizar\': $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_ActualizarDatosFormulario\'; PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\'); \"; break;\n			case \'externa_postcode\':   $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_EjecutarPostAccionForm\'; PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\'); \"; break;\n			case \'interna_eliminar\':   $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_EliminarDatosFormulario\';document.\".$registro_formulario[\"id_html\"].\".submit();\"; break;\n			case \'interna_cargar\':	 $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_CargarObjeto\';document.\".$registro_formulario[\"id_html\"].\".PCO_Objeto.value=\'\".$registro_campos[\"accion_usuario\"].\"\';  PCOJS_SanitizarValoresListaMultiple(); document.\".$registro_formulario[\"id_html\"].\".submit(); \"; break;\n			case \'externa_formulario\': $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'\".$registro_campos[\"accion_usuario\"].\"\'; PCOJS_SanitizarValoresListaMultiple(); document.\".$registro_formulario[\"id_html\"].\".submit();\"; break;\n			case \'externa_javascript\': $comando_javascript.=$registro_campos[\"accion_usuario\"];\n		}\n\n\n		//Verifica si el registro de botones presenta algun texto de confirmacion y lo antepone al script\n		$cadena_confirmacion_accion_pre=\"\";\n		$cadena_confirmacion_accion_pos=\"\";\n		if (@$registro_campos[\"confirmacion_texto\"]!=\"\")\n			{\n				$cadena_confirmacion_accion_pre=\" if (confirm(\'\".PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"confirmacion_texto\"],$registro_datos_formulario).\"\')) {\";\n				$cadena_confirmacion_accion_pos=\" } else {} \";\n			}\n\n		//Genera cadena par el identificador del elemento usando el campo \"campo\". Normalmente oculto\n		$cadena_identificador=\'\';\n		if ($registro_campos[\"campo\"]!=\"\")\n			$cadena_identificador=\'id=\"\'.$registro_campos[\"id_html\"].\'\"\';\n\n		//Genera la cadena del enlace\n		$cadena_javascript=\'href=\"javascript:  \'.$cadena_confirmacion_accion_pre.\'  \'.@$comando_javascript.\'  \'.$cadena_confirmacion_accion_pos.\'  \"\';\n\n		//Abre el marco del control de datos style=\"display:inline;\"\n		$salida.=\'<div \'.$cadena_identificador.\' style=\"\'.$cadena_modo_inline.\'\" class=\"form-group input-group\">\';\n		// Muestra el campo\n		$salida.=\'<a tabindex=\'.$TabIndex_Elemento.\' id=\"\'.$registro_campos[\"id_html\"].\'\" class=\"btn \'.$registro_campos[\"personalizacion_tag\"].\'\" \'.@$cadena_javascript.\'><i class=\"\'.$registro_campos[\"imagen\"].\'\"></i> \'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"titulo\"],$registro_datos_formulario).\'</a>\';\n		//Cierra marco del control de datos\n		$salida.= \'</div>\';\n\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_AgregarFuncionesEdicionObjeto\n	Genera el codigo HTML y CSS correspondiente los botones y demas elementos para la edicion en caliente de un objeto\n\n	Variables de entrada:\n\n		registro_campos - listado de campos sobre el formulario en cuestion\n		tipo_elemento - Tipo de elemento a ser generado\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al objeto publicado dentro del formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario>\n*/\nfunction PCO_AgregarFuncionesEdicionObjeto($registro_campos,$registro_formulario,$tipo_elemento)\n	{\n		global $MULTILANG_FrmEstaSeguro,$MULTILANG_FrmDesplazarObjetos,$MULTILANG_SaltoEdicion,$MULTILANG_Embebido,$MULTILANG_FrmValida,$MULTILANG_FrmPredeterminado,$MULTILANG_FrmCampo,$MULTILANG_MnuPropiedad,$MULTILANG_Detalles,$MULTILANG_Evento,$TablasCore,$MULTILANG_Cerrar,$ArchivoCORE,$MULTILANG_Editar,$MULTILANG_FrmAdvDelCampo,$MULTILANG_Eliminar,$MULTILANG_FrmAumentaPeso,$MULTILANG_FrmDisminuyePeso,$MULTILANG_Anterior,$MULTILANG_Columna,$MULTILANG_Siguiente;\n		$salida=\'\';\n		if ($tipo_elemento==\"ComplementoDisenoElemento\")\n			{\n				$salida=\'onmouseenter=\"$(this).css(\\\'border\\\', \\\'1px solid\\\'); $(this).css(\\\'border-color\\\', \\\'#ff0000\\\');  //c2a7a7\n				$(\\\'#PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\\\').css({\\\'visibility\\\':\\\'visible\\\'});\n				$(\\\'#PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\\\').css({\\\'display\\\':\\\'block\\\'}); \"\n				onmouseleave=\"$(this).css(\\\'border\\\', \\\'0px solid\\\'); $(\\\'#PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\\\').css({\\\'visibility\\\':\\\'hidden\\\'}); $(\\\'#PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\\\').css({\\\'display\\\':\\\'none\\\'});  \"\';\n			}\n		if ($tipo_elemento==\"ComplementoDisenoMarcoOpciones\")\n			{\n				//Determina estados de activacion o no para controles segun valores actuales del registro\n				$EstadoDeshabilitadoMoverIzquierda=\"\";\n				$EstadoDeshabilitadoMoverDerecha=\"\";\n				$EstadoDeshabilitadoMoverArriba=\"\";\n				if($registro_campos[\"columna\"]-1<=0) $EstadoDeshabilitadoMoverIzquierda=\"disabled\";\n				if($registro_campos[\"columna\"]+1>$registro_formulario[\"columnas\"]) $EstadoDeshabilitadoMoverDerecha=\"disabled\";\n				if($registro_campos[\"peso\"]-1<=0) $EstadoDeshabilitadoMoverArriba=\"disabled\";\n\n				//Busca si el elemento tiene o no eventos para poner un boton de enlace\n				$ComplementoBotonEventos=\"\";\n				$RegistroConteoEventos=PCO_EjecutarSQL(\"SELECT COUNT(*) as conteo_eventos FROM \".$TablasCore.\"evento_objeto WHERE objeto=? \",$registro_campos[\"id\"])->fetch();\n				if($RegistroConteoEventos[\"conteo_eventos\"]>0)\n					{\n						//Listado de eventos\n						$ResultadoEventos=PCO_EjecutarSQL(\"SELECT evento,LENGTH(javascript) as bytes_codigo FROM \".$TablasCore.\"evento_objeto WHERE objeto=? \",$registro_campos[\"id\"]);\n						$CadenaDetalleEventos=\"\";\n						$ConteoEventos=1;\n						while ($RegistroEventos=$ResultadoEventos->fetch())\n							{\n								$CadenaDetalleEventos.=\"<li><b>\".$RegistroEventos[\"evento\"].\"</b> (\".$RegistroEventos[\"bytes_codigo\"].\" bytes)\";\n								$ConteoEventos++;\n							}\n						$ComplementoBotonEventos=\'<br><a class=\"btn btn-xs btn-default\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Evento.\'(s)\'.$CadenaDetalleEventos.\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_EditarFormulario&campo=\'.$registro_campos[\"id\"].\'&formulario=\'.$registro_campos[\"formulario\"].\'&popup_activo=FormularioCampos&pestana_activa_editor=eventos_objeto-tab&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-bolt fa-fw texto-blink\"></i></a>\n						\';\n					}\n\n				//Si el elemento es un formulario o informe embebido busca ademas el nombre del mismo\n				$Complemento_NombreEmbebido=\"\";\n				if ($registro_campos[\"tipo\"]==\"informe\")\n					{\n						$IdentificadorBusqueda=$registro_campos[\"informe_vinculado\"];\n						$RegistroEmbebido=PCO_EjecutarSQL(\"SELECT id,titulo FROM \".$TablasCore.\"informe WHERE id=$IdentificadorBusqueda \")->fetch();\n						$Complemento_NombreEmbebido=\"Inf ID \".$RegistroEmbebido[\"id\"].\": <b>\".$RegistroEmbebido[\"titulo\"].\"</b>\";\n					}\n				if ($registro_campos[\"tipo\"]==\"form_consulta\")\n					{\n						$IdentificadorBusqueda=$registro_campos[\"formulario_vinculado\"];\n						$RegistroEmbebido=PCO_EjecutarSQL(\"SELECT id,titulo FROM \".$TablasCore.\"formulario WHERE id=$IdentificadorBusqueda \")->fetch();\n						$Complemento_NombreEmbebido=\"Frm ID \".$RegistroEmbebido[\"id\"].\": <b>\".$RegistroEmbebido[\"titulo\"].\"</b>\";\n					}\n\n				//Pone controles\n				$salida=\'<div id=\"PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\" style=\"margin:2px; display:none; visibility:hidden; position: absolute; z-index:1000;\">\n							<div style=\"display: inline-block; vertical-align:top;\">\n								<a class=\"btn btn-xs btn-warning\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Editar.\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_EditarFormulario&campo=\'.$registro_campos[\"id\"].\'&formulario=\'.$registro_campos[\"formulario\"].\'&popup_activo=FormularioCampos&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-fw fa-pencil\"></i></a>\n								\'.$ComplementoBotonEventos.\'\n								<br><br>\n								<a onclick=\\\'return confirm(\"\'.$MULTILANG_FrmDesplazarObjetos.\'\\n\\n\'.$MULTILANG_FrmEstaSeguro.\'\");\\\' class=\"btn btn-xs btn-success\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_FrmDesplazarObjetos.\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_DesplazarObjetosForm&idObjetoForm=\'.$registro_campos[\"id\"].\'&accion_retorno=PCO_EditarFormulario&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-fw fa-step-forward fa-rotate-90\"></i></a>								\n							</div>\n							<div style=\"display: inline-block;\">\n								<a class=\"btn btn-xs btn-info \'.$EstadoDeshabilitadoMoverIzquierda.\'\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Anterior.\' \'.$MULTILANG_Columna.\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=cambiar_estado_campo&id=\'.$registro_campos[\"id\"].\'&tabla=formulario_objeto&campo=columna&formulario=\'.$registro_campos[\"formulario\"].\'&accion_retorno=PCO_EditarFormulario&valor=\'.($registro_campos[\"columna\"]-1).\'&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-arrow-left\"></i></a>\n							</div>\n							<div style=\"display: inline-block;\">\n								<a class=\"btn btn-xs btn-info \'.$EstadoDeshabilitadoMoverArriba.\'\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_FrmDisminuyePeso.\' a \'.($registro_campos[\"peso\"]-1).\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=cambiar_estado_campo&id=\'.$registro_campos[\"id\"].\'&tabla=formulario_objeto&campo=peso&formulario=\'.$registro_campos[\"formulario\"].\'&accion_retorno=PCO_EditarFormulario&valor=\'.($registro_campos[\"peso\"]-1).\'&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-arrow-up\"></i></a>\n								<br>\n								<a class=\"btn btn-xs btn-info\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_FrmAumentaPeso.\' a \'.($registro_campos[\"peso\"]+1).\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=cambiar_estado_campo&id=\'.$registro_campos[\"id\"].\'&tabla=formulario_objeto&campo=peso&formulario=\'.$registro_campos[\"formulario\"].\'&accion_retorno=PCO_EditarFormulario&valor=\'.($registro_campos[\"peso\"]+1).\'&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-arrow-down\"></i></a>\n							</div>\n							<div style=\"display: inline-block;\">\n								<a class=\"btn btn-xs btn-info \'.$EstadoDeshabilitadoMoverDerecha.\'\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Siguiente.\' \'.$MULTILANG_Columna.\'\" href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=cambiar_estado_campo&id=\'.$registro_campos[\"id\"].\'&tabla=formulario_objeto&campo=columna&formulario=\'.$registro_campos[\"formulario\"].\'&accion_retorno=PCO_EditarFormulario&valor=\'.($registro_campos[\"columna\"]+1).\'&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\'><i class=\"fa fa-arrow-right\"></i></a>\n							</div>\n							\n							<div style=\"display: inline-block; vertical-align:top;\">\n								<a class=\"btn btn-xs\" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"<div align=left><font color=yellow>\'.$MULTILANG_Detalles.\' <i>(\'.$MULTILANG_MnuPropiedad.\')</i></font><br>ID HTML: <b>\'.$registro_campos[\"id_html\"].\'</b><br>\'.$MULTILANG_FrmCampo.\': <b>\'.$registro_campos[\"campo\"].\'</b><br>\'.$MULTILANG_FrmPredeterminado.\': <b>\'.$registro_campos[\"valor_predeterminado\"].\'</b><br>\'.$MULTILANG_FrmValida.\': <b>\'.$registro_campos[\"validacion_datos\"].\'</b> Extra: <b>\'.$registro_campos[\"validacion_extras\"].\'</b></div>\" href=\\\'#\\\'><i class=\"fa fa-info-circle\"></i></a>\';\n							//Si el objeto es un formulario o informe embebido agrega enlace para su edicion directa\n							if ($registro_campos[\"tipo\"]==\"form_consulta\")\n								$salida.=\'<br><a onclick=\\\'return confirm(\"\'.$MULTILANG_SaltoEdicion.\'\");\\\' href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_EditarFormulario&formulario=\'.$registro_campos[\"formulario_vinculado\"].\'&popup_activo=\\\' class=\"btn btn-primary btn-xs\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Editar.\' \'.$MULTILANG_Embebido.\'<br>\'.$Complemento_NombreEmbebido.\'\"><i class=\"fa fa fa-object-ungroup\"></i></a>\';\n							if ($registro_campos[\"tipo\"]==\"informe\")\n								$salida.=\'<br><a onclick=\\\'return confirm(\"\'.$MULTILANG_SaltoEdicion.\'\");\\\' href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_EditarInforme&informe=\'.$registro_campos[\"informe_vinculado\"].\'&popup_activo=\\\' class=\"btn btn-primary btn-xs\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Editar.\' \'.$MULTILANG_Embebido.\'<br>\'.$Complemento_NombreEmbebido.\'\"><i class=\"fa fa fa-object-ungroup\"></i></a>\';\n				$salida.=\'</div>\n							<div style=\"display: inline-block;\">\n								<a class=\"btn btn-xs \" data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Cerrar.\'\" href=\"javascript:OcultarOpcionesEdicion(this,\\\'#PCOEditorContenedor_\'.$registro_campos[\"id\"].\'\\\');\"><i class=\"fa fa-times\"></i></a>\n								<br>\n								<a onclick=\\\'return confirm(\"\'.$MULTILANG_FrmAdvDelCampo.\'\");\\\' href=\\\'\'.$ArchivoCORE.\'?PCO_Accion=PCO_EliminarCampoFormulario&campo=\'.$registro_campos[\"id\"].\'&formulario=\'.$registro_campos[\"formulario\"].\'&nombre_tabla=\'.$registro_formulario[\"tabla_datos\"].\'\\\' class=\"btn btn-danger btn-xs\"  data-toggle=\"tooltip\" data-html=\"true\"  data-placement=\"top\" title=\"\'.$MULTILANG_Eliminar.\'\"><i class=\"fa fa-trash\"></i></a>\n							</div>\n							</div>\';\n			}\n		return $salida;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarFormulario\n	Genera el codigo HTML correspondiente a un formulario de la aplicacion y hace los llamados necesarios para la diagramacion por pantalla de los diferentes objetos que lo componen.\n\n	Variables de entrada:\n\n		formulario - ID unico del formulario que se desea cargar\n		en_ventana - Opcional, determina si el formulario es cargado en una ventana o directamente sobre el escritorio\n		PCO_CampoBusquedaBD - Opcional, indica el campo sobre el cual se deben realizar busquedas para el cargue automatico de campos del formulario desde la base de datos\n		PCO_ValorBusquedaBD - Opcional, indica el valor que sera buscado sobre el PCO_CampoBusquedaBD para encontrar los valores de cada objeto en el formulario\n		anular_form - Opcional, indica si las etiquetas del formulario HTML deben ser eliminadas y agregar los campos crudos dentro del form\n		modo_diseno_formulario - Opcional, indica si se esta disenando el formulario para presentar algunos controles extra\n\n	(start code)\n		SELECT * FROM \".$TablasCore.\"formulario WHERE id=\'$formulario\'\n		SELECT id,peso,visible FROM \".$TablasCore.\"formulario_objeto WHERE formulario=\'$formulario\' AND fila_unica=\'1\' AND visible=1 UNION SELECT 0,$limite_superior,0 ORDER BY peso\n		SELECT * FROM \".$TablasCore.\"formulario_objeto WHERE formulario=\'$formulario\' AND columna=\'$cl\' AND visible=1 AND peso >\'$limite_inferior\' AND peso <=\'$limite_superior\' ORDER BY peso\n		Por cada registro\n			Llamar creacion de objeto correspondiente\n		SELECT * FROM \".$TablasCore.\"formulario_objeto WHERE formulario=\'$formulario\' AND id=\'$ultimo_id\'\n		SELECT * FROM \".$TablasCore.\"formulario_boton WHERE formulario=\'$formulario\' AND visible=1 ORDER BY peso\n	(end)\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al formulario\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function cargar_formulario($formulario,$en_ventana=1,$PCO_CampoBusquedaBD=\"\",$PCO_ValorBusquedaBD=\"\",$anular_form=0,$modo_diseno_formulario=0)\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework cargar_formulario().  En su lugar utilice PCO_CargarFormulario() \"; }\nfunction PCO_CargarFormulario($formulario,$en_ventana=1,$PCO_CampoBusquedaBD=\"\",$PCO_ValorBusquedaBD=\"\",$anular_form=0,$modo_diseno_formulario=0,$ComplementoPestanas=\"\")\n  {\n		global $ModoDesarrolladorPractico,$PCO_RegistroDatosFormulario;\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$LlaveDePaso;\n		global $PCO_InformeFiltro,$PCO_FuncionesJSInternasFORM;\n		global $_SeparadorCampos_;\n		// Carga variables de definicion de tablas\n		global $ListaCamposSinID_formulario,$ListaCamposSinID_formulario_objeto,$ListaCamposSinID_formulario_boton,$ListaCamposSinID_menu;\n		global $MULTILANG_Formularios,$MULTILANG_Editar,$MULTILANG_Elementos,$MULTILANG_Agregar,$MULTILANG_Configuracion,$MULTILANG_AvisoSistema,$MULTILANG_ErrFrmObligatorio,$MULTILANG_ErrorTiempoEjecucion,$MULTILANG_ObjetoNoExiste,$MULTILANG_ContacteAdmin,$MULTILANG_Formularios,$MULTILANG_VistaImpresion,$MULTILANG_InfRetornoFormFiltrado;\n		global $PCO_InformesListaColumnasDT,$PCO_InformesRecuperacionAJAX,$PCO_InformesIdCache,$PCO_InformesDataTable,$PCO_InformesDataTablePaginaciones,$PCO_InformesDataTableTotales,$PCO_InformesDataTableFormatoTotales,$PCO_InformesDataTableExrpotaCLP,$PCO_InformesDataTableExrpotaCSV,$PCO_InformesDataTableExrpotaXLS,$PCO_InformesDataTableExrpotaPDF,$PCO_InformesDataTableDefineCOLS,$PCO_InformesDataTable_pane_activado,$PCO_InformesDataTable_pane_cascada,$PCO_InformesDataTable_pane_colapsado,$PCO_InformesDataTable_pane_columnas,$PCO_InformesDataTable_pane_subtotalesrelativos,$PCO_InformesDataTable_pane_conteos,$PCO_InformesDataTable_pane_controles,$PCO_InformesDataTable_pane_control_colapsar,$PCO_InformesDataTable_pane_control_ordenar;\n		global $POSTForm_ListaCamposObligatorios,$POSTForm_ListaTitulosObligatorios;\n		global $PCO_BarraHerramientasFormulario; \n		global $TabIndex_Elemento;\n\n		// Busca datos del formulario\n		$registro_formulario=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario.\" FROM \".$TablasCore.\"formulario WHERE id=?\",\"$formulario\")->fetch();\n\n		//Determina si el usuario es un disenador de aplicacion para mostrar el ID de objeto a manera informativa y un boton de salto a edicion\n		$BotonSaltoEdicion=\'\n					<a class=\"btn btn-default btn-xs\" href=\"index.php?PCO_Accion=PCO_EditarFormulario&popup_activo=&formulario=\'.$formulario.\'\">\n						<div><i class=\"fa fa-pencil-square\"></i> \'.$MULTILANG_Editar.\' \'.$MULTILANG_Formularios.\' <i>[ID=\'.$formulario.\']</i></div>\n					</a>\';\n		if (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && ($formulario>=0 || $ModoDesarrolladorPractico==-10000) )\n			$ComplementoIdObjetoEnTitulo=\"  $BotonSaltoEdicion\";\n\n		echo \'\n		<script type=\"text/javascript\">\n			function AgregarElemento(columna,fila,elemento)\n				{\n					//carga dinamicamente objetos html a marcos\n					const capa = document.getElementById(ubicacion);\n					const zona = document.createElement(\"po\");\n					zona.innerHTML = elemento;\n					capa.appendChild(zona);\n				}\n\n			function ImprimirMarco(nombre)\n				{\n				  const marco_contenidos = document.getElementById(nombre);\n				  const ventana_impresion = window.open(\" \", \"PopUpImpresion\");\n\n				  //Agrega estilos basicos\n					//ventana_impresion.document.write( \\\'<link rel=\"stylesheet\" type=\"text/css\" href=\"general.css\">\\\' );\n\n				  //Agrega titulo del formulario\n					//ventana_impresion.document.write( \\\'<div align=CENTER><b>\'.$registro_formulario[\"titulo\"].\'</b></div><hr>\\\' );\n\n				  //Agrega el concenito del DIV al documento\n					ventana_impresion.document.write( marco_contenidos.innerHTML );\n					ventana_impresion.document.close();\n\n				  //Abre ventana de impresion\n					ventana_impresion.print( );\n\n				  //Cierra ventana de impresion\n					ventana_impresion.close();\n				}\n\n			function OcultarOpcionesEdicion(ObjetoEnlazado,NombreMarcoOpciones)\n				{\n					BasuritaVar1=$(ObjetoEnlazado).css(\\\'border\\\', \\\'0px solid\\\');\n					BasuritaVar2=$(NombreMarcoOpciones).css({\\\'visibility\\\':\\\'hidden\\\'});\n					BasuritaVar3=$(NombreMarcoOpciones).css({\\\'display\\\':\\\'none\\\'});\n				}\n\n		</script>\n		<!--<input type=button onclick=\\\'AgregarElemento(\"1\",\"1\",\"hello world\");\\\'>-->\';\n\n\n		//Si no encuentra formulario presenta error\n		if ($registro_formulario[\"id\"]==\"\")	PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$MULTILANG_ObjetoNoExiste.\" \".$MULTILANG_ContacteAdmin.\"<br>(\".$MULTILANG_Formularios.\" $formulario)\", \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n\n		// En caso de recibir un campo base y valor base se hace la busqueda para recuperar la informacion\n		if ($PCO_CampoBusquedaBD!=\"\" && $PCO_ValorBusquedaBD!=\"\")\n			{\n				$consulta_datos_formulario = $ConexionPDO->prepare(\"SELECT * FROM \".$registro_formulario[\"tabla_datos\"].\" WHERE $PCO_CampoBusquedaBD=\'$PCO_ValorBusquedaBD\'\");\n				$consulta_datos_formulario->execute();\n				$registro_datos_formulario = $consulta_datos_formulario->fetch();\n				$PCO_RegistroDatosFormulario=$registro_datos_formulario;\n			}\n		\n		//Carga cualquier script PRE para el formulario\n		if ($registro_formulario[\"pre_script\"]!=\"\" && $modo_diseno_formulario==0)\n			{\n				//Evalua si el codigo ya inicia con <?php y sino lo agrega\n				$ComplementoInicioScript=\"\";\n				if (substr(trim($registro_formulario[\"pre_script\"]),0,5)!=\'<?php\')\n					$ComplementoInicioScript=\"<?php\\n\";\n				PCO_EvaluarCodigo($ComplementoInicioScript.$registro_formulario[\"pre_script\"],1,\"Detalles: PRE-Code Form ID=\".$formulario);\n			}\n			\n		\n		// Define la barra de herramientas mini superior (en barra de titulo)\n		@$PCO_BarraHerramientasFormulario.=\'\n				<a  href=\"#\" data-toggle=\"tooltip\" data-html=\"true\"  title=\"\'.$MULTILANG_VistaImpresion.\'\" name=\"\">\n					<i class=\"fa fa-print\" OnClick=\"ImprimirMarco(\\\'MARCO_IMPRESION\\\');\"></i>\n				</a>\';\n\n		// Establece color de fondo para el form\n		$color_fondo=\"#f2f2f2\";\n\n		//Determina si esta en modo diseno para agregar algunos elementos extra al titulo del form\n		if ($modo_diseno_formulario)\n			{\n				//Genera llaves de apertura unicos para los archivos de pcoder \n				//FORMA 1: Enlaces estandar (Modo de emergencia o depuracion de PCoder)\n				$PCO_EnlaceScriptPRE =\"javascript:PCO_VentanaPopup(\'index.php?PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:-33:0&Presentar_FullScreen=1&Precarga_EstilosBS=1&Origen_Archivo=B&Tabla_Archivo=core_formulario&Campo_Archivo=pre_script&PCODER_extension=php&PCODER_ModoEditor=PHP&PCODER_TipoMenu=Iconos&PCODER_EstadoSimple=1&Llave_Registro={$formulario}&PCODER_Titulo=Script_PRE_Formulario_{$formulario}_(PHP)\',\'PcoderNG\',\'toolbar=no, location=no, directories=0, directories=no, status=no, location=no, menubar=no ,scrollbars=no, resizable=yes, fullscreen=no, titlebar=no, width=800, height=600\');\";  //ANTES  width=\'+screen.width+\', height=\'+screen.height);\n				$PCO_EnlaceScriptPOST=\"javascript:PCO_VentanaPopup(\'index.php?PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:-33:0&Presentar_FullScreen=1&Precarga_EstilosBS=1&Origen_Archivo=B&Tabla_Archivo=core_formulario&Campo_Archivo=post_script&PCODER_extension=php&PCODER_ModoEditor=PHP&PCODER_TipoMenu=Iconos&PCODER_EstadoSimple=1&Llave_Registro={$formulario}&PCODER_Titulo=Script_POST_Formulario_{$formulario}_(PHP)\',\'PcoderNG\',\'toolbar=no, location=no, directories=0, directories=no, status=no, location=no, menubar=no ,scrollbars=no, resizable=yes, fullscreen=no, titlebar=no, width=800, height=600\');\";  //ANTES  width=\'+screen.width+\', height=\'+screen.height);\n				$PCO_EnlaceScriptJS  =\"javascript:PCO_VentanaPopup(\'index.php?PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:-33:0&Presentar_FullScreen=1&Precarga_EstilosBS=1&Origen_Archivo=B&Tabla_Archivo=core_formulario&Campo_Archivo=javascript&PCODER_extension=js&PCODER_ModoEditor=JavaScript&PCODER_TipoMenu=Iconos&PCODER_EstadoSimple=1&Llave_Registro={$formulario}&PCODER_Titulo=Script_JS_Formulario_{$formulario}_(JS)\' ,\'PcoderNG\',\'toolbar=no, location=no, directories=0, directories=no, status=no, location=no, menubar=no ,scrollbars=no, resizable=yes, fullscreen=no, titlebar=no, width=800, height=600\');\";  //ANTES  width=\'+screen.width+\', height=\'+screen.height);\n				//FORMA 2: Con funcion interna de apertura - Sobreescribe FORMA 1 - Comentar para pasar a modo de emergencia\n				$TituloPCoder_COMPLEMENTO=\" - <font color=white>\".$registro_formulario[\"titulo\"].\"</font> \";\n				$LlaveParcial_FirmaSistema=substr($LlaveDePaso,-3);\n				$PCO_EnlaceScriptPRE =\"javascript:PCOJS_CargarArchivoPCoderBD(\'{$LlaveParcial_FirmaSistema}\',\'\',\'\',\'\',\'No\',\'B\',\'core_formulario\',\'pre_script\', \'{$formulario}\',\'php\',\'PHP\'	   ,\'Iconos\',\'1\',\'<font color=white>Script_PRE</font> Formulario_{$formulario}_(PHP){$TituloPCoder_COMPLEMENTO}\');\";\n				$PCO_EnlaceScriptPOST=\"javascript:PCOJS_CargarArchivoPCoderBD(\'{$LlaveParcial_FirmaSistema}\',\'\',\'\',\'\',\'No\',\'B\',\'core_formulario\',\'post_script\',\'{$formulario}\',\'php\',\'PHP\'	   ,\'Iconos\',\'1\',\'<font color=white>Script_POST</font> Formulario_{$formulario}_(PHP){$TituloPCoder_COMPLEMENTO}\');\";\n				$PCO_EnlaceScriptJS  =\"javascript:PCOJS_CargarArchivoPCoderBD(\'{$LlaveParcial_FirmaSistema}\',\'\',\'\',\'\',\'No\',\'B\',\'core_formulario\',\'javascript\' ,\'{$formulario}\',\'js\' ,\'JavaScript\',\'Iconos\',\'1\',\'<font color=white>Script_JS</font> Formulario_{$formulario}_(PHP){$TituloPCoder_COMPLEMENTO}\');\";\n\n				$ComplementoTituloFormulario=\'\n				<div class=\"pull-right\">\n					<a class=\"btn btn-primary btn-xs\" data-toggle=\"modal\" title=\"\'.$MULTILANG_FrmAdvScriptForm.\'\" href=\"\'.$PCO_EnlaceScriptPRE.\'\">\n						<div><i class=\"fa fa-file-code-o\"></i> PRE</div>\n					</a>\n					<a class=\"btn btn-info btn-xs\" data-toggle=\"modal\" title=\"\'.$MULTILANG_FrmAdvScriptForm.\'\" href=\"\'.$PCO_EnlaceScriptPOST.\'\">\n						<div><i class=\"fa fa-file-code-o\"></i> POST</div>\n					</a>\n					<a class=\"btn btn-warning btn-xs\" data-toggle=\"modal\" title=\"\'.$MULTILANG_FrmAdvScriptForm.\'\" href=\"\'.$PCO_EnlaceScriptJS.\'\">\n						<div><i class=\"fa fa-file-code-o\"></i> JS</div>\n					</a>\n					&nbsp;\n					<a class=\"btn btn-default btn-xs\" href=\"javascript:PCOJS_AlternarBarraFlotanteIzquierda();\">\n						<div><i class=\"fa fa-cog fa-spin fa-fw\"></i> \'.$MULTILANG_Configuracion.\' / \'.$MULTILANG_Agregar.\' \'.$MULTILANG_Elementos.\'</div>\n					</a>\n				</div>\';\n			}\n\n		// Crea ventana si aplica para el form\n		if ($en_ventana) PCO_AbrirVentana(PCO_ReemplazarVariablesPHPEnCadena($registro_formulario[\"titulo\"]).$ComplementoTituloFormulario.$ComplementoIdObjetoEnTitulo,$registro_formulario[\"estilo_ventana\"],\'\',$PCO_BarraHerramientasFormulario);\n\n		//Busca las posibles opciones de menu agregadas al formulario\n		$RegistroCantidadMenues=PCO_EjecutarSQL(\"SELECT COUNT(*) as CantidadMenues FROM \".$TablasCore.\"menu WHERE formulario_vinculado=\'$formulario\' AND padre=0\")->fetch();\n		if ($RegistroCantidadMenues[\"CantidadMenues\"]>0)\n			{\n				echo \'<!-- Boton expansible para menu en dispositivos moviles -->\n					<nav class=\"navbar navbar-default\" style=\"min-height:30px !important; margin:0px !important; padding:0px !important;\"> <!--  navbar-xs navbar-fixed-top  navbar-inverse navbar-fixed-bottom navbar-static-top  -->\n						<div class=\"navbar-header\">\n							<button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#MENU_FORMULARIO_\'.$formulario.\'\" aria-expanded=\"false\">\n								<i class=\"fa fa-bars\"></i>\n							</button>\n						</div>\n						<div class=\"collapse navbar-collapse\" id=\"MENU_FORMULARIO_\'.$formulario.\'\">\';\n							$resultado=PCO_EjecutarSQL(\"SELECT \".$TablasCore.\"menu.id as id,$ListaCamposSinID_menu FROM \".$TablasCore.\"menu WHERE formulario_vinculado=\'$formulario\' AND padre=0 ORDER BY peso\");\n							$ConteoOpciones=1;\n							while($registro = $resultado->fetch())\n								{\n									echo \'<div style=\"display:inline !important;\" id=\"MENU_FORMULARIO_OPCION_\'.$ConteoOpciones.\'\">\';\n									PCO_ImprimirOpcionMenu($registro,\'formulario\');\n									echo \'</div>\';\n									$ConteoOpciones++;\n								}\n				echo \'  </div>\n					</nav>\';\n			}\n\n		// Muestra ayuda en caso de tenerla\n		$imagen_ayuda=\'fa fa-info-circle fa-5x texto-azul\';\n		if ($registro_formulario[\"ayuda_titulo\"]!=\"\" || $registro_formulario[\"ayuda_texto\"]!=\"\")\n			PCO_Mensaje(PCO_ReemplazarVariablesPHPEnCadena($registro_formulario[\"ayuda_titulo\"]),PCO_ReemplazarVariablesPHPEnCadena($registro_formulario[\"ayuda_texto\"]),\'100%\',$imagen_ayuda,\'alert alert-info alert-dismissible\');\n\n		//Inicia el formulario de datos\n		echo \'<div id=\"PCO_MarcoImpresion\'.$formulario.\'\">\';\n		//Si se quiere anular el formulario y su accion cuando se trata de un sub-formulario de consulta\n		if (!$anular_form)\n			echo\'<form id=\"\'.$registro_formulario[\"id_html\"].\'\" name=\"\'.$registro_formulario[\"id_html\"].\'\" action=\"\'.$ArchivoCORE.\'\" method=\"POST\" enctype=\"multipart/form-data\" style=\"display:inline; height: 0px; border-width: 0px; width: 0px; padding: 0; margin: 0;\">\n				<input type=\"Hidden\" name=\"formulario\" value=\"\'.$formulario.\'\">\n				<input type=\"Hidden\" name=\"id_registro_datos\" value=\"\'.@$registro_datos_formulario[\"id\"].\'\">\n				<input type=\"Hidden\" name=\"PCO_FormularioActivo\" value=\"\'.$formulario.\'\">\n				<input type=\"Hidden\" name=\"PCO_Accion\" value=\"PCO_GuardarDatosFormulario\">\n				<input type=\"Hidden\" name=\"PCO_ErrorIcono\" value=\"\'.@$PCO_ErrorIcono.\'\">\n				<input type=\"Hidden\" name=\"PCO_ErrorEstilo\" value=\"\'.@$PCO_ErrorEstilo.\'\">\n				<input type=\"Hidden\" name=\"PCO_ErrorTitulo\" value=\"\'.@PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorTitulo).\'\">\n				<input type=\"Hidden\" name=\"PCO_ErrorDescripcion\" value=\"\'.@PCO_ReemplazarVariablesPHPEnCadena($PCO_ErrorDescripcion).\'\">\n				<input type=\"Hidden\" name=\"Presentar_FullScreen\" value=\"\'.@$Presentar_FullScreen.\'\">\n				<input type=\"Hidden\" name=\"Precarga_EstilosBS\" value=\"\'.@$Precarga_EstilosBS.\'\">\n				<input type=\"Hidden\" name=\"PCO_Objeto\" value=\"\">  <!--Requerido si se va a transferir el control a un objeto FRM o INF-->\n				<input type=\"Hidden\" name=\"objeto\" value=\"\">	  <!--COMPATIBILIDAD: Requerido si se va a transferir el control a un objeto FRM o INF-->\n				\';\n\n		// Inicio de la generacion de encabezados pestanas\n		//Cuenta las pestanas segun los objetos del form y ademas mira si es solo una con valor vacio (sin pestanas)\n		$consulta_conteo_pestanas=	  PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND visible=1 GROUP BY pestana_objeto ORDER BY pestana_objeto\",\"$formulario\");\n		$conteo_pestanas=0;\n		$conteo_pestanas_ocultas=0;\n		while($registro_conteo_pestanas = @$consulta_conteo_pestanas->fetch())\n			{\n				$titulo_pestana_formulario=$registro_conteo_pestanas[\"pestana_objeto\"];\n				if ($titulo_pestana_formulario!=\"PCO_NoVisible\" || (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $formulario>=0)  ||  (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $formulario<0 && $modo_diseno_formulario==1)   )\n					{\n						$conteo_pestanas++;\n						$ultimo_nombre_pestanas=$registro_conteo_pestanas[\"pestana_objeto\"];\n					}\n				//Lleva el conteo de las ocultas en caso que las deba crear aunque solo exista una visible pero se requieran los tab-pane para separar la oculta\n				if ($titulo_pestana_formulario==\"PCO_NoVisible\")\n					$conteo_pestanas_ocultas=1;\n			}\n		//Presenta barra de navegacion de pestanas si se encuentra al menos una\n		if ($conteo_pestanas>0 && ($ultimo_nombre_pestanas!=\"\"))\n			{\n				//Determina el estilo de las pestanas\n				$CadenaEstiloPestanas=\"\"; //Estilo por defecto para aplicar a las pestanas\n				if($registro_formulario[\"estilo_pestanas\"]==\"\")\n					$CadenaEstiloPestanas=\"visibility:hidden; height:0px;\"; //Oculta las pestanas\n\n				$consulta_formulario_pestana=   PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND visible=1 GROUP BY pestana_objeto ORDER BY pestana_objeto\",\"$formulario\");\n				echo \'<ul class=\"nav \'.$registro_formulario[\"estilo_pestanas\"].\' nav-justified oculto_impresion\" style=\"\'.$CadenaEstiloPestanas.\'\">\';\n				$estado_activa_primera_pestana=\' class=\"active\" \';\n				$pestana_activa=1;\n				while($registro_formulario_pestana = @$consulta_formulario_pestana->fetch())\n					{\n						$titulo_pestana_formulario=PCO_ReemplazarVariablesPHPEnCadena($registro_formulario_pestana[\"pestana_objeto\"]);\n						if ($titulo_pestana_formulario==\"\") $titulo_pestana_formulario=\"<i class=\'fa fa-stack-overflow\'></i>\";\n						//Presenta la pestana solamente si no es una oculta\n						if ($titulo_pestana_formulario!=\"PCO_NoVisible\" || (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $formulario>=0)   ||  (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $formulario<0 && $modo_diseno_formulario==1)   )\n							echo \'<li \'.$estado_activa_primera_pestana.\'  ><a  href=\"#PCO_Pestana\'.$ComplementoPestanas.\'Formulario_\'.$pestana_activa.\'\" data-toggle=\"tab\" id=\"PCO_LinkPestanaFormulario_\'.$pestana_activa.\'\">\'.$titulo_pestana_formulario.\'</a></li>\';\n						//Limpia para las siguientes pestanas\n						$estado_activa_primera_pestana=\'\';\n						$pestana_activa++;\n					}\n				echo \'</ul>\';\n			}\n		// Fin de la generacion de encabezados pestanas\n\n		//Genera las pestanas con su contenido\n		$UltimaClaseColumna=\"\";\n		if ($conteo_pestanas>0)\n			{\n				$consulta_formulario_pestana=   PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND visible=1 GROUP BY pestana_objeto ORDER BY pestana_objeto\",\"$formulario\");\n				$estado_activa_primera_pestana=\'in active\';\n				$pestana_activa=1;\n\n				//Inicio de los tab-content\n				echo \'<div class=\"tab-content\" >\';\n				while($registro_formulario_pestana = @$consulta_formulario_pestana->fetch())\n					{\n						//Si la pestana es PCO_NoVisible entonces agrega la clase de oculta en impresion\n						$ComplementoClaseOcultaImpresion=\"\";\n						if ($registro_formulario_pestana[\"pestana_objeto\"]==\"PCO_NoVisible\") $ComplementoClaseOcultaImpresion=\"oculto_impresion\";\n\n						$titulo_pestana_formulario=$registro_formulario_pestana[\"pestana_objeto\"];\n						//Genera el contenedor de la pestana.  Se considera necesario crear contenedores solo cuando hay mas de una pestana, si hay una solamente entonces no hay que crear el contenedor\n						if ($conteo_pestanas>1 || $conteo_pestanas_ocultas==1)\n						echo \'\n						<!-- INICIO de las pestanas No \'.$pestana_activa.\' -->\n							<div class=\"tab-pane fade \'.$estado_activa_primera_pestana.\' \'.$ComplementoClaseOcultaImpresion.\' \" id=\"PCO_Pestana\'.$ComplementoPestanas.\'Formulario_\'.$pestana_activa.\'\" >\';\n\n								//Booleana que determina si se debe incluir el javascript de ckeditor\n								$existe_campo_textoformato=0;\n\n								//DIAGRAMACION DE LA TABLA CON ELEMENTOS DEL FORMULARIO\n								$limite_inferior=-9999; // Peso inferior a tener en cuenta en el query\n								$constante_limite_superior=+9999;\n								$limite_superior=$constante_limite_superior; // Peso superior a tener en cuenta en el query\n								//Busca todos los objetos marcados como fila_unica=1 y agrega un registro mas con el limite superior\n								$consulta_obj_fila_unica=PCO_EjecutarSQL(\"SELECT id,peso,visible FROM \".$TablasCore.\"formulario_objeto WHERE pestana_objeto=? AND formulario=? AND fila_unica=\'1\' AND visible=1 UNION SELECT 0,$limite_superior,0 ORDER BY peso\",\"$titulo_pestana_formulario$_SeparadorCampos_$formulario\");\n								//Define si debe o no dibujar borde de las celdas\n								$estilo_bordes=\"table-unbordered\";\n								$ancho_bordes=\"border-width: 0px;\";\n								if ($registro_formulario[\"borde_visible\"]==1)\n									{\n										$estilo_bordes=\"table-bordered\";\n										$ancho_bordes=\"border-width: 1px;\";\n									}\n\n								$TabIndex_Elemento=1;\n								while ($registro_obj_fila_unica = $consulta_obj_fila_unica->fetch())\n									{\n										$limite_superior=$registro_obj_fila_unica[\"peso\"];\n										$ultimo_id=$registro_obj_fila_unica[\"id\"];\n\n										//Define tipo_maquetacion\n										if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n											{\n												echo \'<div class=\"row\">\';\n											}\n										//Define tipo_maquetacion\n										if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n											{\n												// Inicia la tabla con los campos\n												echo \'\n													<div class=\"table-responsive\" style=\"border-width: 0px; margin-top:0; margin-bottom:0; margin-left:0; margin-right:0; \">\n													<table class=\"table table-responsive \'.$estilo_bordes.\' table-condensed btn-xs\" style=\"\'.$ancho_bordes.\' margin-top:0; margin-bottom:0; margin-left:0; margin-right:0; padding: 0px; border-spacing: 0px; \"><tr>\';\n											}\n\n										//Recorre todas las comunas definidas para el formulario buscando objetos\n										for ($cl=1;$cl<=$registro_formulario[\"columnas\"];$cl++)\n											{\n												//Busca los elementos de la coumna actual del formulario con peso menor o igual al peso del objeto fila_unica de la fila unica_actual pero que no son fila_unica\n												$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE pestana_objeto=? AND formulario=? AND columna=? AND visible=1 AND peso >? AND peso <=? ORDER BY peso\",\"$titulo_pestana_formulario$_SeparadorCampos_$formulario$_SeparadorCampos_$cl$_SeparadorCampos_$limite_inferior$_SeparadorCampos_$limite_superior\");\n\n													//Define tipo_maquetacion JJJ\n													if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n														{\n															//Busca la clase asociada a la columna. Si no hay utiliza la ultima clase definida\n															$ArregloClasesColumnas=explode(\"|\",$registro_formulario[\"css_columnas\"]);\n															$ClaseColumna=$ArregloClasesColumnas[$cl-1];\n															if ($ClaseColumna!=\"\") $UltimaClaseColumna=$ClaseColumna;\n															else $ClaseColumna=$UltimaClaseColumna;\n															//echo $ClaseColumna;\n															echo \'<div class=\"\'.$ClaseColumna.\'\">\'; //col col-xs-3 col-sm-3 col-md-3 col-lg-3\n														}\n													//Define tipo_maquetacion\n													if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n														{\n															//Inicia columna de formulario\n															$PCO_AnchoColumnas=round(100 / $registro_formulario[\"columnas\"]);\n															echo \'<td width=\"\'.$PCO_AnchoColumnas.\'%\" >\';\n														}\n\n													// Crea los campos definidos por cada columna de formulario\n													while ($registro_campos = $consulta_campos->fetch())\n														{\n															//Determina si el estilo del objeto debe ser inline o no\n															$cadena_modo_inline=\'\';\n															if ($registro_campos[\"modo_inline\"])\n																$cadena_modo_inline=\'display:inline;\';\n															echo \'<div style=\"\'.$cadena_modo_inline.\'\">\';\n\n															//Imprime el campo solamente si no es fila unica, si es fila_unica guarda en una variable para uso posterior\n															if($registro_campos[\"fila_unica\"]==\"0\")\n																{\n																	//Si esta en modo de diseno el formulario agrega elementos extra para la edicion de cada control\n																	$ComplementoDisenoElemento=\'\';\n																	$ComplementoDisenoMarcoOpciones=\'\';\n																	if ($modo_diseno_formulario)\n																		{\n																			$ComplementoDisenoElemento=PCO_AgregarFuncionesEdicionObjeto($registro_campos,$registro_formulario,\"ComplementoDisenoElemento\");\n																			$ComplementoDisenoMarcoOpciones=PCO_AgregarFuncionesEdicionObjeto($registro_campos,$registro_formulario,\"ComplementoDisenoMarcoOpciones\");\n																		}\n																	//Define el estilo del contenedor para el objeto\n																	$ClaseCSSContenedor=\"\";\n																	if ($registro_campos[\"clase_contenedor\"]!=\"\") $ClaseCSSContenedor=$registro_campos[\"clase_contenedor\"];\n																	echo \'<div \'.$ComplementoDisenoElemento.\' id=\"PCOContenedor_\'.$registro_campos[\"id_html\"].\'\" class=\"\'.$ClaseCSSContenedor.\'\" > \'.$ComplementoDisenoMarcoOpciones;\n																	echo \'<div id=\"PCOPre_\'.$registro_campos[\"id_html\"].\'\"></div>\';\n																	\n																	//Agrega etiqueta para colapsar el control si aplica\n																	if ($registro_campos[\"etiqueta_colapsable\"]!=\"\") \n																		echo \'<details><summary>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"etiqueta_colapsable\"]).\'</summary>\';\n																	\n																	// Formatea cada campo de acuerdo a su tipo\n																	// CUIDADO!!! Modificando las lineas de tipo siguientes debe modificar las lineas de tipo un poco mas abajo tambien\n																	$tipo_de_objeto=@$registro_campos[\"tipo\"];\n																	switch ($tipo_de_objeto) {\n\n																		case \'texto_corto\': $objeto_formateado = @PCO_CargarObjetoTextoCorto($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n																		case \'texto_clave\': $objeto_formateado = @PCO_CargarObjetoTextoCorto($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n																		case \'texto_largo\': $objeto_formateado = @PCO_CargarObjetoTextoLargo($registro_campos,@$registro_datos_formulario); break;\n																		case \'texto_formato\': { $objeto_formateado = @PCO_CargarObjetoTextoFormato($registro_campos,@$registro_datos_formulario,$existe_campo_textoformato); $existe_campo_textoformato=1; } break;\n																		case \'area_responsive\': $objeto_formateado = @PCO_CargarObjetoAreaResponsive($registro_campos,@$registro_datos_formulario); break;\n																		case \'lista_seleccion\': $objeto_formateado = @PCO_CargarObjetoListaSeleccion($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n																		case \'lista_radio\': $objeto_formateado = @PCO_CargarObjetoListaRadio($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n																		case \'casilla_check\': $objeto_formateado = @PCO_CargarObjetoCasillaCheck($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n																		case \'etiqueta\': $objeto_formateado = @PCO_CargarObjetoEtiqueta($registro_campos,@$registro_datos_formulario); break;\n																		case \'url_iframe\': $objeto_formateado = @PCO_CargarObjetoIFrame($registro_campos,@$registro_datos_formulario); break;\n																		case \'informe\': $informe_formateado=@PCO_CargarInforme($registro_campos[\"informe_vinculado\"],$registro_campos[\"objeto_en_ventana\"],\"htm\",\"Informes\",1,$registro_campos[\"anular_acciones\"],$registro_campos[\"anular_piepagina\"],$registro_campos[\"anular_encabezado\"]); break;\n																		case \'deslizador\': $objeto_formateado = @PCO_CargarObjetoDeslizador($registro_campos,@$registro_datos_formulario); break;\n																		case \'campo_etiqueta\': $objeto_formateado = @PCO_CargarObjetoCampoEtiqueta($registro_campos,@$registro_datos_formulario); break;\n																		case \'archivo_adjunto\': $objeto_formateado = @PCO_CargarObjetoArchivoAdjunto($registro_campos,@$registro_datos_formulario); break;\n																		case \'objeto_canvas\': $objeto_formateado = @PCO_CargarObjetoCanvas($registro_campos,@$registro_datos_formulario,$formulario); break;\n																		case \'objeto_camara\': $objeto_formateado = @PCO_CargarObjetoCamara($registro_campos,@$registro_datos_formulario,$formulario); break;\n																		case \'boton_comando\': $objeto_formateado = @PCO_CargarObjetoBotonComando($registro_campos,@$registro_datos_formulario,@$registro_formulario);\n																	}\n\n																	//Carga SubFormulario solo si no es el mismo actual para evitar ciclos infinitos\n\n																	//Ademas si es subformulario debe consultar en ese registro de ID buscado del form\n																	//padre el valor del campo foraneo del form hijo para llamar a buscar form con\n																	//el valor de Id correspondiente. Ademas valida si el form existe\n																	if ($tipo_de_objeto==\"form_consulta\" && $registro_campos[\"formulario_vinculado\"]!=$formulario && PCO_ExisteValor($TablasCore.\"formulario\",\"id\",$registro_campos[\"formulario_vinculado\"]))\n																		{\n																			//Busca la tabla principal del subformulario anidado\n																			$PCO_ValorCampoBind=$registro_campos[\"formulario_vinculado\"];\n																			if($PCO_ValorCampoBind==\"\") $PCO_ValorCampoBind=\"\";\n																			$consulta_tabla_subform=PCO_EjecutarSQL(\"SELECT tabla_datos FROM \".$TablasCore.\"formulario WHERE id=? \",\"$PCO_ValorCampoBind\")->fetch();\n																			$PCO_TablaSubform=$consulta_tabla_subform[\"tabla_datos\"];\n\n																			//Determina el valor del campo a vincular en el registro padre (el actual).  Deberia dar el id que se va a buscar\n																			$PCO_ValorCampoPadre=@$registro_datos_formulario[$registro_campos[\"formulario_campo_vinculo\"]];\n																			//Si no se encuentra el dato o registro entonces mira si vienen desde un boton de busqueda y usa su valor\n																			if($PCO_ValorCampoPadre==\"\" && $PCO_ValorBusquedaBD!=\"\")\n																				{\n																					//$PCO_ValorCampoPadre=$PCO_ValorBusquedaBD;\n																				}\n																			//Si no obtiene ningun valor entonces lo pone en cero para evitar error de sintaxis en Bind de SQL\n																			if($PCO_ValorCampoPadre==\"\") $PCO_ValorCampoPadre=0;\n																			$PCO_CampoForaneoSubform=$registro_campos[\"formulario_campo_foraneo\"];\n																			//Busca el ID de registro correspondiente en la tabla de datos para llamar con el valor coincidente\n																			$consulta_registro_subform=PCO_EjecutarSQL(\"SELECT $PCO_CampoForaneoSubform FROM $PCO_TablaSubform WHERE $PCO_CampoForaneoSubform=? \",\"$PCO_ValorCampoPadre\")->fetch();\n\n																			$formulario_formateado=@PCO_CargarFormulario($registro_campos[\"formulario_vinculado\"],$registro_campos[\"objeto_en_ventana\"],$registro_campos[\"formulario_campo_foraneo\"],$PCO_ValorCampoPadre,1,0,\"Sub\");\n																		}\n																	else\n																		{\n																			//Presenta mensaje de error al no poder empotrar subformulario\n																			if($tipo_de_objeto==\"form_consulta\")\n																				PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$MULTILANG_ObjetoNoExiste.\'.  FormID: \'.$registro_campos[\"formulario_vinculado\"], \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n																		}\n\n																	//Imprime el objeto siempre y cuando no sea uno preformateado por practico (informes, formularios, etc)\n																	if ($registro_campos[\"tipo\"]!=\"informe\" && $registro_campos[\"tipo\"]!=\"form_consulta\")\n																		echo $objeto_formateado;\n\n																	//Cierra la etiqueta colapsable en caso de haber abierto una\n																	if ($registro_campos[\"etiqueta_colapsable\"]!=\"\") \n																		echo \'</details>\';\n																		\n																	echo \'<div id=\"PCOPos_\'.$registro_campos[\"id_html\"].\'\"></div>\';\n																	echo \'</div>\'; //Marco PCOContenedor\n																}\n\n															//Cierra el marco para el estilo inline del objeto\n															echo \'</div>\';\n														}\n\n													//Define tipo_maquetacion\n													if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n														{\n															echo \'</div>\'; //Fin class=col\n														}\n													//Define tipo_maquetacion\n													if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n														{\n															echo \'</td>\'; //Fin columna de formulario\n														}\n											}\n\n										//Define tipo_maquetacion\n										if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n											{\n												echo \'</div>\'; //Fin class=row\n											}\n										//Define tipo_maquetacion\n										if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n											{\n												// Finaliza la tabla con los campos\n												echo \'</tr></table>\n													</div>\';\n											}\n\n										//Busca datos del registro de fila_unica\n										$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND id=? \",\"$formulario$_SeparadorCampos_$ultimo_id\");\n										$registro_campos = $consulta_campos->fetch();\n\n										//Agrega el campo de fila unica cuando no se trata del agregado de peso 9999\n										if ($registro_campos[\"visible\"]==\"1\")\n											{\n												//echo \'&nbsp;&nbsp;\'.$registro_campos[\"titulo\"];\n												// Formatea cada campo de acuerdo a su tipo\n												// CUIDADO!!! Modificando las lineas de tipo siguientes debe modificar las lineas de tipo un poco mas arriba tambien\n												//Si esta en modo de diseno el formulario agrega elementos extra para la edicion de cada control\n												$ComplementoDisenoElemento=\'\';\n												$ComplementoDisenoMarcoOpciones=\'\';\n												if ($modo_diseno_formulario)\n													{\n														$ComplementoDisenoElemento=PCO_AgregarFuncionesEdicionObjeto($registro_campos,$registro_formulario,\"ComplementoDisenoElemento\");\n														$ComplementoDisenoMarcoOpciones=PCO_AgregarFuncionesEdicionObjeto($registro_campos,$registro_formulario,\"ComplementoDisenoMarcoOpciones\");\n													}\n\n												//Define el estilo del contenedor para el objeto\n												$ClaseCSSContenedor=\"\";\n												if ($registro_campos[\"clase_contenedor\"]!=\"\") $ClaseCSSContenedor=$registro_campos[\"clase_contenedor\"];\n\n												echo \'<div \'.$ComplementoDisenoElemento.\' id=\"PCOContenedor_\'.$registro_campos[\"id_html\"].\'\" class=\"\'.$ClaseCSSContenedor.\'\" style=\"margin-top:0px; margin-bottom:0px; margin-left:0; margin-right:0;  padding: 0px; spacing: 0px;\">\'.$ComplementoDisenoMarcoOpciones.\'\';\n												echo \'<div id=\"PCOPre_\'.$registro_campos[\"id_html\"].\'\"></div>\';\n\n												//Agrega etiqueta para colapsar el control si aplica\n												if ($registro_campos[\"etiqueta_colapsable\"]!=\"\") \n													echo \'<details><summary>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_campos[\"etiqueta_colapsable\"]).\'</summary>\';\n													\n												//Define tipo_maquetacion\n												if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n													{\n														echo \'<div class=\"row\"><div class=\"col col-xs-12 col-sm-12 col-md-12 col-lg-12\">\';\n													}\n												//Define tipo_maquetacion\n												if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n													{\n														echo \'<table class=\"table table-condensed btn-xs \'.$estilo_bordes.\'\" style=\"\'.$ancho_bordes.\' margin-top:0; margin-bottom:0; margin-left:0; margin-right:0;  padding: 0px; border-spacing: 0px; width:100%; \"><tr><td>\';\n													}\n\n\n												$tipo_de_objeto=@$registro_campos[\"tipo\"];\n												switch ($tipo_de_objeto) {\n\n													case \'texto_corto\': $objeto_formateado = PCO_CargarObjetoTextoCorto($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n													case \'texto_clave\': $objeto_formateado = PCO_CargarObjetoTextoCorto($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n													case \'texto_largo\': $objeto_formateado = PCO_CargarObjetoTextoLargo($registro_campos,@$registro_datos_formulario); break;\n													case \'texto_formato\': { $objeto_formateado = PCO_CargarObjetoTextoFormato($registro_campos,@$registro_datos_formulario,$existe_campo_textoformato); $existe_campo_textoformato=1; } break;\n													case \'area_responsive\': $objeto_formateado = @PCO_CargarObjetoAreaResponsive($registro_campos,@$registro_datos_formulario); break;\n													case \'lista_seleccion\': $objeto_formateado = PCO_CargarObjetoListaSeleccion($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n													case \'lista_radio\': $objeto_formateado = PCO_CargarObjetoListaRadio($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n													case \'casilla_check\': $objeto_formateado = @PCO_CargarObjetoCasillaCheck($registro_campos,@$registro_datos_formulario,$formulario,$en_ventana); break;\n													case \'etiqueta\': $objeto_formateado = PCO_CargarObjetoEtiqueta($registro_campos,@$registro_datos_formulario); break;\n													case \'url_iframe\': $objeto_formateado = PCO_CargarObjetoIFrame($registro_campos,@$registro_datos_formulario); break;\n													case \'informe\': $informe_formateado=@PCO_CargarInforme($registro_campos[\"informe_vinculado\"],$registro_campos[\"objeto_en_ventana\"],\"htm\",\"Informes\",1,$registro_campos[\"anular_acciones\"],$registro_campos[\"anular_piepagina\"],$registro_campos[\"anular_encabezado\"]); break;\n													case \'deslizador\': $objeto_formateado = @PCO_CargarObjetoDeslizador($registro_campos,@$registro_datos_formulario); break;\n													case \'campo_etiqueta\': $objeto_formateado = @PCO_CargarObjetoCampoEtiqueta($registro_campos,@$registro_datos_formulario); break;\n													case \'archivo_adjunto\': $objeto_formateado = @PCO_CargarObjetoArchivoAdjunto($registro_campos,@$registro_datos_formulario); break;\n													case \'objeto_canvas\': $objeto_formateado = @PCO_CargarObjetoCanvas($registro_campos,@$registro_datos_formulario,$formulario); break;\n													case \'objeto_camara\': $objeto_formateado = @PCO_CargarObjetoCamara($registro_campos,@$registro_datos_formulario,$formulario); break;\n													case \'boton_comando\': $objeto_formateado = @PCO_CargarObjetoBotonComando($registro_campos,@$registro_datos_formulario,@$registro_formulario);\n												}\n\n												//Carga SubFormulario solo si no es el mismo actual para evitar ciclos infinitos\n												//Ademas si es subformulario debe consultar en ese registro de ID buscado del form\n												//padre el valor del campo foraneo del form hijo para llamar a buscar form con\n												//el valor de Id correspondiente. Ademas valida si el form existe\n												if ($tipo_de_objeto==\"form_consulta\" && $registro_campos[\"formulario_vinculado\"]!=$formulario && PCO_ExisteValor($TablasCore.\"formulario\",\"id\",$registro_campos[\"formulario_vinculado\"]))\n													{\n														//Busca la tabla principal del subformulario anidado\n														$PCO_ValorCampoBind=$registro_campos[\"formulario_vinculado\"];\n														if($PCO_ValorCampoBind==\"\") $PCO_ValorCampoBind=\"\";\n														$consulta_tabla_subform=PCO_EjecutarSQL(\"SELECT tabla_datos FROM \".$TablasCore.\"formulario WHERE id=? \",\"$PCO_ValorCampoBind\")->fetch();\n														$PCO_TablaSubform=$consulta_tabla_subform[\"tabla_datos\"];\n\n														//Determina el valor del campo a vincular en el registro padre (el actual).  Deberia dar el id que se va a buscar\n														$PCO_ValorCampoPadre=@$registro_datos_formulario[$registro_campos[\"formulario_campo_vinculo\"]];\n														//Si no se encuentra el dato o registro entonces mira si vienen desde un boton de busqueda y usa su valor\n														if($PCO_ValorCampoPadre==\"\" && $PCO_ValorBusquedaBD!=\"\")\n															{\n																//$PCO_ValorCampoPadre=$PCO_ValorBusquedaBD;\n															}\n														//Si no obtiene ningun valor entonces lo pone en cero para evitar error de sintaxis en Bind de SQL\n														if($PCO_ValorCampoPadre==\"\") $PCO_ValorCampoPadre=0;\n														$PCO_CampoForaneoSubform=$registro_campos[\"formulario_campo_foraneo\"];\n														//Busca el ID de registro correspondiente en la tabla de datos para llamar con el valor coincidente\n														$consulta_registro_subform=PCO_EjecutarSQL(\"SELECT $PCO_CampoForaneoSubform FROM $PCO_TablaSubform WHERE $PCO_CampoForaneoSubform=? \",\"$PCO_ValorCampoPadre\")->fetch();\n\n														$formulario_formateado=@PCO_CargarFormulario($registro_campos[\"formulario_vinculado\"],$registro_campos[\"objeto_en_ventana\"],$registro_campos[\"formulario_campo_foraneo\"],$PCO_ValorCampoPadre,1,0,\"Sub\");\n													}\n												else\n													{\n														//Presenta mensaje de error al no poder empotrar subformulario\n														if($tipo_de_objeto==\"form_consulta\")\n															PCO_Mensaje($MULTILANG_ErrorTiempoEjecucion,$MULTILANG_ObjetoNoExiste.\'.  FormID: \'.$registro_campos[\"formulario_vinculado\"], \'\', \'fa fa-times fa-5x icon-red texto-blink\', \'alert alert-danger alert-dismissible\');\n													}\n\n												//Imprime el objeto siempre y cuando no sea uno preformateado por practico (informes, formularios, etc)\n												if ($registro_campos[\"tipo\"]!=\"informe\" && $registro_campos[\"tipo\"]!=\"form_consulta\")\n													echo $objeto_formateado;\n\n												//Define tipo_maquetacion\n												if($registro_formulario[\"tipo_maquetacion\"]==\"responsive\")\n													{\n														echo \'</div></div>\'; //Fin class=row y class=col\n													}\n												//Define tipo_maquetacion\n												if($registro_formulario[\"tipo_maquetacion\"]==\"tradicional\")\n													{\n														echo \'</td></tr></table>\';\n													}\n\n												//Cierra la etiqueta colapsable en caso de haber abierto una\n												if ($registro_campos[\"etiqueta_colapsable\"]!=\"\") \n													echo \'</details>\';\n\n												echo \'<div id=\"PCOPos_\'.$registro_campos[\"id_html\"].\'\"></div>\';\n												echo \'</div>\'; //Marco PCOContenedor\n											}\n\n										//Actualiza limite inferior para siguiente lista de campos\n										$limite_inferior=$registro_obj_fila_unica[\"peso\"];\n										$TabIndex_Elemento++;\n									}\n\n						if ($conteo_pestanas>1  || $conteo_pestanas_ocultas==1)\n						echo \'\n							</div>\n						<!-- FIN de las pestanas No \'.$pestana_activa.\'-->\';\n\n						//Limpia para las siguientes pestanas\n						$estado_activa_primera_pestana=\'\';\n						$pestana_activa++;\n					}\n				//Fin de los tab-content\n				echo \'</div>\';\n			} //Fin Si conteo pestanas > 0\n\n		echo \'</div> <!-- cierra PCO_MarcoImpresion\'.$formulario.\' -->\';\n\n	//Busca los campos definidos como visilbe=0 (o NO) para agregarlos como hidden\n	$consulta_ocultos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND visible=0 \",\"$formulario\");\n	while ($registro_ocultos = $consulta_ocultos->fetch())\n		{\n			// Formatea cada campo de acuerdo a su tipo\n			$objeto_formateado = @PCO_CargarObjetoOculto($registro_ocultos,$registro_datos_formulario,$formulario,$en_ventana);\n			//Imprime el objeto siempre y cuando no sea uno preformateado por practico (informes, formularios, etc)\n			if ($registro_campos[\"tipo\"]!=\"informe\" && $registro_campos[\"tipo\"]!=\"form_consulta\" && $registro_campos[\"tipo\"]!=\"boton_comando\")\n				echo $objeto_formateado;\n		}\n\n	// Si tiene botones agrega barra de estado y los ubica\n	$consulta_botones = PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_boton.\" FROM \".$TablasCore.\"formulario_boton WHERE formulario=? AND visible=1 ORDER BY peso\",\"$formulario\");\n\n	if($consulta_botones->rowCount()>0 || $PCO_InformeFiltro!=\"\") //Crea la barra incluso si no hay botones en diseno pero se encuentra que el llamado es desde un informe que requiere filtro\n		{\n			PCO_AbrirBarraEstado();\n			echo \'<div align=\"center\">\';\n			while ($registro_botones = $consulta_botones->fetch())\n				{\n					//Transfiere variables de mensajes de retorno asociadas al boton\n					$comando_javascript=\"\";\n					if ($registro_botones[\"retorno_titulo\"]!=\"\")\n						$comando_javascript=\"document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorTitulo.value=\'\".$registro_botones[\"retorno_titulo\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorDescripcion.value=\'\".$registro_botones[\"retorno_texto\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorIcono.value=\'\".$registro_botones[\"retorno_icono\"].\"\'; document.\".$registro_formulario[\"id_html\"].\".PCO_ErrorEstilo.value=\'\".$registro_botones[\"retorno_estilo\"].\"\';\";\n\n					//Define el tipo de boton de acuerdo al tipo de accion\n		  switch ($registro_botones[\"tipo_accion\"]) {\n\n				case \'interna_guardar\':	$comando_javascript.=\"PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\');\";	 break;\n				case \'interna_limpiar\':	$comando_javascript.=\"document.getElementById(\'\".$registro_formulario[\"id_html\"].\"\').reset();\"; break;\n				case \'interna_escritorio\': $comando_javascript.=\"document.PCO_FormVerMenu.submit();\"; break;\n				case \'interna_actualizar\': $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_ActualizarDatosFormulario\'; PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\');\"; break;\n				case \'externa_postcode\':   $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_EjecutarPostAccionForm\'; PCOJS_ValidarCamposYProcesarFormulario(\'\".$registro_formulario[\"id_html\"].\"\'); \"; break;\n				case \'interna_eliminar\':   $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_EliminarDatosFormulario\';document.\".$registro_formulario[\"id_html\"].\".submit();\"; break;\n				case \'interna_cargar\':	 $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_CargarObjeto\';document.\".$registro_formulario[\"id_html\"].\".PCO_Objeto.value=\'\".$registro_botones[\"accion_usuario\"].\"\'; PCOJS_SanitizarValoresListaMultiple(); document.\".$registro_formulario[\"id_html\"].\".submit(); \"; break;\n				case \'externa_formulario\': $comando_javascript.=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'\".$registro_botones[\"accion_usuario\"].\"\';  PCOJS_SanitizarValoresListaMultiple(); document.\".$registro_formulario[\"id_html\"].\".submit(); \"; break;\n				case \'externa_javascript\': $comando_javascript.=$registro_botones[\"accion_usuario\"];\n		  }\n\n\n					//Verifica si el registro de botones presenta algun texto de confirmacion y lo antepone al script\n					$cadena_confirmacion_accion_pre=\"\";\n					$cadena_confirmacion_accion_pos=\"\";\n					if ($registro_botones[\"confirmacion_texto\"]!=\"\")\n						{\n							$cadena_confirmacion_accion_pre=\" if (confirm(\'\".PCO_ReemplazarVariablesPHPEnCadena($registro_botones[\"confirmacion_texto\"]).\"\')) {\";\n							$cadena_confirmacion_accion_pos=\" } else {} \";\n						}\n\n					//Genera la cadena del enlace\n					$cadena_javascript=\'href=\"javascript:  \'.$cadena_confirmacion_accion_pre.\'  \'.@$comando_javascript.\'  \'.$cadena_confirmacion_accion_pos.\'  \"\';\n\n					//Si no se especifica un estilo para el boton entonces se usa el predeterminado\n					$estilo_basico_boton=\"btn btn-default\";\n					//Si el boton tiene definido un ID lo agrega\n					$CadenaIDHtml=\'\';\n					if ($registro_botones[\"id_html\"]!=\"\") $CadenaIDHtml=\' id=\"\'.$registro_botones[\"id_html\"].\'\" \';\n					echo \'<a \'.$CadenaIDHtml.\' class=\"\'.$estilo_basico_boton.\' \'.$registro_botones[\"estilo\"].\'\" \'.@$cadena_javascript.\'>\'.PCO_ReemplazarVariablesPHPEnCadena($registro_botones[\"titulo\"]).\'</a>\';\n\n					echo \'&nbsp;&nbsp;\'; //Agrega espacio temporal entre controles\n				}\n\n			if ($PCO_InformeFiltro!=\"\")\n				{\n					//Si se encuentra que el form viene llamado desde un informe que lo requiere para filtro agrega un boton de retorno al informe automaticamente\n					$comando_javascript=\"document.\".$registro_formulario[\"id_html\"].\".PCO_Accion.value=\'PCO_CargarObjeto\';document.\".$registro_formulario[\"id_html\"].\".PCO_Objeto.value=\'inf:\".$PCO_InformeFiltro.\":1\';document.\".$registro_formulario[\"id_html\"].\".submit();\";\n					$cadena_javascript=\'href=\"javascript:\'.@$comando_javascript.\'\"\';\n					echo \'<a class=\"\'.$estilo_basico_boton.\' btn btn-warning\" \'.@$cadena_javascript.\'>\'.$MULTILANG_InfRetornoFormFiltrado.\'</a>\';\n				}\n\n			echo \'</div>\';\n			PCO_CerrarBarraEstado();\n		}\n\n\n	//Cierra todo el formulario\n	//Si se quiere anular el formulario y su accion cuando se trata de un sub-formulario de consulta\n	if (!$anular_form)\n		echo \'</form>\';\n\n	//Carga todos los eventos asociados a los controles de formulario\n	$eventos_controles_formulario=PCO_EjecutarSQL(\"SELECT \".$TablasCore.\"evento_objeto.*,\".$TablasCore.\"formulario_objeto.id_html FROM \".$TablasCore.\"evento_objeto,\".$TablasCore.\"formulario_objeto WHERE \".$TablasCore.\"evento_objeto.objeto=\".$TablasCore.\"formulario_objeto.id  AND \".$TablasCore.\"formulario_objeto.formulario=$formulario \");\n	while($registro_eventos_definidos = $eventos_controles_formulario->fetch())\n		{\n			//Limpia el metodo, asume no conocerlo\n\n			switch ($registro_eventos_definidos[\"evento\"]) {\n			  //1-Raton\n			  case \'onclick\': $MetodoJQuery=\"click\"; break;\n			  case \'ondblclick\': $MetodoJQuery=\"dblclick\"; break;\n			  case \'onmousedown\': $MetodoJQuery=\"mousedown\"; break;\n			  case \'onmouseenter\': $MetodoJQuery=\"mouseenter\"; break;\n			  case \'onmouseleave\': $MetodoJQuery=\"mouseleave\"; break;\n			  case \'onmousemove\': $MetodoJQuery=\"mousemove\"; break;\n			  case \'onmouseover\': $MetodoJQuery=\"mouseover\"; break;\n			  case \'onmouseout\': $MetodoJQuery=\"mouseout\"; break;\n			  case \'onmouseup\': $MetodoJQuery=\"mouseup\"; break;\n			  case \'contextmenu\': $MetodoJQuery=\"contextmenu\"; break;\n			  //2-Teclado\n			  case \'onkeydown\': $MetodoJQuery=\"keydown\"; break;\n			  case \'onkeypress\': $MetodoJQuery=\"keypress\"; break;\n			  case \'onkeyup\': $MetodoJQuery=\"keyup\"; break;\n			  //3-Formularios\n			  case \'onfocus\': $MetodoJQuery=\"focus\"; break;\n			  case \'onblur\': $MetodoJQuery=\"blur\"; break;\n			  case \'onchange\': $MetodoJQuery=\"change\"; break;\n			  case \'onselect\': $MetodoJQuery=\"select\"; break;\n			  case \'onsubmit\': $MetodoJQuery=\"submit\"; break;\n			  case \'oncut\': $MetodoJQuery=\"reset\"; break;\n			  case \'oncopy\': $MetodoJQuery=\"click\"; break;\n			  case \'onpaste\': $MetodoJQuery=\"click\"; break;\n			  default:\n				$MetodoJQuery=\"\";\n			}\n\n			//Imprime el script asociado al evento siempre y cuando la funcion sea reconocida\n			if ($MetodoJQuery!=\"\")\n				{\n					$PCO_FuncionesJSInternasFORM .= \'\n						<script language=\\\'JavaScript\\\'>\n							$( \"#\'.$registro_eventos_definidos[\"id_html\"].\'\" ).on(\"\'.$MetodoJQuery.\'\",function(PCOJS_Evento) {\n							  \'.PCO_ReemplazarVariablesPHPEnCadena($registro_eventos_definidos[\"javascript\"]).\'\n							});\n						</script>\';\n				}\n		}\n\n		//Carga las funciones JavaScript asociadas al formulario y llama la funcion FrmAutoRun()\n		$JavaScriptFormulario=PCO_ReemplazarVariablesPHPEnCadena($registro_formulario[\"javascript\"]);\n\n		//Minimiza el codigo JavaScript del formulario\n		//$JavaScriptFormulario=PCO_Minimizador_OptimizarJS($JavaScriptFormulario);\n\n		//Reemplaza la funcion de FrmAutoRun() del formulario por FrmAutoRun_IDFormulario() para garantizar que es unica\n		$NumeroIdFormulario=$registro_formulario[\"id\"];\n		if ($NumeroIdFormulario<0) $NumeroIdFormulario=\"LTZ\".($NumeroIdFormulario*-1);\n		$JavaScriptFormulario=str_replace(\"FrmAutoRun()\",\"FrmAutoRun_IDForm\".$NumeroIdFormulario.\"()\",$JavaScriptFormulario);\n			$PCO_FuncionesJSInternasFORM .= \'<script type=\"text/javascript\">\'.$JavaScriptFormulario.\'\n				if (typeof FrmAutoRun_IDForm\'.$NumeroIdFormulario.\' === \"function\") { FrmAutoRun_IDForm\'.$NumeroIdFormulario.\'(); }\n				</script>\';\n\n		//Busca la lista de campos marcados como obligatorios sobre el form\n		$consulta_campos_obligatorios=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_formulario_objeto.\" FROM \".$TablasCore.\"formulario_objeto WHERE formulario=? AND obligatorio=1\",\"$formulario\");\n		$ListaCamposObligatorios=\"\";\n		$ListaTitulosObligatorios=\"\";\n		while ($registro_campos_obligatorios=$consulta_campos_obligatorios->fetch())\n			{\n				$ListaCamposObligatorios.=\"|\".$registro_campos_obligatorios[\"id_html\"];\n				$ListaTitulosObligatorios.=\"|\".$registro_campos_obligatorios[\"titulo\"];\n			}\n		$POSTForm_ListaCamposObligatorios.=$ListaCamposObligatorios;\n		$POSTForm_ListaTitulosObligatorios.=$ListaTitulosObligatorios;\n\n		if ($en_ventana) PCO_CerrarVentana();\n  }\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_GenerarBotonesInforme\n	Genera el codigo HTML correspondiente a los botones definidos para cada registro de un informe indicado por su ID\n\n	Variables de entrada:\n\n		informe - ID unico del informe del cual se desea construir el query\n\n	Salida:\n\n		HTML con los botones\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_GenerarBotonesInforme($informe,$Ubicacion=0)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n\n		$ComplementoUbicacion=\' AND ubicar_principio=0 \';\n		if ($Ubicacion==1)\n			$ComplementoUbicacion=\' AND ubicar_principio=1 \';\n\n		//Inicializa la cadena de botones vacia\n		$cadena_generica_botones=\'\';\n\n		// Busca si el informe tiene acciones (botones), los cuenta y prepara dentro de un arreglo para repetir en cada registro\n		$consulta_botones=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_boton.\" FROM \".$TablasCore.\"informe_boton WHERE informe=? AND visible=1 $ComplementoUbicacion ORDER BY peso\",\"$informe\");\n		while($registro_botones=$consulta_botones->fetch())\n			{\n				$destino_formulario=$registro_botones[\"destino\"];\n				$pantalla_completa_formulario=$registro_botones[\"pantalla_completa\"];\n				$precargar_estilos_formulario=$registro_botones[\"precargar_estilos\"];\n				//Construye una cadena generica con todos los botones para ser reemplazada luego con valores\n				if ($registro_botones[\"tipo_accion\"]==\"interna_eliminar\")\n					{\n						$valores = explode(\".\",$registro_botones[\"accion_usuario\"]);\n						$tabla_vinculada=@$valores[0];\n						$campo_vinculado=@$valores[1];\n\n						//Si solo se indico el campo, sin la tabla, intenta usar solo el campo\n						if ($campo_vinculado==\"\" && $tabla_vinculada!=\"\")\n							{\n								$campo_vinculado=$valores[0];\n								$tabla_vinculada=\"\";\n							}\n\n						$comando_javascript=\"\n							document.FRMBASEINFORME.PCO_Accion.value=\'PCO_EliminarRegistroInforme\';\n							document.FRMBASEINFORME.tabla.value=\'\".@$tabla_vinculada.\"\';\n							document.FRMBASEINFORME.campo.value=\'\".@$campo_vinculado.\"\';\n							document.FRMBASEINFORME.valor.value=\'DELFRMVALVALOR\';\n							document.FRMBASEINFORME.Precarga_EstilosBS.value=\'\".@$precargar_estilos_formulario.\"\';\n							document.FRMBASEINFORME.Presentar_FullScreen.value=\'\".@$pantalla_completa_formulario.\"\';\n							document.FRMBASEINFORME.target = \'\".@$destino_formulario.\"\';\n							document.FRMBASEINFORME.submit();\";\n					}\n				if ($registro_botones[\"tipo_accion\"]==\"interna_cargar\")\n					{\n						$comando_javascript=\"\n							document.FRMBASEINFORME.PCO_Accion.value=\'PCO_CargarObjeto\';\n							document.FRMBASEINFORME.PCO_Objeto.value=\'frm:\".$registro_botones[\"accion_usuario\"].\":DETFRMVALBASE\';\n							document.FRMBASEINFORME.Precarga_EstilosBS.value=\'\".@$precargar_estilos_formulario.\"\';\n							document.FRMBASEINFORME.Presentar_FullScreen.value=\'\".@$pantalla_completa_formulario.\"\';\n							document.FRMBASEINFORME.target = \'\".@$destino_formulario.\"\';\n							document.FRMBASEINFORME.submit();\";\n					}\n				if ($registro_botones[\"tipo_accion\"]==\"interna_cargar_informe\")\n					{\n						$comando_javascript=\"\n							document.FRMBASEINFORME.PCO_Accion.value=\'PCO_CargarObjeto\';\n							document.FRMBASEINFORME.PCO_Objeto.value=\'inf:\".$registro_botones[\"accion_usuario\"].\":DETFRMVALBASE\';\n							document.FRMBASEINFORME.Precarga_EstilosBS.value=\'\".@$precargar_estilos_formulario.\"\';\n							document.FRMBASEINFORME.Presentar_FullScreen.value=\'\".@$pantalla_completa_formulario.\"\';\n							document.FRMBASEINFORME.target = \'\".@$destino_formulario.\"\';\n							document.FRMBASEINFORME.submit();\";\n					}\n				if ($registro_botones[\"tipo_accion\"]==\"externa_formulario\")\n					{\n						$comando_javascript=\"\n							document.FRMBASEINFORME.PCO_Tabla.value=\'\".@$tabla_vinculada.\"\';\n							document.FRMBASEINFORME.PCO_Campo.value=\'\".@$campo_vinculado.\"\';\n							document.FRMBASEINFORME.PCO_Valor.value=\'DELFRMVALVALOR\';\n							document.FRMBASEINFORME.PCO_Accion.value=\'\".$registro_botones[\"accion_usuario\"].\"\';\n							document.FRMBASEINFORME.Precarga_EstilosBS.value=\'\".@$precargar_estilos_formulario.\"\';\n							document.FRMBASEINFORME.Presentar_FullScreen.value=\'\".@$pantalla_completa_formulario.\"\';\n							document.FRMBASEINFORME.target = \'\".@$destino_formulario.\"\';\n							document.FRMBASEINFORME.submit();\";\n					}\n				if ($registro_botones[\"tipo_accion\"]==\"externa_javascript\")\n					{\n						$comando_javascript=\"\n							document.FRMBASEINFORME.PCO_Valor.value=\'DELFRMVALVALOR\';  \";\n						$comando_javascript.=$registro_botones[\"accion_usuario\"];\n					}\n\n				//Verifica si el registro de botones presenta algun texto de confirmacion y lo antepone al script\n				$cadena_confirmacion_accion_pre=\"\";\n				$cadena_confirmacion_accion_pos=\"\";\n				if ($registro_botones[\"confirmacion_texto\"]!=\"\")\n					{\n						$cadena_confirmacion_accion_pre=\" if (confirm(\'\".PCO_ReemplazarVariablesPHPEnCadena($registro_botones[\"confirmacion_texto\"]).\"\')) {\";\n						$cadena_confirmacion_accion_pos=\" } else {} \";\n					}\n\n				//Genera la cadena del enlace\n				$cadena_javascript=\'onclick=\"\'.$cadena_confirmacion_accion_pre.\'  \'.@$comando_javascript.\'  \'.$cadena_confirmacion_accion_pos.\' \"\';\n				//Determina si el boton llevara texto o si el texto se usa como ayuda.  Por defecto siempre se agrega el texto por defecto.\n				$Cadena_Imagen=\"\";\n				$Cadena_Ayuda=\"\";\n				$Cadena_BotonIzq=\"\";\n				$Cadena_BotonDer=\" \".$registro_botones[\"titulo\"];\n				//Determina si debe o no poner un elemento de imagen y si sera imagen con texto o sola\n				if ($registro_botones[\"imagen\"]!=\"\")\n					{\n						$Cadena_Imagen=\"<i class=\'fa \".$registro_botones[\"imagen\"].\"\'></i>\";\n						$Cadena_BotonIzq=\"\";\n						$Cadena_BotonDer=\"\";\n						$Cadena_Ayuda=\'data-toggle=\"tooltip\" data-html=\"true\" data-placement=\"auto\" title=\"\'.PCO_ReemplazarVariablesPHPEnCadena($registro_botones[\"titulo\"]).\'\"\';\n						//Busca si dentro de la imagen se especifico la palabra clave _TEXTOIZQ_ o _TEXTODER_ para agregar ademas el texto\n						if( strrpos ( $registro_botones[\"imagen\"], \"_TEXTOIZQ_\" )!==false || strrpos ( $registro_botones[\"imagen\"], \"_TEXTODER_\" )!==false )\n							{\n								$Cadena_Ayuda=\'\'; //En cualquier caso donde se pida imprimir texto se elimina el tooltip\n								$Cadena_Imagen=\"<i class=\'fa \".$registro_botones[\"imagen\"].\"\'></i>\";\n								//Si se detecta el texto a la izquierda ajusta las variables para tal impresion\n								if( strrpos ( $registro_botones[\"imagen\"], \"_TEXTOIZQ_\" )!==false)\n									$Cadena_BotonIzq=$registro_botones[\"titulo\"].\" \";\n								//Si se detecta el texto a la derecha ajusta las variables para tal impresion\n								if( strrpos ( $registro_botones[\"imagen\"], \"_TEXTODER_\" )!==false)\n									$Cadena_BotonDer=\" \".$registro_botones[\"titulo\"];\n							}\n					}\n				$Cadena_BotonIzq=PCO_ReemplazarVariablesPHPEnCadena($Cadena_BotonIzq);\n				$Cadena_BotonDer=PCO_ReemplazarVariablesPHPEnCadena($Cadena_BotonDer);\n				@$cadena_generica_botones.=\'<button type=\"button\" class=\"\'.$registro_botones[\"estilo\"].\'\" \'.$Cadena_Ayuda.\' \'.$cadena_javascript.\'>\'.$Cadena_BotonIzq.$Cadena_Imagen.$Cadena_BotonDer.\'</button>&nbsp;\';\n			}\n		return $cadena_generica_botones;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_DeterminarCamposOcultos\n	Devuelve la lista de campos establecidos como ocultos para un informe determinado\n\n	Variables de entrada:\n\n		informe - ID unico del informe del cual se desea conocer los campos ocultos\n\n	Salida:\n\n		Arreglo con la lista de campos ocultos\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_DeterminarCamposOcultos($informe)\n	{\n		global $TablasCore;\n		// Carga variables de definicion de tablas\n		global $ListaCamposSinID_informe_campos;\n\n		//Busca los CAMPOS definidos para el informe\n		$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_campos.\" FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso\",\"$informe\");\n\n		$PCO_ColumnasOcultas=array();\n		while ($registro_campos = $consulta_campos->fetch())\n			{\n				//Si tiene alias definido lo agrega\n				$posfijo_campo=\"\";\n				if ($registro_campos[\"valor_alias\"]!=\"\") $posfijo_campo=\" as \".$registro_campos[\"valor_alias\"];\n				//Agrega al arreglo con los campos marcados como ocultos\n				if ($registro_campos[\"visible\"]==0)\n					{\n						$PCO_ColumnasOcultas[]=$registro_campos[\"valor_campo\"].$posfijo_campo;\n						//Lleva el campo oculto despues del punto\n						$PCO_PartesCampo=explode(\".\",$registro_campos[\"valor_campo\"].$posfijo_campo);\n						@$PCO_ColumnasOcultas[]=$PCO_PartesCampo[1];\n						//Lleva el campo oculto si es un alias\n						$PCO_PartesCampo=explode(\" as \",$registro_campos[\"valor_campo\"].$posfijo_campo);\n						$PCO_ColumnasOcultas[]=$PCO_PartesCampo[1];\n					}\n			}\n		return $PCO_ColumnasOcultas;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_ConstruirConsultaInforme\n	Genera el codigo SQL correspondiente a informe especifico por ID, es la consulta cruda de los datos para ser aplicada posteriormente a otra operacion\n\n	Variables de entrada:\n\n		informe - ID unico del informe del cual se desea construir el query\n		evitar_campos_ocultos - Determina si los campos ocultos son agregados o no dentro del query.  Util cuando no se desean dentro de informes exportados.\n\n	Salida:\n\n		SQL con el query requerido por el informe\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_ConstruirConsultaInforme($informe,$evitar_campos_ocultos=0)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $PCOSESS_LoginUsuario,$Nombre_usuario,$Descripcion_usuario,$Nivel_usuario,$Correo_usuario,$LlaveDePasoUsuario,$PCO_FechaOperacion;\n		// Carga variables de definicion de tablas\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n\n		//Si se desea evitar los campos ocultos entonces los busca\n		if ($evitar_campos_ocultos==1)\n			$PCO_ColumnasOcultas=PCO_DeterminarCamposOcultos($informe);\n\n			// Inicia CONSTRUCCION DE CONSULTA DINAMICA\n			$numero_columnas=0;\n			//Busca los CAMPOS definidos para el informe\n			$consulta=\"SELECT \";\n			$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_campos.\" FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso,id\",\"$informe\");\n\n			while ($registro_campos = $consulta_campos->fetch())\n				{\n					//Si tiene alias definido lo agrega\n					$posfijo_campo=\"\";\n					if ($registro_campos[\"valor_alias\"]!=\"\") $posfijo_campo=\" as \".$registro_campos[\"valor_alias\"];\n\n					$OrigenValorCampo=$registro_campos[\"valor_campo\"];\n					//Evalua casos donde se tienen variables PHP escapadas por llaves.  Ej  \"%{$Variable}%\" si fuera para una operacion cualquiera sobre el campo.\n					$OrigenValorCampo=PCO_ReemplazarVariablesPHPEnCadena($OrigenValorCampo);\n					$nombre_campo=$OrigenValorCampo.$posfijo_campo;\n\n					//Agrega el campo a la consulta si no se encuentra en el arreglo de ocultos o no se quieren evitar esos campos\n					if (@!in_array($nombre_campo,$PCO_ColumnasOcultas) || $evitar_campos_ocultos==0)\n						$consulta.=$nombre_campo.\",\";\n				}\n\n			// Elimina la ultima coma en el listado de campos\n			$consulta=substr($consulta, 0, strlen($consulta)-1);\n\n			//Busca las TABLAS definidas para el informe\n			$consulta.=\" FROM \";\n			$consulta_tablas=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_tablas.\" FROM \".$TablasCore.\"informe_tablas WHERE informe=? \",\"$informe\");\n			while ($registro_tablas = $consulta_tablas->fetch())\n				{\n					//Si tiene alias definido lo agrega\n					$posfijo_tabla=\"\";\n					if ($registro_tablas[\"valor_alias\"]!=\"\") $posfijo_tabla=\" as \".PCO_ReemplazarVariablesPHPEnCadena($registro_tablas[\"valor_alias\"]);\n					//Agrega tabla a la consulta\n					$consulta.=PCO_ReemplazarVariablesPHPEnCadena($registro_tablas[\"valor_tabla\"]).$posfijo_tabla.\",\";\n				}\n			// Elimina la ultima coma en el listado de tablas\n			$consulta=substr($consulta, 0, strlen($consulta)-1);\n\n			// Busca las CONDICIONES para el informe\n			$consulta.=\" WHERE \";\n			$consulta_condiciones=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_condiciones.\" FROM \".$TablasCore.\"informe_condiciones WHERE informe=? ORDER BY peso,id\",\"$informe\");\n			$hay_condiciones=0;\n			while ($registro_condiciones = $consulta_condiciones->fetch())\n				{\n					//Agrega condicion a la consulta\n					$valor_izquierdo=$registro_condiciones[\"valor_izq\"];\n					$valor_derecho=$registro_condiciones[\"valor_der\"];\n					//Evalua casos donde se tienen variables PHP escapadas por llaves.  Ej  \"%{$Variable}%\" si fuera para un LIKE, por ejemplo.\n					$valor_izquierdo=PCO_ReemplazarVariablesPHPEnCadena($valor_izquierdo);\n					$valor_derecho=PCO_ReemplazarVariablesPHPEnCadena($valor_derecho);\n\n					$consulta.=\" \".$valor_izquierdo.\" \".$registro_condiciones[\"operador\"].\" \".$valor_derecho.\" \";\n					$hay_condiciones=1;\n				}\n			if (!$hay_condiciones)\n			$consulta.=\" 1 \";\n\n			//Busca si debe ser ordenado o agrupado\n			$registro_informe=PCO_EjecutarSQL(\"SELECT agrupamiento,ordenamiento FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\")->fetch();\n			if (@$registro_informe[\"agrupamiento\"]!=\"\")\n				{\n					$campoagrupa=$registro_informe[\"agrupamiento\"];\n					$consulta.= \" GROUP BY $campoagrupa\";\n				}\n\n			if (@$registro_informe[\"ordenamiento\"]!=\"\")\n				{\n					$campoorden=$registro_informe[\"ordenamiento\"];\n					$consulta.= \" ORDER BY $campoorden\";\n				}\n\n		return $consulta;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_GenerarEtiquetasConsulta\n	Genera una lista separadas por coma con las etiqeutas asociadas a un query SQL\n\n	Variables de entrada:\n\n		ConsultaSQL - La consulta en SQL que generara las etiquetas\n		informe - Si se recibe un ID de informe lo usa para conoecr sus columnas ocultas\n\n	Salida:\n\n		* Variable de tipo arreglo con los Resultados para ColumnasVisibles, NumerosColumnasOcultas y NumeroColumnas\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_GenerarEtiquetasConsulta($ConsultaSQL=\"\",$informe)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n\n		// Busca datos del informe\n		if ($informe!=\"\")\n			$registro_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\")->fetch();\n\n		//Si encuentra que el informe usa conexion alterna accesa la variable de conexion como global\n		if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n			global ${$registro_informe[\"conexion_origen_datos\"]};\n\n		//Averigua cuales columnas estan definidas como ocultas\n		if ($informe!=\"\")\n			$ColumnasOcultas=PCO_DeterminarCamposOcultos($informe);\n\n		//Si se recibe un query sigue adelante\n		if ($ConsultaSQL!=\"\")\n			{\n				// Imprime encabezados de columna si encuentra al menos un registro\n				//Si el informe usa una conexion externa usa su configuracion\n				if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n					$resultado_columnas=@PCO_EjecutarSQL($ConsultaSQL,\"\",${$registro_informe[\"conexion_origen_datos\"]},1); //${$registro_informe[\"conexion_origen_datos\"]}\n				else\n					$resultado_columnas=@PCO_EjecutarSQL($ConsultaSQL);\n\n				//Procesa resultados solo si es diferente de 1 que es el valor retornado cuando hay errores evitando el fatal error del fetch(), rowCount() y demas metodos\n				if ($resultado_columnas!=\"1\")\n					$ConteoRegistros=$resultado_columnas->rowCount();\n\n				//Si se tienen registros para mirar las columnas las agrega\n				if ($ConteoRegistros>0)\n					{\n						$numero_columnas=0;\n						foreach($resultado_columnas->fetch(PDO::FETCH_ASSOC) as $key=>$val)\n							{\n								//Imprime el encabezado siempre y cuando no se trate de un campo que se desea ocultar\n								if (!in_array($key,$ColumnasOcultas))\n									{\n										$PCO_ColumnasVisibles[]=$key;\n									}\n								else\n									{\n										//Agrega la columna al indice de columnas ocultas para no mostrarla luego\n										$PCO_NumerosColumnasOcultas[]=$numero_columnas;\n									}\n								$numero_columnas++;\n							}\n					}\n			}\n		@$Resultados[]=array(ColumnasVisibles => $PCO_ColumnasVisibles, NumerosColumnasOcultas=>$PCO_NumerosColumnasOcultas	,NumeroColumnas => $numero_columnas);\n		return $Resultados;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CamposRealesInforme\n	Retorna un arreglo con nombres de campos completos, sus nombres reales en base de datos y los nombres de las tablas correspondientes\n\n	Variables de entrada:\n\n		informe - ID de informe lo usa para conocer todas sus columnas\n\n	Salida:\n\n		* Variable de tipo arreglo con los Resultados\n\n	Ver tambien:\n		<PCO_CargarInforme>\n*/\nfunction PCO_CamposRealesInforme($informe)\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore;\n		global $ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas;\n\n		// Busca datos del informe\n		if ($informe!=\"\")\n			{\n				$consulta_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\");\n				$registro_informe=$consulta_informe->fetch();\n\n				if ($registro_informe[\"conexion_origen_datos\"]!=\"\")\n					global ${$registro_informe[\"conexion_origen_datos\"]};\n			}\n\n			//Busca los CAMPOS definidos para el informe y sus TABLAS correspondientes\n			$ListaCampos_NombreCompleto=array();	//Nombre completo del campo\n			$ListaCampos_NombreSimple=array();		//Lado izquierdo solamente cuando se cuenta con Alias\n			$ListaTablas_NombreSimple=array();		//Nombre de la tabla de donde sale el campo\n			$ListaCampos_PermitirEdicion=array();	//Guarda los estados de edicion en linea para el campo\n			$consulta_campos=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_campos.\" FROM \".$TablasCore.\"informe_campos WHERE informe=? ORDER BY peso,id\",\"$informe\");\n			while ($registro_campos = $consulta_campos->fetch())\n				{\n					//Si tiene alias definido lo agrega\n					$posfijo_campo=\"\";\n					if ($registro_campos[\"valor_alias\"]!=\"\") $posfijo_campo=\" as \".$registro_campos[\"valor_alias\"];\n					$nombre_campo=$registro_campos[\"valor_campo\"].$posfijo_campo;\n\n					//Agrega el campo a la lista de nombres completos\n					$ListaCampos_NombreCompleto[]=$nombre_campo;\n\n					//Agrega el estado de edicion o no para el campo\n					$ListaCampos_PermitirEdicion[]=$registro_campos[\"editable\"];\n\n					//Establece el nombre del campo simple (el real en base de datos)\n						//Elimina la posibilidad de un alias \" as \" tomando la primera parte solamente\n						$PartesListaCampos_NombreCompleto=explode(\" as \",$nombre_campo);\n						$nombre_campo_simple=$PartesListaCampos_NombreCompleto[0];\n						//Elimina la posibilidad de un punto \" . \" indicando la tabla\n						if (strpos($nombre_campo_simple,\".\"))\n							{\n								$PartesListaCampos_NombreCompleto=explode(\".\",$nombre_campo_simple);\n								$nombre_campo_simple=$PartesListaCampos_NombreCompleto[1];\n							}\n\n					//Agrega el campo a la lista de nombres simples\n					$ListaCampos_NombreSimple[]=$nombre_campo_simple;\n\n					//Determina la tabla a la que pertenece el campo\n					//Se verifica inicialmente si el campo ya indica la tabla para evitar ambiguedades en consultas de varias tablas\n					$PartesListaCampos_NombreCompleto=explode(\" as \",$nombre_campo);\n					$nombre_campo_simple=$PartesListaCampos_NombreCompleto[0];\n					//Si el campo tiene puntos indica la tabla, sino la buscamos\n					if (strpos($nombre_campo_simple,\".\"))\n						{\n							$PartesListaCampos_NombreCompleto=explode(\".\",$nombre_campo_simple);\n							$nombre_tabla_simple=$PartesListaCampos_NombreCompleto[0];\n							$ListaTablas_NombreSimple[]=$nombre_tabla_simple;\n						}\n					else\n						{\n							$nombre_tabla_simple=\"\";\n							//Busca en las TABLAS definidas para el informe\n							$consulta_tablas=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe_tablas.\" FROM \".$TablasCore.\"informe_tablas WHERE informe=? \",\"$informe\");\n							while ($registro_tablas = $consulta_tablas->fetch())\n								{\n									$tabla_actual=$registro_tablas[\"valor_tabla\"];\n									//Si la tabla tiene alias lo ignora\n									if (strpos($tabla_actual,\" as \"))\n										{\n											$PartesTablaActual=explode(\" as \",$tabla_actual);\n											$tabla_actual=$PartesTablaActual[0];\n										}\n									//Si no se ha encontrado la tabla entra a comparar frente a la actual\n									if ($nombre_tabla_simple==\"\")\n										{\n											//Si el informe usa una conexion externa usa su configuracion\n											if($registro_informe[\"conexion_origen_datos\"]!=\"\")\n												{\n													if (@PCO_ExisteCampoTabla($nombre_campo_simple,$tabla_actual,${$registro_informe[\"conexion_origen_datos\"]},$registro_informe[\"motorbd\"],$registro_informe[\"basedatos\"]))\n														$nombre_tabla_simple=$tabla_actual;\n												}\n											else\n												{\n													if (PCO_ExisteCampoTabla($nombre_campo_simple,$tabla_actual))\n														$nombre_tabla_simple=$tabla_actual;\n												}\n										}\n								}\n							$ListaTablas_NombreSimple[]=$nombre_tabla_simple;\n						}\n				}\n\n		@$Resultados[]=array(ListaCampos_NombreCompleto => $ListaCampos_NombreCompleto, ListaCampos_NombreSimple=>$ListaCampos_NombreSimple	,ListaTablas_NombreSimple => $ListaTablas_NombreSimple, ListaCampos_PermitirEdicion => $ListaCampos_PermitirEdicion);\n		return $Resultados;\n	}\n\n\n########################################################################\n########################################################################\n/*\n	Function: PCO_CargarInforme\n	Genera el codigo HTML correspondiente a un informe de la aplicacion y hace los llamados necesarios para la diagramacion por pantalla de los diferentes objetos que lo componen.\n\n	Variables de entrada:\n\n		informe - ID unico del informe que se desea cargar\n		en_ventana - Indica si el informe debe ser cargado en una ventana o directamente sobre el escritorio de aplicacion\n		formato - Determina el formato en el cual es generado el informe como HTM o XLS (Alpha)\n		estilo - Determina el estilo CSS utilizado para presentar el informe, debe existir dentro de las hojas de estilo de la plantilla\n		embebido - Determina si el informe es presentado dentro de otro objeto o no, como por ejemplo un formulario\n\n	(start code)\n		SELECT * FROM \".$TablasCore.\"informe WHERE id=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_campos WHERE informe=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_tablas WHERE informe=\'$informe\'\n		SELECT * FROM \".$TablasCore.\"informe_condiciones WHERE informe=\'$informe\' ORDER BY peso\n	(end)\n\n	Salida:\n\n		HTML, CSS y Javascript asociado al formulario\n\n	Ver tambien:\n		<PCO_CargarFormulario> | <PCO_ConstruirConsultaInforme>\n*/\n	//Funcion para compatibilidad hacia atras.  Desaparecera en la version 18.9\n	function cargar_informe($informe,$en_ventana=1,$formato=\"htm\",$estilo=\"Informes\",$embebido=0)\n	{ echo \"ERROR: Llamado a funcion obsoleta del framework cargar_informe().  En su lugar utilice PCO_CargarInforme() \"; }\nfunction PCO_CargarInforme($informe,$en_ventana=1,$formato=\"htm\",$estilo=\"Informes\",$embebido=0,$anular_acciones=0,$anular_piepagina=0,$anular_encabezado=0,$SQLPuro=\"\")\n	{\n		global $ConexionPDO,$ArchivoCORE,$TablasCore,$Nombre_Aplicacion,$PCO_ValorBusquedaBD,$PCO_CampoBusquedaBD;\n		// Carga variables de sesion por si son comparadas en alguna condicion.  De todas formas pueden ser cargadas por el usuario en el diseno del informe\n		global $PCOSESS_LoginUsuario,$Nombre_usuario,$Descripcion_usuario,$Nivel_usuario,$Correo_usuario,$LlaveDePasoUsuario,$PCO_FechaOperacion;\n		// Carga variables de definicion de tablas\n		global $ListaCamposSinID_replicasbd,$ListaCamposSinID_informe,$ListaCamposSinID_informe_campos,$ListaCamposSinID_informe_tablas,$ListaCamposSinID_informe_condiciones,$ListaCamposSinID_informe_boton;\n		global $MULTILANG_Editar,$MULTILANG_Informes,$MULTILANG_Exportar,$MULTILANG_TotalRegistros,$MULTILANG_ContacteAdmin,$MULTILANG_ObjetoNoExiste,$MULTILANG_ErrorTiempoEjecucion,$MULTILANG_Informes,$MULTILANG_IrEscritorio,$MULTILANG_ErrorDatos,$MULTILANG_InfErrTamano,$MULTILANG_MonCommSQL;\n		global $IdiomaPredeterminado;\n		global $PCO_InformesListaColumnasDT,$PCO_InformesRecuperacionAJAX,$PCO_InformesIdCache,$PCO_InformesDataTable,$PCO_InformesDataTablePaginaciones,$PCO_InformesDataTableTotales,$PCO_InformesDataTableFormatoTotales,$PCO_InformesDataTableExrpotaCLP,$PCO_InformesDataTableExrpotaCSV,$PCO_InformesDataTableExrpotaXLS,$PCO_InformesDataTableExrpotaPDF,$PCO_InformesDataTableDefineCOLS,$PCO_InformesDataTable_pane_activado,$PCO_InformesDataTable_pane_cascada,$PCO_InformesDataTable_pane_colapsado,$PCO_InformesDataTable_pane_columnas,$PCO_InformesDataTable_pane_subtotalesrelativos,$PCO_InformesDataTable_pane_conteos,$PCO_InformesDataTable_pane_controles,$PCO_InformesDataTable_pane_control_colapsar,$PCO_InformesDataTable_pane_control_ordenar;\n		global $ModoDepuracion,$ModoDesarrolladorPractico;\n		global $PCO_InformesGraficosSinDatos,$PCOVAR_ConteoRegistrosUltimoInforme;\n		global $PCO_FuncionesJSInternasFORM;\n		\n		//Determina si el usuario es un disenador de aplicacion para mostrar el ID de objeto a manera informativa y un boton de salto a edicion\n		$BotonSaltoEdicion=\'\n					<a class=\"btn btn-default btn-xs\" href=\"index.php?PCO_Accion=PCO_EditarInforme&informe=\'.$informe.\'\">\n						<div><i class=\"fa fa-pencil-square\"></i> \'.$MULTILANG_Editar.\' \'.$MULTILANG_Informes.\' <i>[ID=\'.$informe.\']</i></div>\n					</a>\';\n\n		if ($SQLPuro==\"\")\n			{\n				if (PCO_EsAdministrador($_SESSION[\'PCOSESS_LoginUsuario\']) && $informe>=0)\n					$ComplementoIdObjetoEnTitulo=\"  $BotonSaltoEdicion\";\n\n				// Busca datos del informe\n				$consulta_informe=PCO_EjecutarSQL(\"SELECT id,\".$ListaCamposSinID_informe.\" FROM \".$TablasCore.\"informe WHERE id=? \",\"$informe\");\n				$registro_informe=$consulta_informe->fetch();\n				$Identificador_informe=$registro_informe[\"id\"];\n\n				//Carga cualquier script PRE para el informe\n				if ($registro_informe[\"pre_script\"]!=\"\")\n					{\n						//Evalua si el codigo ya inicia con <?php y sino lo agrega\n						$ComplementoInicioScript=\"\";\n						if (substr(trim($registro_informe[\"pre_script\"]),0,5)!=\'<?php\')\n							$ComplementoInicioScript=\"<?php\\n\";\n						PCO_EvaluarCodigo($ComplementoInicioScript.$registro_informe[\"pre_script\"],1,\"Detalles: PRE-Code Rep ID=\".$informe);\n					}\n\n				//Prepara script POST para el informe (se carga mas abajo pero deja la cadena lista)\n				if ($registro_informe[\"post_script\"]!=\"\")\n					{\n						//Evalua si el codigo ya inicia con <?php y sino lo agrega\n						$ComplementoInicioScript=\"\";\n						if (substr(trim($registro_informe[\"post_script\"]),0,5)!=\'<?php\')\n							$ComplementoInicioScript=\"<?php\\n\";\n						$CadenaPOSTScriptPHP=$ComplementoInicioScript.$registro_informe[\"post_script\"];\n					}\n\n				//Prepara JavaSCRIPT para el informe (se carga mas abajo pero deja la cadena lista)\n				if (trim($registro_informe[\"javascript\"])!=\"\")\n				