/**
* Propietats globals del site necessàries en els diferents JS.
* @classDescription Propietats globals del site necessàries en els diferents JS.
* @author msalla
* @id seGlobal
* @namespace seGlobal
*/
/**
* Parsing of the request parameters.
*/
function ParseGetVars()
{
    var getVars = [];
    var qString = unescape(window.location.search.substring(0));
    var pairs = qString.split(/\&/);
    for (var i in pairs)
    {
        var nameVal = pairs[i].split(/\=/);
        getVars[nameVal[0]] = nameVal[1];
    }

    return getVars;
}
/**
* Here we create the topWindow global handler if it doesnt exist.
*/
function CreateSeGlobal()
{
    //debugger;
    var lseGlobal = {
        params: ParseGetVars(),
        /**
        * URL del site.
        */
        hostname: window.location.hostname,
        /**
        * URL de origen, si es diferente de undefined y diferente de hostname entonces
        * probablemente estamos embedded en el backoffice.
        */
        sourcehostname: '',
        /**
        * URL de site, si es diferente de undefined contiene el site del backoffice.
        */
        siteUrl: ''
    };
    lseGlobal.sourcehostname = lseGlobal.params.sourcehostname;
    return lseGlobal;
}
try
{
    //We should allways try to use the top window acting as the coordinator.
    if (window.top.document && (window.top != window))
    {
        if ((!window.top.seGlobal) || (window.top.seGlobal === undefined))
        {
            window.top.seGlobal = CreateSeGlobal();
        }
    }
    else
    {
        if ((!window.seGlobal) || (window.seGlobal === undefined))
        {
            var seGlobal = CreateSeGlobal();
        }
    }
}
catch (e)
{
    // Probably an access denied error because of XDS
    if ((!window.seGlobal) || (window.seGlobal === undefined))
    {
        var seGlobal = CreateSeGlobal();
    }
}

var GlobalRefreshManager =
{
    MainTopBarDocument: null,
    LangSelectorId: null,
    imgLanguageId: '',
    imgLanguage: null,

    // Flag para evitar problemas entre el evento de cuando se cambia de lenguaje
    // a cuando se hace por codigo debido al historico :)

    lnkElementId: '',
    lnkElement: null,
    imgBloquedId: '',
    imgBloqued: null,
    imgPublishedStatusId: '',
    imgPublishedStatus: null,
    HeaderStateDocument: null,
    ElementSelector: '',
    ElementSelectorDocument: null,
    BodyFramesetDocument: '',
    ElementSelectorFormJs: null,
    ElementSelectorFormDocument: null,
    ElementSelectorHidAreaId: '',
    ElementSelectorHidCurrentLang: '',
    ElementEditionFormDocument: null,
    ElementEditionFormDocumentWindow: null,
    ElementEditionFormHidElementId: '',
    ElementEditionFormAjaxManagerId: '',
    ElementEditionFormSetDetailsTextFunction: null,
    LoadGridFunction: null,
    CurrentElementId: '',
    BreadCrumbDocument: null,
    BreadCrumbAjaxId: null,
    BreadCrumbHidLangId: '',
    LoadElementEditionFormFunction: null,
    /* Valor del frame para cambiar mostrar o ocultar el arbol */
    ElementSelectorVisualizationFramesetSize: null,
    ElementSelectorVisualizationFrameset: null,
    CurrentRootElementId: "d6261cc6-d0a6-4c14-9d5f-8d8da4dee325",   // Mejor ponerlo asi HARD-CODE
    HistoricElementNavigation: {
        CurrentSelectedPosition: -1,
        MruStack: []
    },
    ElementTypeSelectionDocument: null,
    IsBackOffice: false,    // Para indicar si estamos en BO, el Default pondrá esto a true
    CurrentLanguage: '',
    CurrentSelectedTab: 'General',  /* Ahora se usa el nombre legible para identificar pestañas. Deberíamos usar un nombre interno en caso de que locarizaramos el Bo*/
    CONTENT_TYPE: '',
    DEFINITION_TYPE: '',
    SECURITY_FOLDER: '',
    DESIGNS_FOLDER: '',
    NEW_CATEGORY_TYPE: '',
    FormMaximizedEditorContent: null, // Variable global para "comunicar" htmlEditor maximizado con formulario
    AreaTabManager: null,   // Controla el estado de selección de las pestañas de área (MainTopBar)

    initializeConstants: function(aContentType, aDefinitionType, aSecurityFolder, aDesignsFolder, aNewCategoryType) {
        //debugger;
        GlobalRefreshManager.CONTENT_TYPE = aContentType;
        GlobalRefreshManager.DEFINITION_TYPE = aDefinitionType;
        GlobalRefreshManager.SECURITY_FOLDER = aSecurityFolder;
        GlobalRefreshManager.DESIGNS_FOLDER = aDesignsFolder;
        GlobalRefreshManager.NEW_CATEGORY_TYPE = aNewCategoryType;
    },

    setIframeUrl: function(aIframe, url, onLoad, options) {
        Pb.Utils.setIframeUrl(aIframe, url, onLoad, options);
    },
    setLoadGridFunction: function(aFunction) {
        window.top.GlobalRefreshManager.LoadGridFunction = aFunction;
    },

    setElementEditionFormFunction: function(aFunction) {
        window.top.GlobalRefreshManager.LoadElementEditionFormFunction = aFunction;
    },

    // TODO: Creo que no se usan más
    setElementSelectorFormControlIds: function(aDocument, aHidAreaId, aHidCurrentLang) {
        window.top.GlobalRefreshManager.ElementSelectorFormDocument = aDocument;
        window.top.GlobalRefreshManager.ElementSelectorHidAreaId = aHidAreaId;
        window.top.GlobalRefreshManager.ElementSelectorHidCurrentLang = aHidCurrentLang;
    },

    setElementEditionFormControlIds: function(aDocument, aHidElementId) {
        window.top.GlobalRefreshManager.ElementEditionFormDocument = aDocument;
        window.top.GlobalRefreshManager.ElementEditionFormHidElementId = aHidElementId;
    },

    setHeaderElementControlIds: function(aImgElementId, aLnkElementId) {
        window.top.GlobalRefreshManager.imgElementId = aImgElementId;
        window.top.GlobalRefreshManager.lnkElementId = aLnkElementId;
    },

    setHeaderStateIconIds: function(aImgLanguageId, aImgBloquedId, aImgPublishedStatusId) {
        window.top.GlobalRefreshManager.imgLanguageId = aImgLanguageId;
        window.top.GlobalRefreshManager.imgBloquedId = aImgBloquedId;
        window.top.GlobalRefreshManager.imgPublishedStatusId = aImgPublishedStatusId;
    },

    setHeaderStateDocument: function(arg) {
        //debugger;
        window.top.GlobalRefreshManager.HeaderStateDocument = arg;
    },

    setBodyFramesetDocumentDocument: function(arg) {
        //debugger;
        window.top.GlobalRefreshManager.BodyFramesetDocument = arg;
    },

    setElementSelector: function(aSelector, aSelectorDocument) {
        //debugger;
        window.top.GlobalRefreshManager.ElementSelector = aSelector;
        window.top.GlobalRefreshManager.ElementSelectorDocument = aSelectorDocument;
    },

    setElementSelectorFormJs: function(aSelectorForm) {
        //debugger;
        window.top.GlobalRefreshManager.ElementSelectorFormJs = aSelectorForm;
    },

    setAreaTabManager: function(aAreaTabManager) {
        window.top.GlobalRefreshManager.AreaTabManager = aAreaTabManager;
    },

    _initializeHeaderElements: function() {
        var doc = GlobalRefreshManager.HeaderStateDocument;

        if (doc) {
            try {
                GlobalRefreshManager.imgElement = doc.getElementById(GlobalRefreshManager.imgElementId);
                GlobalRefreshManager.lnkElement = doc.getElementById(GlobalRefreshManager.lnkElementId);
                GlobalRefreshManager.imgLanguage = doc.getElementById(GlobalRefreshManager.imgLanguageId);
                GlobalRefreshManager.imgBloqued = doc.getElementById(GlobalRefreshManager.imgBloquedId);
                GlobalRefreshManager.imgPublishedStatus = doc.getElementById(GlobalRefreshManager.imgPublishedStatusId);
            }
            catch (e) {
                // Si el acesso al documento se nos deniega, invalidamos el documento almacenado.
                GlobalRefreshManager.HeaderStateDocument = null;
            }
        }
    },

    IsAdministrationArea: function() {
        return $get(window.top.GlobalRefreshManager.ElementSelectorHidAreaId, window.top.GlobalRefreshManager.ElementSelectorFormDocument).value == 'Seguridad';
    },

    GoToSecurityArea: function() {
        // La actualización de la información de cuál es el área actual se ha delegado a la función GoToTree()
        //$get(window.top.GlobalRefreshManager.ElementSelectorHidAreaId, window.top.GlobalRefreshManager.ElementSelectorFormDocument).value = 'Seguridad';
        window.top.GlobalRefreshManager.GoToTree(GlobalRefreshManager.SECURITY_FOLDER);
    },

    GoToElementsArea: function() {
        // La actualización de la información de cuál es el área actual se ha delegado a la función GoToTree()
        //$get(window.top.GlobalRefreshManager.ElementSelectorHidAreaId, window.top.GlobalRefreshManager.ElementSelectorFormDocument).value = 'Elementos';
        window.top.GlobalRefreshManager.GoToTree(GlobalRefreshManager.CONTENT_TYPE);
    },

    GoToBreadcrumb: function(aElementId) {
        if (window.top.GlobalRefreshManager.BreadCrumbDocument) {
            window.top.GlobalRefreshManager.BreadCrumbDocument.parentWindow.$find(window.top.GlobalRefreshManager.BreadCrumbAjaxId).ajaxRequest(aElementId);
        }
    },

    GetTreeText: function(aTypeId) {

        if (aTypeId.toLowerCase() == GlobalRefreshManager.CONTENT_TYPE) {
            return "Contenidos";
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.DEFINITION_TYPE) {
            return "Definiciones";
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.NEW_CATEGORY_TYPE) {
            return "Categorias";
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.DESIGNS_FOLDER) {
            return "Diseños";
        }

        // caso especial de seguridad
        if (aTypeId.toLowerCase() == GlobalRefreshManager.SECURITY_FOLDER) {
            return "Seguridad";
        }
    },

    GoToTypeSelector: function(aTypeId) {
        var divIconoVistaHolder = $get('divIconoVistaHolder', window.top.GlobalRefreshManager.ElementTypeSelectionDocument);
        var typeText = $get('typeText', window.top.GlobalRefreshManager.ElementTypeSelectionDocument);
        var typeCell = $get('typeCell', window.top.GlobalRefreshManager.ElementTypeSelectionDocument);
        typeText.innerText = GlobalRefreshManager.GetTreeText(aTypeId);

        if (aTypeId.toLowerCase() == GlobalRefreshManager.CONTENT_TYPE) {
            divIconoVistaHolder.className = 'IconoVistaContentido';
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.DEFINITION_TYPE) {
            divIconoVistaHolder.className = 'IconoVistaDefinicion';
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.NEW_CATEGORY_TYPE) {
            divIconoVistaHolder.className = 'IconoVistaCategoria';
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.DESIGNS_FOLDER) {
            divIconoVistaHolder.className = 'IconoVistaDeseno';
        }

        // caso especial de seguridad
        if (aTypeId.toLowerCase() == GlobalRefreshManager.SECURITY_FOLDER) {
            divIconoVistaHolder.className = 'IconoVistaSeguridad';
            // Hacer invisible la combo y desactivar el onclick
            typeCell.style.backgroundImage = "";
            typeCell.style.cursor = "none";
            typeCell.onclick = null;
            divIconoVistaHolder.onclick = null;
            //window.top.GlobalRefreshManager.
        }
        else {  // Caso general, hacer visible la combo y establecer el onclick
            typeCell.style.backgroundImage = "url(/pb/img/BackOffice/ViewTypeMenu/triangulo.png)";
            typeCell.style.cursor = "pointer";
            typeCell.onclick = function() { window.top.GlobalRefreshManager.ShowDropDownTree(typeCell); };
            // TODO: De momento en el caso general, es posible que también deba estar para seguridad
            divIconoVistaHolder.onclick = function() { window.top.GlobalRefreshManager.GoToTree(aTypeId); };
        }
    },

    GoToElement: function(aElementId) {
        if (aElementId == '')
            return;

        // debugger;
        window.top.GlobalRefreshManager.CurrentElementId = aElementId;

        var lElementEditionFormFrame = $get('ElementEditionFormFrame', window.top.GlobalRefreshManager.BodyFramesetDocument);
        if (lElementEditionFormFrame) {
            // Se está mostrando la pantalla home o home admin
            // NOTA: Se usa string.search en lugar de simplemente == para que sea compatible con ie8, ya que en éste cuando se pide el src devuelve una url absoluta siempre, y la comparación fallaría
            if (lElementEditionFormFrame.src.search(/ElementHome.aspx/i) != -1 || lElementEditionFormFrame.src.search(/AdministrationHome.aspx/i) != -1) {
                lElementEditionFormFrame.src = '../ElementEditionForm.aspx?ElementId=' + aElementId;
            }
            // Ya está el elementEditionForm cargado, hacer la llamada ajax super chula!
            else {
                try {
                    var elementId = $get(window.top.GlobalRefreshManager.ElementEditionFormHidElementId, window.top.GlobalRefreshManager.ElementEditionFormDocument);
                    elementId.value = aElementId;
                    window.top.GlobalRefreshManager.LoadGridFunction();
                    window.top.GlobalRefreshManager.LoadElementEditionFormFunction();
                }
                catch (e) { /* Lo sentimos mucho*/ }
            }

            // Añadir al historico :)
            if (GlobalRefreshManager.HistoricElementNavigation.MruStack.length == 0) {  // Caso primer elemento
                GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition++;
                GlobalRefreshManager.HistoricElementNavigation.MruStack[GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition] =
                    { ElementId: aElementId, RootElementId: GlobalRefreshManager.CurrentRootElementId, Language: GlobalRefreshManager.CurrentLanguage };
            }
            else {
                // Caso normal. Añadir al histórico pero comprobar que el elemento que insertamos no es el actual.
                // Sino comprobamos esto al hacer back volvemos insertar al histórico el elemento al que volvimos atrás
                var currentPositionElement = GlobalRefreshManager.HistoricElementNavigation.MruStack[GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition];
                if ((currentPositionElement.ElementId != aElementId) ||
                    ((currentPositionElement.ElementId == aElementId) &&
                      (currentPositionElement.Language != GlobalRefreshManager.CurrentLanguage)
                    )
                    ) {
                    GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition++;
                    GlobalRefreshManager.HistoricElementNavigation.MruStack[GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition] =
                    { ElementId: aElementId, RootElementId: GlobalRefreshManager.CurrentRootElementId, Language: GlobalRefreshManager.CurrentLanguage };
                }
            }
            // Actualizar Breadcrumb
            window.top.GlobalRefreshManager.GoToBreadcrumb(aElementId);
            // Actualizar selección del árbol
            GlobalRefreshManager.SelectNodeOrRePopulate(aElementId);

            var params = { "aElementId": aElementId };

            $.ajax({
                type: "POST",
                url: "/pb/Services/BackOffice.asmx/GetElementStatusInfo?pbl=" + utils.url.get_PageLang(),
                data: $.compactJSON(params),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(res) {
                    var info = res.d;
                    window.top.document.title = "Portal Builder CMS - " + info.ElementName;
                }
            });
        }
    },

    /* Nos muestra el árbol dependiendo del tipo especificado*/
    GoToTree: function(aTypeId) {
        /*var lElementTypeSelectionFrame = $get('ElementTypeSelectionFrame', window.top.GlobalRefreshManager.BodyFramesetDocument);
        lElementTypeSelectionFrame.src = './ElementTypeSelection.aspx?TypeId=' + aTypeId;*/
        window.top.GlobalRefreshManager.GoToTypeSelector(aTypeId);
        var lElementEditionFormFrame = $get('ElementEditionFormFrame', window.top.GlobalRefreshManager.BodyFramesetDocument);
        // No petar si no está cargado todavía el frame
        if (lElementEditionFormFrame == null) return;

        // Comprobamos si al cambiar de árbol cambiamos también de área (cada árbol pertenece a exactamente un área específica).
        // Si así fuera, actualizamos la información de GlobalRefreshManager.ElementSelectorHidAreaId y seleccionamos la pestaña
        // de área correspondiente.
        // TODO: Quizá habría que replantearse la necesidad o conveniencia de almacenar la información de área en
        //       GlobalRefreshManager.ElementSelectorHidAreaId. Una opción es utilizar el nuevo GlobalRefreshManager.AreaTabManager.
        // TODO: Podríamos tener esta correspondencia árbol<->área mejor codificada y en un único lugar...
        var newTreeArea;
        if (aTypeId.toLowerCase() == GlobalRefreshManager.SECURITY_FOLDER) {
            newTreeArea = "Seguridad";
        }
        else {
            newTreeArea = "Elementos";
        }

        var areaCtrl = $get(window.top.GlobalRefreshManager.ElementSelectorHidAreaId, window.top.GlobalRefreshManager.ElementSelectorFormDocument);
        if (newTreeArea != areaCtrl.value) {
            areaCtrl.value = newTreeArea;

            if (window.top.GlobalRefreshManager.AreaTabManager) {
                window.top.GlobalRefreshManager.AreaTabManager.SelectTabStyle(newTreeArea);
            }
        }

        if (window.top.GlobalRefreshManager.IsAdministrationArea()) {
            lElementEditionFormFrame.src = '../AdministrationHome.aspx';
        }
        else {
            lElementEditionFormFrame.src = '../ElementHome.aspx';
        }

        // window.top.GlobalRefreshManager.CurrentSelectedTab = 'General';

        var rootElementId = $get(window.top.GlobalRefreshManager.ElementSelector.HidRootElementId, window.top.GlobalRefreshManager.ElementSelectorDocument);
        rootElementId.value = aTypeId;

        var AbsoluteRootElementId = $get(window.top.GlobalRefreshManager.ElementSelector.HidAbsoluteRootElementId, window.top.GlobalRefreshManager.ElementSelectorDocument);
        AbsoluteRootElementId.value = aTypeId;

        if (aTypeId.toLowerCase() == GlobalRefreshManager.DEFINITION_TYPE) {  // definiciones
            var showContents = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowContents, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showContents.value = false;
            var showDefinitions = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowDefinitions, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showDefinitions.value = true;
            var showCategories = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowCategories, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showCategories.value = false;
        }
        else if (aTypeId.toLowerCase() == GlobalRefreshManager.NEW_CATEGORY_TYPE) { // Categorias
            var showContents = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowContents, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showContents.value = false;
            var showDefinitions = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowDefinitions, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showDefinitions.value = false;
            var showCategories = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowCategories, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showCategories.value = true;
        }
        else {
            var showContents = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowContents, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showContents.value = true;
            var showDefinitions = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowDefinitions, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showDefinitions.value = false;
            var showCategories = $get(window.top.GlobalRefreshManager.ElementSelector.HidShowCategories, window.top.GlobalRefreshManager.ElementSelectorDocument);
            showCategories.value = false;
        }

        window.top.document.title = "Portal Builder CMS - " +
            GlobalRefreshManager.GetTreeText(aTypeId);

        $.ajax({
            type: "POST",
            url: "/pb/Services/BackOffice.asmx/GetTreeNodeInfo?pbl=" + utils.url.get_PageLang(),
            data: $.compactJSON({ "aElementId": aTypeId }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(res) {
                try {
                    var node = window.top.GlobalRefreshManager.ElementSelector.TreeView.getNodes()[0];
                    node.setText(res.d.Text);
                    node.setImageUrl(res.d.ImageUrl);
                    if (node.getDragDropName() != "") {
                        node.setDragDropName(res.d.DragDropName);
                        node.setDragDropAcceptNames(res.d.DragDropName);
                    }
                    //node.setToolTip(res.d.ToolTip);  // Esta llamada falla no se puede hacer ya que a la siguiente carga del árbol da una excepción...
                }
                catch (ex) { /* En determinados lugares da un error pero continúa correctamente*/ }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) { alert($.evalJSON(XMLHttpRequest.responseText).Message); }
        });

        window.top.GlobalRefreshManager.ElementSelector.TreeView.getNodes()[0].setValue(aTypeId);
        window.top.GlobalRefreshManager.ElementSelector.Refresh();
        window.top.GlobalRefreshManager.GoToBreadcrumb(aTypeId);

        MainFormManager.closeDiv();

        GlobalRefreshManager.CurrentRootElementId = aTypeId;
    },

    GoToTreeAndElement: function(aTypeId, aElementId) {
        window.top.GlobalRefreshManager.GoToTree(aTypeId);
        window.top.GlobalRefreshManager.FindAndGoToElement(aElementId);
    },
    // TODO: Refactorizar para extraer pasando el id del Contenido :)
    ReloadFormTabGeneral: function() {
        window.top.GlobalRefreshManager.CurrentSelectedTab = 'form';    // ?!?!
        var lElementEditionFormFrame = $get('ElementEditionFormFrame', window.top.GlobalRefreshManager.BodyFramesetDocument);

        if (lElementEditionFormFrame)
            lElementEditionFormFrame.src = lElementEditionFormFrame.src;
    },

    InvokeWizardNewElement: function(aUrl, aParentId, aOnClose) {
        // IMPORTANTE PASAR EL IDIOMA!!!!!
        var oWnd = TLK.ShowCenteredWindow('/' + utils.url.get_PageLang() + aUrl, "radWizard", 640, 525);
        oWnd.argument = aParentId;
        oWnd.set_status('Cargando...');

        if (typeof aOnClose != "undefined") {
            oWnd.add_close(aOnClose);
        }
    },

    InvokeWizardRenameElement: function(aUrl) {
        var oWnd = TLK.ShowCenteredWindow('/' + utils.url.get_PageLang() + aUrl, "radWizard", 600, 270);
        oWnd.set_title('Renombrar');
        oWnd.set_status('Cargando...');
    },

    InvokeContextMenu: function() {

        // solo responder al controlid del sitetree
        if (arguments[0] == "elsContents") {
            //alert("OnContextMenu:" + arguments[0]);
            var ajaxManager = $find("RadAjaxManager1");
            // ClientId , node.getValue(), tempX, tempY, this, lAbsoluteRootElementId, lRootElementId);

            ajaxManager.ajaxRequest("OnContextMenu" + "," + arguments[0] + "," + arguments[1] + "," + arguments[2] + "," + arguments[3] + "," + arguments[4] + "," + arguments[5] + "," + arguments[6]);

            // alert(arguments[4]);
            // el objeto del arbol
            elsObject = arguments[4];
        }

    },

    ClearHistoricNavigation: function() {
        GlobalRefreshManager.HistoricElementNavigation = {
            CurrentSelectedPosition: -1,
            MruStack: []
        };
    },

    InvokeElementBack: function(aSource) {
        if (GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition > 0) {
            GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition--;
            GlobalRefreshManager.GoToHistoryPosition(GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition);
        }
    },

    InvokeElementForward: function(aSource) {
        if (GlobalRefreshManager.HistoricElementNavigation.MruStack[GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition + 1] != undefined) {
            GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition++;
            GlobalRefreshManager.GoToHistoryPosition(GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition);
        }
    },

    // Elimina del histórico de navegación los ítems que correspondan a uno o más elementos eliminados.
    InvalidateHistoryNavigationElements: function(aElementIds) {
        var stack = GlobalRefreshManager.HistoricElementNavigation.MruStack;
        var currentSelectedPosition = GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition;

        var position = 0;
        do {
            var element = stack[position];

            if ((element != null) &&
                (Array.contains(aElementIds, element.ElementId)) &&
                (element.RootElementId == GlobalRefreshManager.CurrentRootElementId) &&
                (element.Language == GlobalRefreshManager.CurrentLanguage)) {

                stack.splice(position, 1);
                if (currentSelectedPosition >= position) {
                    currentSelectedPosition--;
                }
            }
            else {
                position++;
            }
        } while (stack[position] != null);

        // Corregimos la posición en la navegación si se han eliminado elementos "del pasado"
        GlobalRefreshManager.HistoricElementNavigation.CurrentSelectedPosition = currentSelectedPosition;
    },

    GoToHistoryPosition: function(aPosition) {
        var lCurrent = GlobalRefreshManager.HistoricElementNavigation.MruStack[aPosition];

        if (GlobalRefreshManager.CurrentLanguage != lCurrent.Language) {
            // Modificamos el lenguaje actual, esto no nos lanza el evento de onchange :(            
            $('#' + GlobalRefreshManager.LangSelectorId, GlobalRefreshManager.MainTopBarDocument).selectOptions(lCurrent.Language, true);

            GlobalRefreshManager.SetLanguage(lCurrent.Language);

            GlobalRefreshManager.GoToTreeAndElement(lCurrent.RootElementId,
                lCurrent.ElementId);
        }
        else {
            if (GlobalRefreshManager.CurrentRootElementId != lCurrent.RootElementId) {
                GlobalRefreshManager.GoToTree(lCurrent.RootElementId);
            }

            if (GlobalRefreshManager.CurrentElementId != lCurrent.ElementId) {
                GlobalRefreshManager.GoToElementAndSelectNodeOrRePopulate(lCurrent.ElementId);
            }
        }
    },

    GoToElementAndSelectNodeOrRePopulate: function(aElementId) {
        var node = GlobalRefreshManager.ElementSelector.TreeView.findByValue(aElementId);

        if (node == null) { // El nodo no está cargado. Postback para recargar el árbol
            GlobalRefreshManager.FindAndGoToElement(aElementId);
        }
        else { // El nodo ya está cargado. No hace falta postback
            GlobalRefreshManager.SelectAndExpandHiddenLoadedNode(node);
        }
    },

    /* Selecciona el nodo y si no está cargado, hace un postback para cargar el nodo y luego seleccionarlo*/
    SelectNodeOrRePopulate: function(aElementId) {
        var node = GlobalRefreshManager.ElementSelector.TreeView.findByValue(aElementId);
        if (node == null) { // El nodo no está cargado. Postback para recargar el árbol
            GlobalRefreshManager.ElementSelectorFormJs.DisplayHiddenNode(aElementId);
        }
        else { // El nodo ya está cargado. No hace falta postback
            GlobalRefreshManager.SelectAndExpandHiddenLoadedNode(node);
        }
    },
    /* Selecciona un nodo que está cargado pero escondido, y expande todos sus padres para que sea visible*/
    SelectAndExpandHiddenLoadedNode: function(aNode) {
        aNode.select();

        // Sin embargo puede ser que el nodo esté oculto. Desplegar sus padres hasta que sea visible
        var parentNode = aNode.getParent();

        while (parentNode != null) {
            parentNode.expand();
            parentNode = parentNode.getParent();
        }
    },

    ShowDropDownTree: function(aSource) {
        var divMenu = document.getElementById('MainFormTreeviewElementTypeDropDownContainer');
        if (divMenu) {
            divMenu.style.visibility = 'visible';
            if (aSource) {

                /* modificado para el new combo
                var lWidth = aSource.offsetWidth + 2;
                divMenu.style.width = lWidth + 'px';
                */

                var lWidth = aSource.offsetWidth + 63;
                divMenu.style.width = lWidth + 'px';
            }
        }
    },

    // TODO: Mover cuando solo haya un frameset (mierda puta de frameset de administracion)
    BuildButtonTree: function(aButton, aIsTreeExpanded) {
        if (aIsTreeExpanded) {
            aButton.src = '/pb/img/backoffice/navigation/HideTreePanel.png';
            aButton.title = 'Esconder árbol';
        }
        else {
            aButton.src = '/pb/img/backoffice/navigation/ShowTreePanel.png';
            aButton.title = 'Mostrar árbol';
        }
    },

    ShowTree: function() {
        if (GlobalRefreshManager.ElementSelectorVisualizationFramesetSize) {
            GlobalRefreshManager.ElementSelectorVisualizationFrameset.cols = GlobalRefreshManager.ElementSelectorVisualizationFramesetSize;
        }
    },

    HideTree: function() {
        if (GlobalRefreshManager.ElementSelectorVisualizationFramesetSize) {
            GlobalRefreshManager.ElementSelectorVisualizationFrameset.cols = "0, *";
        }
    },

    ProgressLoaderShow: function() {
        var lStyle = window.top.document.getElementById("progressLayer").style;
        lStyle.display = "block";
        lStyle.visibility = "visible";
        var isIE = window.ActiveXObject ? true : false;
        if (isIE) {
            lStyle.zindex = 1010;
        }
        else {
            lStyle.zindex = -1010;
        }
    },

    ProgressLoaderHide: function() {
        var lStyle = window.top.document.getElementById("progressLayer").style;
        lStyle.visibility = "hidden";
        lStyle.display = "none";
        lStyle.zindex = 0;
    },

    RefreshElementHeader: function(info) {
        if (window.top.GlobalRefreshManager) {
            GlobalRefreshManager._initializeHeaderElements();

            //debugger;

            if (GlobalRefreshManager.imgElement) {
                GlobalRefreshManager.imgElement.src = info.ElementIconUrl + "?mw=26&mh=21";
            }
            if (GlobalRefreshManager.lnkElement) {
                GlobalRefreshManager.lnkElement.innerText = info.ElementName;
                window.top.GlobalRefreshManager.ElementEditionFormSetDetailsTextFunction(info.ElementName);
            }

            var VISIBLE = 'inline';
            var NOT_VISIBLE = 'none';

            if (GlobalRefreshManager.imgLanguage && info.LanguageImageUrl) {
                GlobalRefreshManager.imgLanguage.src = info.LanguageImageUrl;
                GlobalRefreshManager.imgLanguage.alt = info.LanguageAltText;
                GlobalRefreshManager.imgLanguage.style.display = VISIBLE;
            }
            else {
                GlobalRefreshManager.imgLanguage.style.display = NOT_VISIBLE;
            }

            if (GlobalRefreshManager.imgBloqued && info.LockedImageUrl) {
                GlobalRefreshManager.imgBloqued.src = info.LockedImageUrl;
                GlobalRefreshManager.imgBloqued.alt = info.LockedAltText;
                GlobalRefreshManager.imgBloqued.style.display = VISIBLE;
            }
            else {
                GlobalRefreshManager.imgBloqued.style.display = NOT_VISIBLE;
            }

            if (GlobalRefreshManager.imgPublishedStatus && info.PublishedImageUrl) {
                GlobalRefreshManager.imgPublishedStatus.src = info.PublishedImageUrl;
                GlobalRefreshManager.imgPublishedStatus.alt = info.PublishedAltText;
                GlobalRefreshManager.imgPublishedStatus.style.display = VISIBLE;
            }
            else {
                GlobalRefreshManager.imgPublishedStatus.style.display = NOT_VISIBLE;
            }

        }
    },

    FindAndGoToElement: function(aElementId, aElementParentId) {
        GlobalRefreshManager.GoToElement(aElementId);
        GlobalRefreshManager.ElementSelectorFormJs.DisplayHiddenNode(aElementId);
    },


    SetLanguage: function(aLanguage) {
        GlobalRefreshManager.CurrentLanguage = aLanguage;

        // Necesitamos pasarle el lang al elementSelectorForm, porque se recostruye haciendo postback
        // (sino habría que cambiar todo el árbol para que se contruya mediante llamadas a WebMethods)
        GlobalRefreshManager.ElementSelectorFormDocument.getElementById(
                GlobalRefreshManager.ElementSelectorHidCurrentLang).value = aLanguage;

        // Similar al tratamiento anterior con el BreadCrumb
        GlobalRefreshManager.BreadCrumbDocument.getElementById(
                GlobalRefreshManager.BreadCrumbHidLangId).value = aLanguage;
    },

    RefreshManyElementsStatusIcons: function(aElementIds) {
        if (window.top.GlobalRefreshManager) {
            if (!GlobalRefreshManager.ElementSelector || GlobalRefreshManager.ElementSelector === '') {
                return;
            }

            var params = { "aElementIds": aElementIds };

            $.ajax({
                type: "POST",
                url: "/pb/Services/BackOffice.asmx/GetManyElementsStatusInfo?pbl=" + utils.url.get_PageLang(),
                data: $.compactJSON(params),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(res) {
                    var info = res.d;
                    var i;

                    for (i = 0; i < info.length; i++) {
                        var node = GlobalRefreshManager.ElementSelector.TreeView.findByValue(aElementIds[i]);

                        if (node) {
                            // No se sabe por qué razón, parece no funcionar bien lo habitual:  node.setText(info[i].ElementNodeText);
                            node.getElement().innerHTML = info[i].ElementNodeText;
                        }
                    }
                }
            });
        }
    },

    RefreshElementStatus: function(aElementId, reloadTreeIfFilterSet, refreshChildren, aElementSelectedId) {
        if (window.top.GlobalRefreshManager) {
            GlobalRefreshManager._initializeHeaderElements();

            var params = { "aElementId": aElementId };

            window.top.GlobalRefreshManager.GoToBreadcrumb(aElementId);

            $.ajax({
                type: "POST",
                url: "/pb/Services/BackOffice.asmx/GetElementStatusInfo?pbl=" + utils.url.get_PageLang(),
                data: $.compactJSON(params),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(res) {
                    var info = res.d;

                    try {

                        // Si se quiere actualizar los hijos de un nodo, seguramente es debido a un cambio en
                        // el su orden o en su número. En este caso no nos interesará actualizar la cabecera.
                        if (!refreshChildren) {
                            GlobalRefreshManager.RefreshElementHeader(info);
                        }
                    }
                    // Hay casos particulares en que se nos deniega el acesso a los elementos. Es el caso
                    // de cuando creamos un contenido localizado desde la pantalla ContentWizardLauncher.

                    // MSM. No lo he mirado pero por el comentario parece que debe de ser un tema del host
                    // con que se ha hecho la petición que no coincide y por eso da acceso denegado por XSS.
                    catch (e) {
                    }
                    if (!GlobalRefreshManager.ElementSelector || GlobalRefreshManager.ElementSelector === '') {
                        return;
                    }


                    // Se pone este try-catch para evitar un error muy difícil de reproducir
                    // de "cannot execute code from a freed script"
                    try {
                    
                        // Cuando se modifica el nombre del nodo y hay un filtro puesto, debemos recargar el árbol
                        // ya que el elemento puede que ya no cumpla con el filtro. Posible mejora: comprobar aquí si
                        // el nuevo nombre ya no cumple con el filtro (con una regular expression?) y en este caso borrarlo .

                        if (reloadTreeIfFilterSet && GlobalRefreshManager.ElementSelector.IsFilterSet()) {
                            GlobalRefreshManager.ElementSelector.Refresh();
                        }
                        else {
                            var node = GlobalRefreshManager.ElementSelector.TreeView.findByValue(aElementId);

                            if (node) {
                                node.setText(info.ElementNodeText);
                                if (info.ElementIconUrl) {
                                    node.setImageUrl(info.ElementIconUrl + "?mw=26&mh=21&pw=true&ph=true");
                                }

                                //debugger;
                                if (refreshChildren) {
                                    if (aElementSelectedId) {
                                        GlobalRefreshManager.ElementSelector.JustCreatedNodeValue = aElementSelectedId;
                                    }

                                    node.setPopulateNodesOnDemand(true);
                                    node.clearChildNodes();
                                    node.collapse();
                                    node.expand();
                                }
                            }
                        }
                    } catch (e) { }
                }
            });
        }
    }
};
 
