function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); }

function CambiarModo_Bienvenida()
    {
        const ModosPermitidos = ["Eiffel", "AsciiDoc", "Cirru", "Clojure", "Dockerfile", "Elixir", "Elm", "Erlang", "Io", "Jack", "Markdown", "Mask", "pgSQL", "Properties", "Space", "Tcl", "Vala", "Text"];
        const Indice = Math.floor(Math.random() * ModosPermitidos.length);
	    if ($("#PCODER_archivo").val() == "inc/practico/PCoder")
	        {
	            CambiarModoEditor("ace/mode/"+ModosPermitidos[Indice]);
	        }
    }

function PCODER_CerrarArchivoActual()
    {
        //TODO: revisar si con almacenamiento local se puede validar si hay cambios sin guardar para advertir
        
        //Elimina bloqueos de versiones abiertas del archivo SOLO si son abiertas por el mismo usuario
        ResultadoOperacion=PCO_ObtenerContenidoAjax(0,"index.php","PCO_Accion=PCO_EjecutarPostFormulario&Formulario=-33&Llave={$LlaveDePaso}&PCODER_Accion=PCODER_EliminarBloqueo&ArchivoBloqueo={$PCODER_archivo}");

        //Elimina variable local que indica que la ventana esta abierta
        localStorage.removeItem("{$LlaveVentana_Archivo}");
        
        //Cierra la ventana de manera definitiva
        window.close();
        //Para los casos en que la ventana no puede ser cerrada, presenta mensaje que no se puede cerrar automaticamente y quita el editor.
		PCOJS_MostrarMensaje("Sesion", "{P}Coder ha sido cerrado. Puede cerrar su navegador o pestaña.<br><br><br>{P}Coder was closed. You can close this browser or tab."," modal modal-wide ");
        $("#page-wrapper").hide();
    }


//para posible eliminacion, mirar solo el evento de apertura.
function ExplorarPath(DesdeOnChange)
	{
		//Inicializa el explorador de archivos (panel izquierdo)
		$(document).ready( function() {
			$('#marco_explorador').fileTree({ root: path_exploracion_archivos.value, script: '../../inc/jquery/plugins/jquery.fileTree-1.01/connectors/jqueryFileTree.php', folderEvent: 'dblclick' }, function(archivo_seleccionado) {
				PCODER_CargarArchivo(archivo_seleccionado);

				//Simula clic sobre la pestana de archivos para pasar automaticamente a esta vista
				$('#pestana_editor_archivos').trigger('click');
			});
		});
		
		//Inicializa el explorador de archivos (creacion de archivos y carpetas)
		$(document).ready( function() {
			$('#marco_explorador_creacionarchivo').fileTree({ root: path_exploracion_archivos.value, script: '../../inc/jquery/plugins/jquery.fileTree-1.01/connectors/jqueryFileTree.php?nofiles=true' }, function(path_seleccionado_creacion) {
			});
		});
	}

function PCODER_EliminarHistorialArchivo()
    {
        ResultadoOperacion=PCO_ObtenerContenidoAjax(0,"index.php","PCO_Accion=PCO_EjecutarPostFormulario&Formulario=-33&Llave={$LlaveDePaso}&PCODER_Accion=PCODER_EliminarHistorial&Llave_Registro="+document.FRMBASEINFORME.PCO_Valor.value);
		$('#PCO_Modal_Mensaje').modal('hide');
    }

function PCODER_CompararVersionArchivo()
    {
        var ParametrosVentana = [
            'height='+screen.height,
            'width='+screen.width,
            'location=no',
            'menubar=no',
            'resizable=yes',
            'scrollbars=no',
            'status=no',
            'titlebar=no',
            'toolbar=no',
            'fullscreen=yes' // only works in IE, but here for completeness
        ].join(',');

        URL="index.php?PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:-35:0&Presentar_FullScreen=1&Precarga_EstilosBS=1";

        //Version historica siempre sale desde el registro de PCoder
        URL+="&PDIFF_Version1=";
        URL+="&PDIFF_OrigenVersion1=B";  //A | B
        URL+="&PDIFF_TablaBDVersion1=core_pcoder_historial";
        URL+="&PDIFF_CampoBDVersion1=contenido";
        URL+="&PDIFF_LlaveBDVersion1="+document.FRMBASEINFORME.PCO_Valor.value;

        //Version nueva puede estar saliendo desde archivo nuevo o BD segun origen del archivo editado.  Segun el caso define el origen para el Diff
        if ($("#Origen_Archivo").val()=="A")
            {
                URL+="&PDIFF_OrigenVersion2=A";  //A | B
                URL+="&PDIFF_Version2="+$("#PCODER_archivo").val();
            }
        else
            {
                URL+="&PDIFF_OrigenVersion2=B";  //A | B
                URL+="&PDIFF_TablaBDVersion2="+$("#Tabla_Archivo").val();
                URL+="&PDIFF_CampoBDVersion2="+$("#Campo_Archivo").val();
                URL+="&PDIFF_LlaveBDVersion2="+$("#Llave_Registro").val();                
            }

        var VentanaHistorial = window.open(URL, VentanaHistorial, ParametrosVentana).focus();
        VentanaHistorial.moveTo(0,0);
    }

function PCODER_HistorialArchivoActual()
    {
        if("{$PCODER_archivo}"!="inc/practico/PCoder")
            {
        		ResultadoOperacion=PCO_ObtenerContenidoAjax(0,"index.php","PCO_Accion=PCO_CargarObjeto&PCO_Objeto=inf:-23:0&PCODER_archivo="+$("#PCODER_archivo").val()+"&NombreArchivo={$PCODER_NombreArchivo}&Presentar_FullScreen=1&Precarga_EstilosBS=0");
        		PCOJS_MostrarMensaje("{$MULTILANG_PCODER_HistorialVersiones}", ResultadoOperacion," modal modal-wide ");                
                //$("#PCODIV_SeccionLateralFlotante").html(ResultadoOperacion);
                
            }
        // else
        //     {
        // 		PCOJS_MostrarMensaje(MULTILANG_PCODER_HistorialVersiones, "Cargue primero un archivo para revisar su historial de cambios<br><br>Please load a file to see the version history");
        //     }
    }


function AjustarTipoMenu()
    {
		if ($('#PCODER_TipoMenu').val()=="Texto")
		    {
		        $('.menu_iconos').hide();
		    }
		else
		    {
		        $('.menu_textual').hide();
		        $('.menu_iconos').css("padding","0");
		    }
    }

function AjustarMaquetacion_FormularioEditor()
    {
        //Estilos para ajustar la maquetacion y economizar espacio
        $('#PCOContenedor_marco_cadena_editores_ace').css('padding','0');
        $('#page-wrapper').css('padding','0');
        $("[class=container-fluid]").each(function() { $(this).css("padding", "0"); });
        $("[class=col-lg-12]").each(function() { $(this).find('br:first').remove(); });
        $(".menu_textual").each(function() { $(this).css("padding-left", "0"); });
        //$(".iconos_fijos_menu").each(function() { $(this).css("padding", "0"); });
        $("#MENU_FORMULARIO_OPCION_1").each(function() { $(this).find('ul:first').css("padding","0"); });




        //TODO: Elimina la barra de navegacion responsive y deja el menu para que se comporte como un DIV mas...
        // $("MENU_FORMULARIO_-33").removeClass("collapse navbar navbar-collapse navbar-default navbar-inverse");
        // $(".navbar-header").remove();
        // $("nav").removeClass("navbar-default");
        // $("nav").each(function() { $(this).css("min-height", "0"); });
        //$("nav").removeClass("navbar");
        // $(".navbar-collapse").css("overflow", "visible");
        // $(".navbar-collapse.collapse").css("overflow", "visible"); 
        // $(".navbar-toggle").css("display", "none"); 

        //Ajusta barras de desplazamiento
        $('body').css('overflow-x','hidden');
        $('body').css('overflow-y','hidden');
        $('html').css('overflow-x','hidden');
        $('html').css('overflow-y','hidden');

        //Estilos generales inyectados directamente al HEAD usados en el estandar anterior de PCoder
		$('head').append('<style type="text/css"> \
            /*Personalizacion de barras de desplazamiento*/ \
	        /*Barra de desplazamiento como tal*/ \
	        ::-webkit-scrollbar { \
		        width: 10px; \
		        height: 10px; \
	        } \
        	/*Botones de los extremos de la barra*/ \
        	::-webkit-scrollbar-button:start:decrement, \
        	::-webkit-scrollbar-button:end:increment  { \
        		display: none; \
        	} \
        	/*Barra sobre la que se mueve el boton flotante*/ \
        	::-webkit-scrollbar-track  { \
        	} \
        	/*Espacio libre de la barra de desplazamiento*/ \
        	::-webkit-scrollbar-track-piece  { \
        		background-color: #3b3b3b; \
        		-webkit-border-radius: 6px; \
        	} \
        	/*Boton flotante de la barra de desplazamiento*/ \
        	::-webkit-scrollbar-thumb:vertical { \
        		-webkit-border-radius: 6px; \
        		background: #666 no-repeat center; \
        	} \
        	::-webkit-scrollbar-thumb:horizontal { \
        		-webkit-border-radius: 6px; \
        		background: #666 no-repeat center; \
        	} \
        	/*Esquina donde se encuentran las barras*/ \
        	::-webkit-scrollbar-corner { \
        		display: none; \
        	} \
        	/*Esquina donde se encuentran las barras - cuando es redimensionable*/ \
        	::-webkit-resizer { \
        		display: none; \
        	} \
	        </style>');
    }

function AjustarPaletaEditor()
    {
        //Ajusta colores, tamaños y presentacion de algunos elementos
        //$(".navbar-collapse").css("background","272727");                       //Fondo barra de menus:  gray | 272727 | 222222 | 3d3d3d
        $("#MENU_FORMULARIO_-33").addClass("navbar-default navbar-inverse");        //Estilo barra de menues
        $("#MENU_FORMULARIO_-33").css("color","lightgray");                         //Color de fuente menus
        $(".navbar-default").css("border-width","0");                               //Elimina borde en barra de menus
        $(".dropdown-menu").css("background","darkgray");                           //Fondo de los menues desplegables - opciones
        $("[class=container-fluid]").each(function() { $(this).find('div:first').css('background','#272727'); });   //Fondo general del editor antes usada en body o html: 002a36 | BFBFBF | 888888 | 272727 | 000000
        $( "#wrapper" ).css( "background-color","#272727" );                        //Color del fondo de la barra izquierda

        //Estilos para nombre del archivo o recurso editado
        //$(".path_visual").each(function() { $(this).css("padding", "1"); });
        $(".path_visual").css("background","#272727");
        $(".path_visual").addClass("btn-xs");
        $(".path_visual").each(function() { $(this).css("font-weight", "bold"); });
        $(".path_visual").each(function() { $(this).css("font-size", "9px"); });
        $(".path_visual").each(function() { $(this).css("color", "orange"); });
        
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            {
                $("html").css("filter","invert(0%)");
                $("video").css("filter","invert(0%)");
                $("iframe").css("filter","invert(0%)");
                $(".modal-backdrop").css("filter","invert(0%)");
            }
        if ("{$PCO_TransformacionColores}"=="grises")
            {
                $("html").css("filter","grayscale(0%)");
            }
        if ("{$PCO_TransformacionColores}"=="sepia")
            {
                $("html").css("filter","sepia(0%)");
            }
    }
    

function IntercambiarVisibilidadNumerosDeLinea()
	{
		//InterCambia el modo del editor para mostrar (true) u ocultar (false) los numeros de linea
		if (editor.renderer.getShowGutter()==true)
			{
				editor.renderer.setShowGutter(false);
				EditorClonado.renderer.setShowGutter(false);
			}
		else
			{
				editor.renderer.setShowGutter(true);
				EditorClonado.renderer.setShowGutter(true);
			}
	}

function IntercambiarVisibilidadMenu()
	{
		if ($("#PCODER_OcultarMenu").val()=="0")
			{
				$(".navbar-default").hide();
				//$("#panel_inferior").hide();
			    $("#PCODER_OcultarMenu").val("1");
			}
		else
			{
				$(".navbar-default").show();
				//$("#panel_inferior").show();
				$("#PCODER_OcultarMenu").val("0");
			}
		ActualizarBarraEstado();
		PCODER_RecalcularMaquetacion();
	}


function SaltarALinea()
	{
		//Salta a una linea especifica del editor
		var linea = document.getElementById("linea_salto").value;
		//Valida que se tenga un valor de linea y que este en un rango valido
		if (linea!="" && linea>0)
			{
				editor.gotoLine(linea, 0, true);
				document.getElementById("linea_salto").value="";			
			}
	}

//Toma las propiedades del editor principal y las copia en el editor clonado
function ClonarPropiedadesEditor()
	{
		EditorClonado.setAnimatedScroll(editor.getAnimatedScroll());
		EditorClonado.setBehavioursEnabled(editor.getBehavioursEnabled());
		EditorClonado.setOverwrite(editor.getOverwrite());
		EditorClonado.setPrintMarginColumn(editor.getPrintMarginColumn());
		EditorClonado.setScrollSpeed(editor.getScrollSpeed());
		EditorClonado.setShowInvisibles(editor.getShowInvisibles());
		EditorClonado.setShowPrintMargin(editor.getShowPrintMargin());
		EditorClonado.setWrapBehavioursEnabled(editor.getWrapBehavioursEnabled());
		EditorClonado.setTheme(editor.getTheme());
		EditorClonado.setFontSize(editor.getFontSize());
		EditorClonado.renderer.setShowGutter(editor.renderer.getShowGutter());
		
		//Modo de resaltado
		ModoClonado="ace/mode/{$PCODER_ModoEditor}";
		var ModoFiltrado = ModoClonado.replace(/_/g, " ");
		ModoFiltrado = ModoFiltrado.toLowerCase();
		//Cambia el modo de sintaxis y errores resaltado por el editor
		EditorClonado.getSession().setMode(ModoFiltrado);
	}

function IntercambiarEstadoCaracteresInvisibles()
	{
		//InterCambia el modo del editor para mostrar (true) u ocultar (false) los caracteres invisibles segun su estado actual
		if (editor.getShowInvisibles()==true)
			{
				editor.setShowInvisibles(false);
				EditorClonado.setShowInvisibles(false);
			}
		else
			{
				editor.setShowInvisibles(true);
				EditorClonado.setShowInvisibles(true);
			}
	}

function IntercambiarPantallaCompleta()
	{
		if (!document.fullscreenElement &&    // alternative standard method
		  !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) {  // current working methods
			if (document.documentElement.requestFullscreen) {
			  document.documentElement.requestFullscreen();
			} else if (document.documentElement.msRequestFullscreen) {
			  document.documentElement.msRequestFullscreen();
			} else if (document.documentElement.mozRequestFullScreen) {
			  document.documentElement.mozRequestFullScreen();
			} else if (document.documentElement.webkitRequestFullscreen) {
			  document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
			}
		} else {
			if (document.exitFullscreen) {
			  document.exitFullscreen();
			} else if (document.msExitFullscreen) {
			  document.msExitFullscreen();
			} else if (document.mozCancelFullScreen) {
			  document.mozCancelFullScreen();
			} else if (document.webkitExitFullscreen) {
			  document.webkitExitFullscreen();
			}
		}
	}

function CambiarFuenteEditor(tamano)
	{
		//Cambia la fuente del editor al tamano recibido
		editor.setFontSize(tamano);
		try
			{
				EditorClonado.setFontSize(tamano);
			}
		catch(error) {}
	}

function CambiarTemaEditor(tema)
	{
		//Cambia la apariencia grafica del editor
		editor.setTheme(tema);
		try
			{
				EditorClonado.setTheme(tema);
			}
		catch(error) {}
	}

function CaracteresInvisiblesEditor(estado)
	{
		//Cambia el modo del editor para mostrar (true) u ocultar (false) los caracteres invisibles
		if (estado==0)
			editor.setShowInvisibles(false);
		else
			editor.setShowInvisibles(true);
	}

function AumentarTamanoFuente()
	{
		tamano=editor.getFontSize();
		tamano = tamano.substring(0, tamano.length-2); //Elimina las letras de px al final
		tamano=parseInt(tamano)+2;
		CambiarFuenteEditor(tamano+"px");
	}


function DisminuirTamanoFuente()
	{
		tamano=editor.getFontSize();
		tamano = tamano.substring(0, tamano.length-2); //Elimina las letras de px al final
		tamano=parseInt(tamano)-2;
		CambiarFuenteEditor(tamano+"px");
	}

function PCODER_DeshacerEdicion()
	{
        //editor.undo(true);
        editor.getSession().getUndoManager().undo(false); //Si true deshabilita seleccion del texto
    }


function PCODER_RehacerEdicion()
	{
        //editor.redo(true);
        editor.getSession().getUndoManager().redo(false); //Si true deshabilita seleccion del texto
    }

//Genera una nueva sesion del editor ACE
function ClonarSesionEditor(session)
	{
		var s = new ace.EditSession(session.getDocument(), session.getMode());
		s.$foldData = session.$cloneFoldData();
		return s;
	}

function PCO_MostrarMensajeCargandoSimple(MiliSegundos)
	{
		// Se muestra el cuadro modal
		$('#PCO_Modal_MensajeCargandoSimple').modal('show');

		//Hacer que la ventana este siempre por encima
		$("#PCO_Modal_MensajeCargandoSimple").css("z-index", "1500");
		
		//Si recibe un valor de segundos diferente de cero entonces programa el cierre automatico
		if (MiliSegundos!=0)
			setTimeout(function(){PCOJS_OcultarMensajeCargandoSimple()},MiliSegundos);
	}

function Guardar()
	{
	    document.form_archivo_editado.PCO_Accion.value="PCO_EjecutarPostFormulario";
	    $("#form_archivo_editado").attr("target", "frame_almacenamiento");
	    $("#form_archivo_editado").attr("action", "index.php");
	    
		var MensajeErrorAlmacenamiento="";
		//Si se trata del archivo demo
		if ($("#PCODER_archivo").val() == "")
			MensajeErrorAlmacenamiento="{$MULTILANG_PCODER_ErrGuardarDefecto}";
		//Verifica permisos
		if ($("#PermisosRW").val()!="1")
			MensajeErrorAlmacenamiento="{$MULTILANG_PCODER_ErrGuardarNoPermiso}";
			
		//Verifica que no este abierto como de solo lectura
		if ($("#PCODER_SoloLectura").val()=="1")
			MensajeErrorAlmacenamiento="Contenido abierto como de solo lectura";
			
		//Ejecuta el proceso de almacenamiento
		if (MensajeErrorAlmacenamiento == "")
			{
			    //Evita guardar el archivo de bienvenida de PCoder
			    if ($("#PCODER_archivo").val() != "inc/practico/PCoder")
			        {
                        //Actualiza el textareacon el valor del textarea a enviar con el valor del textarea en el indice
                        // 			document.getElementById("PCODER_AreaTexto"+IndiceArchivoActual).value=editor.getSession().getValue();
                        
                        // 		//Actualiza el Textarea y formulario base del editor
                        // 		document.form_archivo_editado.PCODER_archivo.value=ListaArchivos[IndiceRecibido].RutaDocumento;
                        // 		document.form_archivo_editado.PCODER_TokenEdicion.value=ListaArchivos[IndiceRecibido].TokenEdicion;
                        // 		document.form_archivo_editado.PCODER_AreaTexto.value=document.getElementById("PCODER_AreaTexto"+IndiceRecibido).value;
        			
        				//Metodo estandar, envia todo sobre el iframe para evitar recargar la pagina
        				PCO_MostrarMensajeCargandoSimple(1000);
        				document.form_archivo_editado.submit();
			        }
			}
		else
			{
				PCOJS_MostrarMensaje("{$MULTILANG_PCODER_Guardando}: {$MULTILANG_PCODER_Error}",MensajeErrorAlmacenamiento);			
			}
	}

function InicializarEditorACE()
    {
        //Incluye extension de lenguaje para ACE
        ace.require("ace/ext/language_tools");
        // Crea el editor
        editor = ace.edit("editor_codigo");
        //editor = ace.edit("marco_cadena_editores_ace");
        editor.getSession().setUseWorker(true); //Llevar a false para evitar el error 404 para "worker-php.js Failed to load resource: the server responded with a status of 404 (Not Found)"
        editor.resize(true);
        editor.getSession().setNewLineMode("unix");

        //ace.$blockScrolling = Infinity;
        //ace.$blockScrolling = 1;
        //editor.blockScrolling = Infinity;

        // Inicia el editor de codigo con las opciones predeterminadas
        CambiarFuenteEditor("13px");
        CambiarTemaEditor("ace/theme/ambiance");  //tomorrow_night|twilight|eclipse|ambiance|ETC

        //Activa la autocompletacion de codigo y los snippets
        editor.setOptions({
        	enableBasicAutocompletion: true,
        	enableSnippets: true,
        	enableLiveAutocompletion: true
        });
        
        editor.setAnimatedScroll(true);
        
        //Elimina la visualizacion de margen de impresion
        editor.setShowPrintMargin(0);
        CaracteresInvisiblesEditor(0);

        //En cada evento de cambio actualiza el textarea
        editor.getSession().on('change', function(){
          document.getElementById("PCODER_AreaTexto").value=editor.getSession().getValue();
          //TODO:PCODER_ActualizarMinimap();
        });
        
        // CAPTURA DE EVENTOS DE TECLADO DESDE LA VENTANA  #############################################################
        //Captura el evento de Ctrl+S para guardar el archivo
        $(window).bind('keydown', function(event) {
        	//alert(String.fromCharCode(event.which).toLowerCase());
        	if (event.ctrlKey || event.metaKey) {
        		switch (String.fromCharCode(event.which).toLowerCase()) {
        		case 's':  //<-- Cambiar para otras letras ;)
        			event.preventDefault();
        			Guardar();
        			break;
        		case 'b':
        			event.preventDefault();
        			IntercambiarVisibilidadMenu();
        			break;
        		case 'o':
        			event.preventDefault();
        			//TODO:PCODER_ActivarPanelIzquierdo();
        			break;
        		case 'q':
        			event.preventDefault();
        			PCODER_CerrarArchivoActual();
        			break;
        		case 'w':
        			event.preventDefault();
        			PCODER_CerrarArchivoActual();
        			break;
        		case 'z':	//Captura evento y no retorna nada para anular comando
        			event.preventDefault();
        			break;
        		case 'y':	//Captura evento y no retorna nada para anular comando
        			event.preventDefault();
        			break;
        		}
        	}
        });

        // CAPTURA DE EVENTOS DE RATON DESDE EL EDITOR  #############################################################
        editor.on("click", function(ev){
            //TODO:PCODER_ActualizarMinimap();
            });
        
        // CAPTURA DE EVENTOS DE TECLADO DESDE EL EDITOR  #############################################################
        editor.commands.addCommand({
        		name: 'vermarcoderecho',
        		bindKey: {win: 'Ctrl-M', mac: 'Command-Option-M'},
        		exec: function(editor) {
        			//TODO:PCODER_ActivarPanelDerecho();
        			},
        		readOnly: true
        	});
        
        //DEPRECATED: Captura de eventos para manejador propio de hacer-deshacer
        // editor.commands.addCommand({
        // 		name: 'deshacer',
        // 		bindKey: {win: 'Ctrl-Z', mac: 'Command-Option-Z'},
        // 		exec: function(editor) {
        // 			PCODER_DeshacerEdicion();
        // 			},
        // 		readOnly: true
        // 	});
        // editor.commands.addCommand({
        // 		name: 'rehacer',
        // 		bindKey: {win: 'Ctrl-Y', mac: 'Command-Option-Y'},
        // 		exec: function(editor) {
        // 			PCODER_RehacerEdicion();
        // 			},
        // 		readOnly: true
        // 	});
        
        editor.commands.addCommand({
        		name: 'aumentarfuenteeditor',
        		bindKey: {win: 'Ctrl-+', mac: 'Command-Option-+'},
        		exec: function(editor) {
        			AumentarTamanoFuente();
        			},
        		readOnly: true
        	});
        editor.commands.addCommand({
        		name: 'disminuirfuenteeditor',
        		bindKey: {win: 'Ctrl--', mac: 'Command-Option--'},
        		exec: function(editor) {
        			DisminuirTamanoFuente();
        			},
        		readOnly: true
        	});

    }
















function QuitarAvisoAlmacenamiento()
	{
		//Deja el mensaje de almacenamiento al menos un segundo (para archivos pequenos almacenados rapido), luego lo oculta
		setTimeout(PCO_OcultarMensajeCargandoSimple, 500);
		
		//TODO: Devolver el foco al editor
		//editor.focus();											//Establece el foco al editor
		//$('#editor_codigo').trigger('click');
	}

function PCO_OcultarMensajeCargandoSimple()
	{
		// Se oculta el cuadro modal
		$('#PCO_Modal_MensajeCargandoSimple').modal('hide');
		$('#PCO_Modal_MensajeCargandoSimple').hide();
	}	


var EditorClonado;  //Declara como global la variable del segundo editor para ser manipulada sin problema
VistaSplit="";  //Asume que inicia con un solo editor
var ContenidoBarraEstado="";
function FrmAutoRun()
    {
        //Almacena una variable local para saber que el archivo se encuentra abierto
	    //if ($("#PCODER_archivo").val() != "inc/practico/PCoder")
            localStorage.setItem("{$LlaveVentana_Archivo}", "{$LlaveVentana_Ruta}");
        
        //Define evento para que al cierre de la ventana se elimine la variable local
            //Eventos DEPRECATED: Ya no operan sobre Chrome por seguridad.
            // window.addEventListener("beforeunload", function (event) { PCODER_CerrarArchivoActual(); });
            // window.onbeforeunload = function(){PCODER_CerrarArchivoActual();};
            // $(window).on('beforeunload', function() { PCODER_CerrarArchivoActual(); });
            
            // $( window ).unload(function() { PCODER_CerrarArchivoActual(); });
            // window.onunload = function(){PCODER_CerrarArchivoActual();};
            // $(window).on('unload', function() { PCODER_CerrarArchivoActual(); });
//        $(window).on('beforeunload', function() { return 'Esta a punto de cerar PCoder. Recuerde cerrarlo apropiadamente...'; });
//        window.onbeforeunload = function() { return "Esta a punto de cerar PCoder. Recuerde cerrarlo apropiadamente..."; }


        ContenidoBarraEstado=$("#panel_inferior").html();

        $(function(){
            InicializarEditorACE();

            ActualizarBarraEstado();
            AjustarTipoMenu();
            AjustarMaquetacion_FormularioEditor();
            AjustarPaletaEditor();

            //Carga el contenido inicial del editor
            PCODER_CargarContenidoInicial();

            //Genera el administrador de deshacer y rehacer por defecto una vez cargado el contenido.  A partir de alli considera los eventos de cambio para deshacer o rehacer
            editor.getSession().setUndoManager(new ace.UndoManager());
            
			CambiarModoEditor("ace/mode/{$PCODER_ModoEditor}"); //Hace cambio forzado de tipo de editor cuando se abre un nuevo archivo

            //Clona el editor hacia uno nuevo para permitir los split
            var NuevaSessionEditor = editor.getSession();
            var editor_actual = document.getElementById("editor_codigo");
            var parent = editor_actual.parentNode;
            
            var clone = editor_actual.cloneNode();
            EditorClonado = ace.edit("editor_clonado");
            EditorClonado.setSession( ClonarSesionEditor(NuevaSessionEditor) );
    
            // FUNCIONES DE INICIALIZACION ###############################################################
        	ExplorarPath();

            PCODER_RecalcularMaquetacion();
            
            //Verifica si esta abierto como de solo lectura y bloquea el editor
		    if ($("#PCODER_SoloLectura").val()=="1")
		        {
		            editor.setReadOnly(true);
		            //Hace ocultamiento forzado del menu, del tipo de barra y del estado
		            $('#PCODER_TipoMenu').val("Iconos");
		            $("#PCODER_OcultarMenu").val("0");
		            $("#PCODER_EstadoSimple").val("1");
		            IntercambiarVisibilidadMenu();
		        }
		    
		    //Verifica si hay mensajes de carga
		    if ("{$MensajesBloqueo}"!="")
		        {
                    PCOJS_MostrarMensaje("{$MULTILANG_Importante}", "{$MensajesBloqueo}"," modal ");                

		        }
		        
		    CambiarModo_Bienvenida();
        });
        
        
        
        //Ajusta tamano del editor en cada cambio de tamano de la ventana
        $( window ).resize(function() {
            	PCODER_RecalcularMaquetacion();
            });
    }


//##############################################################################
//##############################################################################
/*
	Function: PCODER_DividirPantalla_NO
	Elimina el modo Split del editor y llama a la funcion que recalcula y dibuja la nueva maquetacion
*/
function PCODER_DividirPantalla_NO()
	{
		//Ejecuta la operacion si ya no esta dividido
		if (VistaSplit!="")
			{
				VistaSplit="";
				//Actualiza el editor
				PCODER_RecalcularMaquetacion();
			}
	}


//##############################################################################
//##############################################################################
/*
	Function: PCODER_DividirPantalla_Horizontal
	Define el modo Split del editor y llama a la funcion que recalcula y dibuja la nueva maquetacion
*/
function PCODER_DividirPantalla_Horizontal()
	{
		//Ejecuta la operacion si ya no esta dividido
		if (VistaSplit!="H")
			{
				VistaSplit="H";
				ClonarPropiedadesEditor();
				//Actualiza el editor
				PCODER_RecalcularMaquetacion();
			}
	}


//##############################################################################
//##############################################################################
/*
	Function: PCODER_DividirPantalla_Vertical
	Define el modo Split del editor y llama a la funcion que recalcula y dibuja la nueva maquetacion
*/
function PCODER_DividirPantalla_Vertical()
	{
		//Ejecuta la operacion si ya no esta dividido
		if (VistaSplit!="V")
			{
				VistaSplit="V";
				ClonarPropiedadesEditor();
				//Actualiza el editor
				PCODER_RecalcularMaquetacion();
			}
	}


//##############################################################################
//##############################################################################
/*
	Function: CambiarModoEditor
	Define el modo o tipo de archivo o contenido que se esta editando.
	
    Variables de entrada:

        modo - Un modo valido segun ACE Editor que identifica el lenguaje o tipo de archivo a editar
        editor - La variable de entorno ya definida para el objeto tipo ACE Editor

	Salida:
		Cambio del modo para el editor, incluyendo resaltado, sintaxis, etc.
*/
function CambiarModoEditor(modo)
	{
		var ModoFiltrado = modo.replace(/_/g, " ");
		ModoFiltrado = ModoFiltrado.toLowerCase();
		//Cambia el modo de sintaxis y errores resaltado por el editor
		editor.getSession().setMode(ModoFiltrado);

		//Actualiza las listas de seleccion con el modo correspondiente
		document.getElementById("modo_archivo_preferencias").value=modo;
		document.getElementById("modo_archivo_top").value=modo;
		try
			{
				EditorClonado.getSession().setMode(ModoFiltrado);
			}
		catch(error) {}
	}
	
	
//##############################################################################
//##############################################################################
/*
	Function: PCODER_CargarContenidoInicial
	Durante la carga del editor, toma el archivo indicado inicialmente, busca su contenido y lo carga en el ACE Editor
	
    Variables de entrada:

        PCODER_archivo - Ruta del archivo que se desea cargar sobre el editor.
        Llave - La llave del sistema usada por seguridad para la carga del contenido

	Salida:
		Contenido del textarea del editor actualizado con el contenido a editar
*/
function PCODER_CargarContenidoInicial()
    {
        ValorContenidoArchivo="";
        ValorContenidoArchivo=PCO_ObtenerContenidoAjax(0,"index.php","PCO_Accion=PCO_EjecutarPostFormulario&Formulario=-33&Llave="+$("#Llave").val()+"&PCODER_Accion=PCOMOD_ObtenerContenidoArchivo&PCODER_archivo="+$("#PCODER_archivo").val()+"&Origen_Archivo={$Origen_Archivo}&Tabla_Archivo={$Tabla_Archivo}&Campo_Archivo={$Campo_Archivo}&Llave_Registro={$Llave_Registro}");

		//Actualiza el editor ACE con el valor obtenido y sus propiedades
		editor.setValue(ValorContenidoArchivo);
		editor.focus();											//Establece el foco al editor
		editor.gotoLine(1, 0, false);							//Ubica cursor en la linea,columna,sin animacion
		editor.scrollToLine(1, true, false, function () {});	//Desplaza archivo hasta la linea, sin centrarla en pantalla, sin animacion
		editor.clearSelection();
		ActualizarTituloEditor("{P} {$PCODER_NombreArchivo}");
    }


//##############################################################################
//##############################################################################
/*
	Function: PCODER_RecalcularMaquetacion
	Define el tamano de los marcos de cada elemento (especialmente los editores) segun los tamanos disponibles para la ventana actual del navegador
	
    Variables de entrada:

        VistaSplit - Indica el modo bajo el cual se encuentra el editor (completo, division horizontal o vertical)
        varias - Tomadas desde el ambiente, como anchos y altos de algunos marcos del editor

	Salida:
		Cambio en caliente de los tamanos de los diferentes elementos para redibujar todo en el navegador
*/
function PCODER_RecalcularMaquetacion()
	{
		//Define el ALTO Y ANCHO DE LOS EDITORES segun la disposicion visual (splits) y el tamano del panel_central_medio
		var AltoBarraMenu = $("#MENU_FORMULARIO_-33").height();
		var AltoBarraEstado = $("#MarcoContenedorInferior").height();  //*2 Factor de corrección en alto de barra
		var AltoBarraTitulo=0;
		
		if ("{$PCODER_Titulo}"!="")
		    AltoBarraTitulo = $("#TituloElemento").height() + 3; //Los altos no incluyen los padding, como el marco tiene 2 por todos lados se sume 3 dejando un pixel de diferencia y evitar marcos blancos.
		
		//Calcula tamano de la ventana
		//DEPRECATED: var AltoDisponiblePagina = $("body").height();
		//DEPRECATED: var AltoDisponiblePagina = $("document").height();
		//DEPRECATED: var AltoDisponiblePagina = $("#page-wrapper").height();
		//DEPRECATED: var AltoDisponiblePagina = $("#PCO_PestanaFormulario_1").height();
		var AltoDisponiblePagina = $(window).height();

		var AltoDisponible_Editores = AltoDisponiblePagina-AltoBarraMenu-AltoBarraEstado-AltoBarraTitulo;
		var AnchoDisponible_Editores = $("#PCO_PestanaFormulario_1").width();

		//Establece tamanos especificos para los editores segun la disposicion visual (splits) y deja visible el editor clonado
		if(VistaSplit=="H")
			{
				AltoDisponible_Editores=Math.round(AltoDisponible_Editores/2)-1;
				$("#panel_editor_clonado").show();
			}
			
		if(VistaSplit=="V")
			{
				AnchoDisponible_Editores=Math.round(AnchoDisponible_Editores/2)-2;
				$("#panel_editor_clonado").show();
			}

		//Reasigna los anchos y altos a los paneles por defecto
		AltoEditorReal = AltoDisponible_Editores;
		AnchoEditorReal = AnchoDisponible_Editores;
		AltoEditorClonado = AltoDisponible_Editores;
		AnchoEditorClonado = AnchoDisponible_Editores;
		
		//Si no hay divisiones pone en ceros el editor clonado y ademas oculta el marco que lo contiene
		if(VistaSplit=="")
			{
				AltoEditorClonado = 0;
				AnchoEditorClonado = 0;
				$("#panel_editor_clonado").hide();
			}
		
		$('#editor_codigo').height( AltoEditorReal+"px" ).css({ });	//Asignacion en porcentaje
		$('#editor_codigo').width( AnchoEditorReal+"px" ).css({ });	//Asignacion en porcentaje
		$('#editor_clonado').height( AltoEditorClonado+"px" ).css({ });	//Asignacion en porcentaje
		$('#editor_clonado').width( AnchoEditorClonado+"px" ).css({ });	//Asignacion en porcentaje
		
		//Actualiza el tamano de los editores segun las nuevas dimensiones
		editor.resize();
		try
			{
				EditorClonado.resize();
			}
		catch(error)
			{
				//document.getElementById("demo").innerHTML = err.message;
			}
	}


//##############################################################################
//##############################################################################
/*
	Function: ActualizarTituloEditor
	Cambia el titulo de la ventana de navegador para coincidir con el del archivo editado actualmente
	
    Variables de entrada:

        titulo - Texto que debe asignarse a la ventana

	Salida:
		Titulo de ventana actualizado, que deberia estar visible en barras de tareas del sistema operativo del usuario
*/
function ActualizarTituloEditor(titulo)
	{
		//Cambia el titulo presentado en la ventada del editor
		document.title = titulo;
		$(document).attr('title',titulo);
	}


//##############################################################################
//##############################################################################
/*
	Function: ActualizarBarraEstado
	Actualiza periodicamente la barra de estado inferior del editor con la informacion del archivo

	Salida:
		Actualizacion de marcos con la informacion de la barra de estado
*/
function ActualizarBarraEstado()
	{
	    //Si se desea ocultar las barras de menu y estado presenta una barra simplificada, sino muestra la barra completa
	    if ($("#PCODER_OcultarMenu").val()=="1")
	        {
	            $("#panel_inferior").html("<div align='right' style='margin-top:3px; color:gray; font-size:11px;'><i class='fa fa-info-circle fa-fw text-info'></i> <b>{P}Coder</b> <i>en modo ampliado.  Use <font color=white>Ctrl+B</font> para ver/ocultar herramientas</i></div>");
	        }
	    else
	        {
        		//Actualiza ademas las posiciones del cursor sobre el arreglo de archivos abiertos
        		posicion_cursor=editor.getCursorPosition();
        		LineaActual=posicion_cursor.row;
        		ColumnaActual=posicion_cursor.column;
        
        		//Actualiza la barra de estado del editor
        		var NroLineasDocumento=editor.session.getLength();
        		var NroCaracteresDocumento=editor.session.getValue().length;
        		//Actualiza formulario de envio de archivo por posible almacenamiento de estadisticas
        		$("#PCODER_NroLineasDocumento").val(NroLineasDocumento);
        		$("#PCODER_NroCaracteresDocumento").val(NroCaracteresDocumento);

	            if ($("#PCODER_EstadoSimple").val()!="1" )
                    {
                        $("#panel_inferior").html(ContenidoBarraEstado);
                		//Actualiza los contenedores con la informacion de estado
                		$("#NroLineasDocumento").html("{$MULTILANG_PCODER_Linea}: " + (LineaActual+1) +" / "+NroLineasDocumento);
                		$("#NroColumnaDocumento").html("{$MULTILANG_PCODER_Columna}: "+ (ColumnaActual+1));
                		$("#NroCaracteresDocumento").html("{$MULTILANG_PCODER_Caracteres}: "+NroCaracteresDocumento);
                 		$("#TipoDocumento").html("{$MULTILANG_PCODER_Tipo}: {$PCODER_TipoElemento}");
                 		$("#TamanoDocumento").html("{$MULTILANG_PCODER_Tamano}: <b>{$PCODER_TamanoElemento} Kb</b>");
                 		$("#FechaModificadoDocumento").html("{$MULTILANG_PCODER_Modificado}: <b>{$PCODER_FechaElemento}</b>");
                    }
                else
                    {
                		$("#NroLineasDocumento").html("{$MULTILANG_PCODER_Linea}: " + (LineaActual+1) +"/"+NroLineasDocumento);
                		$("#NroColumnaDocumento").html("{$MULTILANG_PCODER_Columna}: "+ (ColumnaActual+1));
                		$("#NroCaracteresDocumento").html("");
                 		$("#TipoDocumento").html("");
                 		$("#TamanoDocumento").html("");
                 		$("#FechaModificadoDocumento").html("");
                    }
	        }
        
		//Llama periodicamente la rutina de actualizacion de la barra
		window.setTimeout(ActualizarBarraEstado, 1000);
	}

function VerificarSintaxisEditor()
	{
		//Cambia la verificacion de sintaxis del editor
		if (document.getElementById("Check_VerificarSintaxisEditor").value=="1")
			{
				editor.session.setOption("useWorker", false);
				EditorClonado.session.setOption("useWorker", false);
				document.getElementById("Check_VerificarSintaxisEditor").value="0";
				$('#Check_VerificarSintaxisEditor').prop('checked', false);
			}
		else
			{
				editor.session.setOption("useWorker", true);
				EditorClonado.session.setOption("useWorker", true);
				document.getElementById("Check_VerificarSintaxisEditor").value="1";
				$('#Check_VerificarSintaxisEditor').prop('checked', true);
			}
	}


function VerificarAutocompletado()
	{
		//Cambia el autocompletado del editor
		if (document.getElementById("Check_VerificarAutocompletado").value=="1")
			{
				editor.setOptions({enableBasicAutocompletion: false, enableLiveAutocompletion: false});
				EditorClonado.setOptions({enableBasicAutocompletion: false, enableLiveAutocompletion: false});
				//EditorClonado.session.setOption("useWorker", false);
				document.getElementById("Check_VerificarAutocompletado").value="0";
				$('#Check_VerificarAutocompletado').prop('checked', false);
			}
		else
			{
				editor.setOptions({enableBasicAutocompletion: true, enableLiveAutocompletion: true});
				EditorClonado.setOptions({enableBasicAutocompletion: true, enableLiveAutocompletion: true});
				//EditorClonado.session.setOption("useWorker", true);
				document.getElementById("Check_VerificarAutocompletado").value="1";
				$('#Check_VerificarAutocompletado').prop('checked', true);
			}
	}

function AbrirAcercaDe()
    {
        var LMQTP=$('#myModalACERCADEPCODER').modal('show');
        var LMQTP2=$('#myModalACERCADEPCODER').css('z-index', '1500');
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            $(".modal-backdrop").css("filter","invert(0%)");
    }

function AbrirAtajosTeclado()
    {
        var LMQTP=$('#AtajosTeclado').modal('show');
        var LMQTP2=$('#AtajosTeclado').css('z-index', '1500');
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            $(".modal-backdrop").css("filter","invert(0%)");
    }


function AbrirPreferencias()
    {
        var LMQTP=$('#myModalPREFERENCIAS').modal('show');
        var LMQTP2=$('#myModalPREFERENCIAS').css('z-index', '1500');
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            $(".modal-backdrop").css("filter","invert(0%)");
    }


function OperacionFS_CrearArchivo()
	{
		//Presenta el cuadro de dialogo
		$('#myModalOPERARFS').css('z-index', '500');	//Asigna un index inferior a los dialogos emergentes de resultado
		$('#myModalOPERARFS').modal('show');
		
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            $(".modal-backdrop").css("filter","invert(0%)");
	}

function OperacionFS_AbrirArchivo()
	{
		//Presenta el cuadro de dialogo
		$('#myModalABRIRFS').css('z-index', '500');	//Asigna un index inferior a los dialogos emergentes de resultado
		$('#myModalABRIRFS').modal('show');
		
        //Si detecta que se tiene activado el filtro de colores inverso (modo noche) deja el editor en su formato oscuro original revirtiendo el filtro
        if ("{$PCO_TransformacionColores}"=="inverso")
            $(".modal-backdrop").css("filter","invert(0%)");
	}

function OperacionFS_CerrarModalAperturaArchivo()
	{
		//Cierra el cuadro de dialogo
		$('#myModalABRIRFS').modal('hide');
	}