﻿// Hack para que en FF y Geko based browsers tengamos activeElement
function onElementFocused(e) {
    if (e && e.target)
        document.activeElement =
        e.target == document ? null : e.target;
}

if (document.addEventListener)
    document.addEventListener("focus", onElementFocused, true);
    
function CmsBasePageEIP(aCmsDataMappingList, aContentVersionList, aTraceErrorList, aTextDataTypeId, aHtmlDataTypeId, aMultilineTextTypeId, aIsOnlineRequest, aMainContentId, aBackofficeUrl, aInitTime) {
    this.CmsDataMappingList = aCmsDataMappingList;
    this.ContentVersionList = aContentVersionList;
    this.TraceErrorList = aTraceErrorList;
    this.TextDataTypeId = aTextDataTypeId;
    this.HtmlDataTypeId = aHtmlDataTypeId;
    this.MultilineTextTypeId = aMultilineTextTypeId;
    this.IsOnlineRequest = aIsOnlineRequest;
    this.MainContentId = aMainContentId;
    this.BackofficeUrl = aBackofficeUrl;
    this.FocusedElement = null;
    this.OnKeyPressEventHandler = null;

    this.CtxMenuId = null;
    this.CtxMenuEnabled = false;
    this.NavigationEnabled = false;

    // para poder llamarnos desde los manejadores de eventos de control
    var self = this;

    // Controlar navegación de enlaces
    //    $(document).rightMouseDown(function(evt) {
    //        self.NavigationEnabled = true;
    //        self.ShowBackMsg("Navegación de enlaces activada.");
    //        return false;
    //    });
    //    $(document).rightMouseUp(function(evt) {
    //        self.NavigationEnabled = false;
    //        self.ShowBackMsg("Navegación de enlaces desactivada.");
    //        return false;
    //    });

    // delegado para mostrar mesajes en segundo plano
    // implementacion por defecto para que sea sobrescrita por el js de EIPUpperBar
    this.OnShowBackgroundMessage = function(aMessage) {
        $(".EIPBackgroundProgressInfo").hide().remove();
        var lDiv = $("<div class='EIPBackgroundProgressInfo RibbonNotification'>" + aMessage + "</div>").appendTo($("body")).maxZIndex();
        lDiv.fadeIn(1000, function() { lDiv.fadeOut(3000); });
    };

    this.OnSave = function() { };

    // suscribirnos a los eventos de teclado para negrita, subrayado, etc.
    $(document).bind('keydown', 'Ctrl+n',
            function(e) { return self.HtmlEditBoldHandler(e, self); }
        );
    $(document).bind('keydown', 'Ctrl+k',
            function(e) { return self.HtmlEditItalicHandler(e, self); }
        );
    $(document).bind('keydown', 'Ctrl+s',
            function(e) { return self.HtmlEditUnderlineHandler(e, self); }
        );

    $(document).bind('keydown', 'Return',
            function(e) { return self.HtmlEditCancelEnterHandler(e, self); }
        );

    $(document).bind('keydown', 'Shift+Return',
            function(e) { return self.HtmlEditCancelShiftEnterHandler(e, self); }
        );

    $(document).bind('keydown', 'Ctrl+Return',
            function(e) { return self.HtmlEditCancelCtrlEnterHandler(e, self); }
        );

    this.InitTime = aInitTime;
    this.EnableEIP(true);
    this.BuildErrorTraceList();
}

CmsBasePageEIP.prototype.EnableEIP = function(aIsEnabled) {
    var self = this;
    // suscribirnos al onmouseover de los controles mapeados
    $.each(this.CmsDataMappingList, function(i, val) {
        //var lCtrlElem = $get(val.TargetControlClientId);
        var lCtrlElem = self.GetEffectiveDomElement(val);
        var lCtrl = $(lCtrlElem);

        if (!(lCtrlElem)) {
            return;
        }

        lCtrl.unbind("mouseover");
        lCtrl.unbind("focus");
        lCtrl.keydown(function(event) {
            switch (event.keyCode) {
                case 37: event.stopPropagation(); break;
                case 38: event.stopPropagation(); break;
                case 39: event.stopPropagation(); break;
                case 40: event.stopPropagation(); break;
            }
        });

        if (!aIsEnabled) {
            lCtrl.unbind("mouseout");
            lCtrl.unbind("blur");
            lCtrl.unbind("click");
            lCtrlElem.contentEditable = 'false';
        } else {
            // resaltar el control al hover
            lCtrl.mouseover(
            function(e) {
                self.ControlMouseOver(self, e, lCtrlElem, val);
            });

            /* Cuando queremos ocultar todas las capas de over de eip, Esc, y a no romper las pelotas */
            $(document).bind('keydown', 'Esc', function(e) {
                if (self.FocusedElement == null)
                    self.DownliteAll();
            });

            /* Christian: 18-12-09: Por n-esima vez pasa que por un tema de maquetación
            hacemos over, y cuando intentamos tocar las opciones de la propiedad se nos oculta la capa.
            Comentando nos aseguramos de que esto no pase nunca. Fue comentado con web y fue aceptado*/

            lCtrl.mouseout(
            function(e) {

                if (
                self.CtxMenuEnabled
                ||
                self.isDescendant($get(lCtrlElem.id + "_EIP_Toolbar"), e.toElement)
                ) {
                    return;
                }
                var twPos = lCtrl.offset();
                var lMouseCoords = Pb.Utils.getPageEventCoords(e);

                // MSM. Tolerancia en píxels
                var lTolerance = 1;
                var isInLayoutTemplateRegion = (
                    ((twPos.left - lTolerance) <= lMouseCoords.left)
                    && (lMouseCoords.left <= (twPos.left + lCtrl.width() + lTolerance))
                    && ((twPos.top - lTolerance) <= lMouseCoords.top)
                    && (lMouseCoords.top <= (twPos.top + lCtrl.height() + lTolerance))
                    );
                if (lMouseCoords.left > 0 && lMouseCoords.top > 0 && (!isInLayoutTemplateRegion)) {
                    self.DownliteAll();
                }
            });

            // mientras tengamos foco no queremos que salte la capa amarilla
            // MSM: Cuando coge el foco empezamos a editar
            lCtrl.focus(
            function(e) {
                self.DownliteAll(lCtrlElem);
                if (this.contentEditable != 'true') {
                    return;
                }
                self.FocusedElement = this;

                self.CreateEditionToolbar(this, val, val.SourcePropertyTypeId == self.HtmlDataTypeId);

                // capturar esc, siempre
                $(document).bind('keydown', 'Esc', function(e) {
                    self.HtmlEditEscHandler(e, val, lCtrlElem);
                });
                lCtrl.unbind("mouseover");
            });

            // editable
            if (val.IsInlineEditable && val.IsDefaultProperty) {
                lCtrlElem.contentEditable = 'true';

                if (lCtrlElem.innerHTML == '')
                    lCtrlElem.style.minWidth = "10px";

                // guardar valor original del control
                val.origValue = lCtrlElem.innerHTML;

                var lOnBlur = function(e) {
                    // Si en realidad se pierde el foco por editar una propiedad de un control
                    // que está dentro del control actual (editando un html avanzado no lo tratamos)
                    if (self.isDescendant(lCtrlElem, document.activeElement)) {
                        $(document.activeElement).unbind('blur');
                        $(document.activeElement).blur(Function.createDelegate(lCtrlElem, lOnBlur));
                        return;
                    }
                    self.FocusedElement = null;
                    self.DestroyEditionToolbar();

                    // si ha cambiado, preguntar si guardar el valor
                    // hay que quitar las cositas del jQuery del valor antes de comparar
                    // \\sjquery[0-9]*=\"[^\"]*\"
                    var reJQuery = new RegExp("\\sjquery[0-9]*\\=\"[0-9]*\"", "gi");
                    var lInnerHTML = lCtrlElem.innerHTML.replace(reJQuery, "");

                    if (lInnerHTML != val.origValue
                        && !(val.saveError)
                    //&& confirm('¿Aplicar cambios?')
                    ) {
                        // guardar
                        self.save(val, lInnerHTML);
                    }
                    else {
                        // Restaurar label
                        if (!val.saveError) {
                            lCtrlElem.innerHTML = val.origValue;
                        }
                    }

                    // volver a suscribirnos al mouseover
                    lCtrl.mouseover(
                    function(e) {
                        //return self.HiliteControl(this, val, e);
                        self.ControlMouseOver(self, e, this, val);
                    });
                }
                // al perder el foco...
                lCtrl.blur(lOnBlur);
            } else if (val.IsDefaultProperty && val.IsGuid) {
                //debugger;
                lCtrl.css("cursor", "pointer");
                lCtrl.click(function(e) {
                    //if (e.altKey) {
                    if (self.NavigationEnabled) {
                        return; // nada de nada, respetar el click
                    }
                    //alert('mostrar elementselector y modificar src');
                    TLK.OpenModalWindow("/" + utils.url.get_PageLang() + "/pb/forms/Details/RelationsSelector.aspx?GUID=" + val.GuidValue, function(radWindow, returnValue) {
                        if (returnValue) {
                            // cambiarlo y guardar
                            lCtrlElem.src = returnValue;
                            self.save(val, returnValue);
                        }
                        radWindow.close();
                    });
                    e.stopPropagation();
                    e.preventDefault();
                    return false;
                });
            }
        }
    });

    if (!aIsEnabled) {
        // desactivamos todos los marcos
        $("div.EIPHiliteMarco").remove();
        $("div.EIPToolBarRowWrap").remove();
        $("div.EIPHiliteCapaGris").remove();
    }
};

//MSM. Aquí el primer parámetro es guanero pq se puede crear un delegado en la llamada
//a la función y usar this en lugar de self dentro del método
CmsBasePageEIP.prototype.ControlMouseOver = function(self, e, ctrl, val) {
    //if (e.altKey) {
    if (self.NavigationEnabled) {
        ctrl.contentEditable = 'false';
    } else {
        if (self.CtxMenuEnabled) return;

        if (val.IsInlineEditable && val.IsDefaultProperty) {
            ctrl.contentEditable = 'true';
        }
        
        // Si ya estamos editando este contenido no le poenmos de nuevo la edición
        var lCurrentHighLitedElement = $(document).data("CurrentHighLitedElement");
        if (lCurrentHighLitedElement && lCurrentHighLitedElement == ctrl) {
            return;
        }
        // Si estamos editando y el control editado es diferentre del del mouseOver
        if (lCurrentHighLitedElement && lCurrentHighLitedElement != ctrl) {
            // Si vamos a recuadrar uno de dentro del actual y no estamos editando le quitamos el foco al actual
            if (self.isDescendant(lCurrentHighLitedElement, ctrl) && !self.FocusedElement) {
                $(ctrl).blur();
            }
            // Si ya estamos recuadrando uno de dentro del actual no le quitamos la edición
            if (self.isDescendant(ctrl, lCurrentHighLitedElement)) {

                var lCtrl = $(lCurrentHighLitedElement);
                var twPos = lCtrl.offset();
                var lMouseCoords = Pb.Utils.getPageEventCoords(e);

                // MSM. Tolerancia en píxels
                var lTolerance = 1;
                var isInLayoutTemplateRegion = (
                        ((twPos.left - lTolerance) <= lMouseCoords.left)
                        && (lMouseCoords.left <= (twPos.left + lCtrl.width() + lTolerance))
                        && ((twPos.top - lTolerance) <= lMouseCoords.top)
                        && (lMouseCoords.top <= (twPos.top + lCtrl.height() + lTolerance))
                        );
                if (lMouseCoords.left > 0 && lMouseCoords.top > 0 && (isInLayoutTemplateRegion)) {
                    return;
                }
            }
        }

        // mientras estemos editando uno, que no se resalten el resto
        if (!self.FocusedElement) {
            self.DownliteAll(ctrl);
            self.HiliteControl(ctrl, val, e);
        }

        //        Se ha comentado esto para evitar que se cancele el despliegue de los menús de telerik.
        //        e.stopPropagation();
        //        e.preventDefault();
        //        return false;
    }
};

CmsBasePageEIP.prototype.GetEffectiveDomElement = function(mapping) {
    return $get(mapping.TargetControlClientId);
};

CmsBasePageEIP.prototype.DestroyEditionToolbar = function() {
    // destruir toolbar de Edicion
    $(".EIPEditionToolBar").remove();
};

CmsBasePageEIP.prototype.CreateEditionToolbar = function(source, mapping, enableHtml) {
    var ofs = $(source).offset();
    var self = this;

    this.DestroyEditionToolbar();

    // si no ha de ser HTML, no va a haber botones por lo que carece de sentido
    if (!enableHtml) { return; }

    var lDivId = source.id + '_EditionToolbar';
    $("<div class='EIPEditionToolBar' id='" + lDivId + "'></div>").appendTo($("body"));
    var lDivToolbar = $get(lDivId);

    // celda intermedia a modo de separador
    var lButtonsHtml = "<div class='Actions'>";

    // ids de todos los botones
    var lBoldId = lDivId + '_Bold';
    var lItalicId = lDivId + '_Italic';
    var lUnderlineId = lDivId + '_Underline';
    var lLinkId = lDivId + '_Link';
    var lLinkContentId = lDivId + '_LinkContent';
    var lSaveId = lDivId + '_Save';
    var lCancelId = lDivId + '_Cancel';
    var lEditorId = lDivId + '_Editor';

    if (enableHtml) {
        // Agregamos el popup del editor
        lButtonsHtml += "<a title='\"Editor avanzado para la propiedad: '" + mapping.EffectiveName + "\"' unselectable='on' id='" + lEditorId + "' class=\"divMain\"><img class='imgBtnRibbon' src='/pb/img/Backoffice/Editinplace/bolaPequeLapizEip.gif' alt='Editor avanzado para la propiedad \"" + mapping.EffectiveName + "\"' unselectable='on'/><img src='/pb/img/eiptoolbar/Edit.png' style='position:absolute; left:9px; top:7px' unselectable='on' id='imgRibbonInnerImg'  alt='Editor avanzado para la propiedad \"" + mapping.EffectiveName + "\"' width=\"20px\" /></a>";
        ////        lButtonsHtml += "<a class='EIPBoton' title=\"Editor avanzado para la propiedad: '" + mapping.EffectiveName + "'\" unselectable='on' id='" + lEditorId + "'><img src='/pb/img/eiptoolbar/Edit.png' unselectable='on'/></a>";
        lButtonsHtml += "<div class='divEditOptions'>";
        lButtonsHtml += "<img class='EIPBoton_separador' src='/pb/img/backoffice/toolbarseparator.png'/>";
        //        // Agregamos botones de estilo de fuente
        lButtonsHtml += "<a class='EIPBoton UpperToolbarButton' title='Negrita' unselectable='on' id='" + lBoldId + "'><img src='/pb/img/EIPToolbar/Negrita.png'/ unselectable='on'/></a>";
        lButtonsHtml += "<a class='EIPBoton UpperToolbarButton' title='Cursiva' unselectable='on' id='" + lItalicId + "'><img src='/pb/img/EIPToolbar/Kursiva.png'/ unselectable='on'/></a>";
        lButtonsHtml += "<a class='EIPBoton UpperToolbarButton' title='Subrayado' unselectable='on' id='" + lUnderlineId + "'><img src='/pb/img/EIPToolbar/Subrayado.png' unselectable='on'/></a>";
        lButtonsHtml += "</div>";
        //lButtonsHtml += "<a class='EIPBoton' title='Enlace URL' unselectable='on' id='" + lLinkId + "'><img src='/pb/img/EIPToolbar/botonEnlaceHTML.png' unselectable='on'/></a>";
        //lButtonsHtml += "<a class='EIPBoton' title='Enlace a Contenido' unselectable='on' id='" + lLinkContentId + "'><img src='/pb/Controls/BackOffice/Edition/PropertyEditors/HtmlEditor08/CmsLink.gif' unselectable='on'/></a>";
        //lButtonsHtml += "</td>";
    }

    //lButtonsHtml += "<div style='float:right;'>";
    //lButtonsHtml += "<a class='EIPBoton' id='" + lSaveId + "' unselectable='on'><img src='/pb/img/EIPToolbar/Guardar.png' title='Guardar' alt='Guardar' unselectable='on'/></a>";
    //lButtonsHtml += "<a class='EIPBoton' id='" + lCancelId + "' unselectable='on'><img src='/pb/img/Common/DataEditing/Undo.gif' title='Cancelar' alt='Cancelar' unselectable='on'/></a>";
    //lButtonsHtml += "</div>";
    lButtonsHtml += "</div>";




    $(lButtonsHtml).appendTo($(lDivToolbar));

    $(lDivToolbar).find('.imgBtnRibbon').hover(
        function() {
            $(this).attr('src', '/pb/img/Backoffice/Editinplace/bolaPequeLapizEipSel.gif');
        },
            function() {
                $(this).attr('src', '/pb/img/Backoffice/Editinplace/bolaPequeLapizEip.gif');
            }
    );

    $(lDivToolbar).find('#imgRibbonInnerImg').hover(
        function() {
            $(lDivToolbar).find('.imgBtnRibbon').attr('src', '/pb/img/Backoffice/Editinplace/bolaPequeLapizEipSel.gif');
        },
        function() {
            $(lDivToolbar).find('.imgBtnRibbon').attr('src', '/pb/img/Backoffice/Editinplace/bolaPequeLapizEip.gif');
        }
    );

    $('#' + lSaveId).click(function(e) {
        self.save(mapping, source.innerHTML);
    });
    $('#' + lCancelId).click(function(e) {
        source.innerHTML = mapping.origValue;
    });
    $('#' + lBoldId).click(function(e) { return self.HtmlEditBoldHandler(e, self); });
    $('#' + lItalicId).click(function(e) { return self.HtmlEditItalicHandler(e, self); });
    $('#' + lUnderlineId).click(function(e) { return self.HtmlEditUnderlineHandler(e, self); });
    $('#' + lLinkId).click(function(e) { self.OpenHTMLLinkDialog(mapping.FinalBranchId, mapping.FinalContentRowId, mapping.FinalSourceProperty); });
    $('#' + lLinkContentId).click(function(e) { self.OpenContentLinkDialog(mapping.FinalBranchId, mapping.FinalContentRowId, mapping.FinalSourceProperty); });
    // Agregamos le popup del editor
    $('#' + lEditorId).click(function(e) { self.DestroyEditionToolbar(); self.OpenPropertyEditorDialog(mapping.FinalBranchId, mapping.FinalContentRowId, mapping.FinalSourceProperty, mapping.SourcePropertyTypeId, mapping); });

    var lMinWidth = enableHtml ? 100 : 40;
    var lSourceWidth = $(source).outerWidth();
    var lDivWidth = lMinWidth > lSourceWidth ? lMinWidth : lSourceWidth;
    $(lDivToolbar).width(lDivWidth);
    $(lDivToolbar).css("display", "");
    $(lDivToolbar).css("position", "absolute");
    $(lDivToolbar).css("left", ofs.left);
    $(lDivToolbar).css("top", ofs.top - $(lDivToolbar).outerHeight());
    $("<div class=\"EditionToolbarFin\">&nbsp;</div>").appendTo($(".EIPEditionToolBar"));
    $("<div class=\"EditionToolbarInicio\">&nbsp;</div>").prependTo($(".EIPEditionToolBar"));
};

CmsBasePageEIP.prototype.HtmlEditBoldHandler = function(e, self) {
    var lCtrlElem = self.FocusedElement;
    var lMapping = self.getMappingFromElement(lCtrlElem);
    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
        document.execCommand("Bold", false, null);
    }
    e.stopPropagation();
    e.preventDefault();
    return false;
};
CmsBasePageEIP.prototype.HtmlEditItalicHandler = function(e, self) {
    var lCtrlElem = self.FocusedElement;
    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
        document.execCommand("Italic", false, null);
    }
    e.stopPropagation();
    e.preventDefault();
    return false;
};
CmsBasePageEIP.prototype.HtmlEditUnderlineHandler = function(e, self) {
    var lCtrlElem = self.FocusedElement;
    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
        document.execCommand("Underline", false, null);
    }
    e.stopPropagation();
    e.preventDefault();
    return false;
};

CmsBasePageEIP.prototype.HtmlEditCancelCtrlEnterHandler = function(e, self) {
    // Cancelarlo, para los campos de texto simple   
    var lCtrlElem = self.FocusedElement;
    if (lCtrlElem
        && !self.isHtmlEditor(lCtrlElem)
        && lCtrlElem.contentEditable
        && lCtrlElem.contentEditable == 'true') {
        e.stopPropagation();
        e.preventDefault();
        return false;
    }
};

CmsBasePageEIP.prototype.HtmlEditCancelShiftEnterHandler = function(e, self) {
    // Cancelarlo, para los campos de texto simple        
    var lCtrlElem = self.FocusedElement;
    if (lCtrlElem
        && !self.isHtmlEditor(lCtrlElem)
        && !self.isMultiLineTextEditor(lCtrlElem)
        && lCtrlElem.contentEditable
        && lCtrlElem.contentEditable == 'true') {
        e.stopPropagation();
        e.preventDefault();
        return false;
    }
};

CmsBasePageEIP.prototype.HtmlEditCancelEnterHandler = function(e, self) {
    // Cancelarlo, para los campos de texto simple    
    var lCtrlElem = self.FocusedElement;
    if (lCtrlElem
        && !self.isHtmlEditor(lCtrlElem)
        && lCtrlElem.contentEditable
        && lCtrlElem.contentEditable == 'true') {
        e.stopPropagation();
        e.preventDefault();
        return false;
    }
};

CmsBasePageEIP.prototype.HtmlNewLine = function(e, self) {
    var lCtrlElem = self.FocusedElement;
    var lMapping = self.getMappingFromElement(lCtrlElem);
    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
        document.execCommand("InsertParagraph", false, null);
    }
    e.stopPropagation();
    e.preventDefault();
    return false;
};

CmsBasePageEIP.prototype.HtmlEditEscHandler = function(e, val, elem) {
    var lCtrlElem = elem;
    if (lCtrlElem.contentEditable == 'true') {
        elem.innerHTML = val.origValue;
        elem.blur();
        e.stopPropagation();
        e.preventDefault();
        return false;
    }
};

/**
* Metodo para crear un capa gris sobre un contenido
*/
CmsBasePageEIP.prototype.CrearCapaGris = function(source, mapping) {

    var padding = 3;
    var ofs = $(source).offset();
    var h = $(source).outerHeight();
    var w = $(source).outerWidth();

    var lDivHightliteLeft = $("<div class='EIPHiliteCapaGris'></div>").appendTo($("body"));
    lDivHightliteLeft.css("left", ofs.left - padding);
    lDivHightliteLeft.css("top", ofs.top - padding);
    lDivHightliteLeft.css("width", w + 2 * padding);
    lDivHightliteLeft.css("height", h + 2 * padding);
    lDivHightliteLeft.data("sourceElement", source);

    $('.EIPHiliteCapaGris').show();
    $('.EIPHiliteCapaGris').css("opacity", "0.3");
};

CmsBasePageEIP.prototype.CrearMarcoGenerico = function(source, classname) {
    //debugger;
    var padding = 3;
    var jSource = $(source);
    var ofs = jSource.offset();
    var h = jSource.outerHeight();
    var w = jSource.outerWidth();

    var aBody = $("body");

    var lDivHightliteLeft = $("<div class='" + classname + "'></div>").appendTo(aBody);
    lDivHightliteLeft.css("left", ofs.left - padding);
    lDivHightliteLeft.css("top", ofs.top - padding);
    lDivHightliteLeft.css("width", 1);
    lDivHightliteLeft.css("height", h + 2 * padding);
    lDivHightliteLeft.data("sourceElement", source);

    var lDivHightliteRight = $("<div class='" + classname + "'></div>").appendTo(aBody);
    lDivHightliteRight.css("left", ofs.left + w + padding);
    lDivHightliteRight.css("top", ofs.top - padding);
    lDivHightliteRight.css("width", 1);
    lDivHightliteRight.css("height", h + 2 * padding);
    lDivHightliteRight.data("sourceElement", source);

    var lDivHightliteTop = $("<div class='" + classname + "'></div>").appendTo(aBody);
    lDivHightliteTop.css("left", ofs.left - padding);
    lDivHightliteTop.css("top", ofs.top - padding);
    lDivHightliteTop.css("width", w + 2 * padding);
    lDivHightliteTop.css("height", 1);
    lDivHightliteTop.data("sourceElement", source);

    var lDivHightliteBottom = $("<div class='" + classname + "'></div>").appendTo(aBody);
    lDivHightliteBottom.css("left", ofs.left - padding);
    lDivHightliteBottom.css("top", ofs.top + h + padding);
    lDivHightliteBottom.css("width", w + 2 * padding);
    lDivHightliteBottom.css("height", 1);
    lDivHightliteBottom.data("sourceElement", source);

    $("." + classname).fadeIn(300);
};


CmsBasePageEIP.prototype.CrearMarco = function(source, mapping) {
    this.CrearMarcoGenerico(source, 'EIPHiliteMarco');
};


CmsBasePageEIP.prototype.DownliteAll = function(domElementToIgnore) {
    function removeIfNotCurrent(elemArray, domElementToIgnore) {
        if (!(elemArray == null)) {
            for (var i = 0; i < elemArray.length; i++) {
                var jCurrentElement = $(elemArray[i]);
                var lSourcElement = jCurrentElement.data("sourceElement");
                if (lSourcElement !== domElementToIgnore) {
                    jCurrentElement.remove();
                    if ($(lSourcElement).data("highlighted")) {
                        $(lSourcElement).data("highlighted", false);
                    }
                }
            }
        }
    };
    removeIfNotCurrent($("div.EIPHiliteMarco"), domElementToIgnore);
    removeIfNotCurrent($("div.EIPToolBarRowWrap"), domElementToIgnore);
    removeIfNotCurrent($("div.EIPHiliteCapaGris"), domElementToIgnore);
    $(document).removeData("CurrentHighLitedElement");
};

CmsBasePageEIP.prototype.HiliteContentVersionPropertyMappings = function(aBranchId, aRowId, aSourcePropertyName) {
    var self = this;
    var lMappings = $.grep(self.CmsDataMappingList, function(val) {
        return (val.FinalBranchId == aBranchId && val.FinalContentRowId == aRowId && aSourcePropertyName == val.FinalSourceProperty);
    });
    $.each(lMappings, function(i, val) {
        //var lCtrl = $get(val.TargetControlClientId);
        var lCtrl = self.GetEffectiveDomElement(val);
        if (lCtrl) {
            self.CrearCapaGris(lCtrl, val);
        }
    });
};

/**
* Nos crea la capa que nos marca el control activo y sus hermanos
* @source {Object} Control activo
* @mapping {Object} CmsDataBindingEntity del control activo 
* @e {Object} Event object
*/
CmsBasePageEIP.prototype.HiliteControl = function(source, mapping, e) {
    // si hay menu desplegado, no mostrar
    //if (this.CtxMenuEnabled) return;
    // obtener coordenadas y tamaño del control destino
    // crear un div de color rojo con z-index por encima de todo semi-transparente
    // posicionado y con su tamaño

    var self = this;
    var jSource = $(source);
    if (!jSource.data("highlighted")) {
        var ofs = jSource.offset();
        var h = jSource.outerHeight();
        var w = jSource.outerWidth();
        //var lDivId = source.id + "_EIP";
        var lDivIdBotonera = source.id + "_EIP_Toolbar";
        // crear capa para nuestro control
        this.DownliteAll(source);
        this.CrearMarco(source, mapping);

        $(".EIPToolBarRowWrap").remove();

        var lDivHightliteToolBar = $("<div class='EIPToolBarRowWrap' id='" + lDivIdBotonera + "'></div>");
        lDivHightliteToolBar.data("sourceElement", source);

        // 140909: nuevo menu
        //var lTableHightliteToolbar = $("<table border='0' id='table_" + lDivIdBotonera + "' border=0 cellspacing=0 cellpadding=0 align=left></table>");
        //lTableHightliteToolbar.appendTo($(lDivHightliteToolBar));

        // BEGIN - Otra implementación
        // Todos los mapeos de este control
        var lAllControlMappings = $.grep(this.CmsDataMappingList, function(val) {
            return (val.TargetControlClientId == mapping.TargetControlClientId);
        });
        // ContentVersions unicos
        var lBranchIds = [];
        // ContentVersions default unicos
        var lDefBranchIds = [];
        // Listas de ContentVersionIds default y no default.
        $.each(lAllControlMappings, function(i, val) {
            if (val.IsDefaultProperty) {
                self.ArrayPushUnique(lDefBranchIds, val.FinalBranchId);
                var lIndex = $.inArray(val.FinalBranchId, lBranchIds);
                if (lIndex >= 0) {
                    lBranchIds.splice(lIndex, 1);
                }
            }
            if ($.inArray(val.FinalBranchId, lDefBranchIds) == -1) {
                self.ArrayPushUnique(lBranchIds, val.FinalBranchId);
            }
        });
        // A los default, agregamos los otros
        $.each(lBranchIds, function(i, val) {
            lDefBranchIds.push(val);
        });

        // POR CADA BRANCH
        $.each(lDefBranchIds, function(i, val) {
            // Todos los mapeos de este CV
            var lCVMappings = $.grep(lAllControlMappings, function(mapVal) {
                return (mapVal.FinalBranchId == val);
            });
            // Ordenamos primero las DEFAULT
            lCVMappings.sort(function(a, b) {
                if (a.IsDefaultProperty) {
                    return -1;
                }
                else {
                    return 1;
                }
            });

            var lPrimero = lCVMappings[0];
            var lContVerInfo = self.GetContentVersionInfo(lPrimero.FinalBranchId);

            // DIV contenedor de cada branch
            var lTableRow = $("<div class='EIPToolBarRow' id='row_" + lDivIdBotonera + "_" + lPrimero.FinalBranchId + "'></div>");

            // BOTON ICONO CONTENIDO PARA MENU CONTEXTUAL
            var lBoButtonDiv = $("<div class='EIPToolBarRow_ContentIco'></div>");
            var lBoButtonLink = $("<a title='Ver opciones...' ></a>");
            var lBoButtonLinkDiv = $("<div></div>");
            //debugger;
            //Esto hace que todos los iconos built-in los muestre en un tamaño grande y las imagenes no se salgan
            //TODO: Identificar mejor los iconos que con....... esto........
            if (lPrimero.IconId.substring(lPrimero.IconId.length - 12, lPrimero.IconId.length) == "000000000000" || lPrimero.IconId.substring(lPrimero.IconId.length - 12, lPrimero.IconId.length) == "2b220b4ad877" || lPrimero.IconId.substring(lPrimero.IconId.length - 12, lPrimero.IconId.length) == "b01437916ecb") {
                var lBoButtonLinkImg = $("<img title='Ver opciones...' alt='Ver opciones...' src='/online/" + utils.url.get_PageLang() + "/" + lPrimero.IconId + "?mw=24&mh=28' border=0 />");
            }
            else {
                var lBoButtonLinkImg = $("<img title='Ver opciones...' alt='Ver opciones...' src='/online/" + utils.url.get_PageLang() + "/" + lPrimero.IconId + "?mw=18&mh=28' border=0 />");
            }

            // Poner icono en fila
            lBoButtonDiv.appendTo(lTableRow);
            lBoButtonLink.appendTo(lBoButtonDiv);
            lBoButtonLinkDiv.appendTo(lBoButtonLink);
            lBoButtonLinkImg.appendTo(lBoButtonLinkDiv);

            // Inyectar el menu del contenido cuando cliquen
            lBoButtonLink.click(function(e) {
                self.ShowCtxMenu(e, val, lPrimero.TargetControlClientId);
            });

            var lPropDivs = $("<div class='EIPToolBarRow_Propiedades' ></div>");
            // Iteramos a través de las propiedades.
            $.each(lCVMappings, function(j, mapVal) {

                var lClass = mapVal.IsDefaultProperty ? "EIPToolBarRow_Prop default" : "EIPToolBarRow_Prop";

                var lProp = $("<a class='" + lClass + "' title='Desde aquí puede editar la propiedad \"" + mapVal.EffectiveName + "\" del contenido \"" + lContVerInfo.Name + "\"'>" + mapVal.EffectiveName + "</a>");
                var lBoSeparator = $("<img class='EIPBoton_separador' src='/pb/img/BackOffice/toolBarSeparator.png' complete='complete'/>");

                lProp.appendTo(lPropDivs);
                lBoSeparator.appendTo(lPropDivs);

                lProp.click(function(e) {
                    self.OpenPropertyEditorDialog(mapVal.FinalBranchId, mapVal.FinalContentRowId, mapVal.FinalSourceProperty, mapVal.SourcePropertyTypeId, mapVal);
                    // Evitar la propagación y esconder capa
                    $(".EIPHiliteDiv").remove();
                    e.stopPropagation();
                    e.preventDefault();
                    return false;
                });
            });
            lPropDivs.appendTo(lTableRow);

            var lIconDiv = $("<div class='EIPToolBarRow_Estado' ></div>");
            lIconDiv.appendTo(lTableRow);
            // inyectar iconos con llamada ajax
            self.ShowStatusIcons(e, val, lIconDiv);

            // Agregar la fila al contenedor
            lTableRow.appendTo(lDivHightliteToolBar);
        });

        lDivHightliteToolBar.mouseout(function(e) {
            if (self.CtxMenuEnabled ||
			self.isDescendant(lDivHightliteToolBar.get(0), e.toElement))
                return;
            self.DownliteAll();
        });

        lDivHightliteToolBar.appendTo($("body"));
        lDivHightliteToolBar.css("left", ofs.left + "px");
        lDivHightliteToolBar.css("top", ofs.top + h + "px");
        lDivHightliteToolBar.css("position", "absolute");
        $(".EIPToolBarRow_Propiedades").find(".EIPBoton_separador:last").remove();
        $("<img class='EIPBoton_separador' src='/pb/img/BackOffice/toolBarSeparator.png' />").prependTo(".EIPToolBarRow_Estado")

        var Tamanyo = 0;

        for (var i = 0; i <= $(".EIPToolBarRowWrap").children(".EIPToolBarRow").size() - 1; i++) {
            if (navigator.appVersion.indexOf("MSIE 7.") > 0) {
                var TamBarra = 0;

                for (var j = 0; j <= $($(".EIPToolBarRowWrap").children(".EIPToolBarRow")[i]).find("a,img").size() - 2; j++) {
                    TamBarra = TamBarra + $($(".EIPToolBarRowWrap").children(".EIPToolBarRow")[i]).find("a,img")[j].scrollWidth;
                }
                for (var j = 0; j <= $($(".EIPToolBarRowWrap").children(".EIPToolBarRow")[i]).find("div").size() - 1; j++) {
                    TamBarra = TamBarra + $($(".EIPToolBarRowWrap").children(".EIPToolBarRow")[i]).find("div")[j].scrollWidth / 4;
                }
                if (TamBarra > Tamanyo) {
                    Tamanyo = TamBarra;
                }
            }
            else {
                var TamBarra = $(".EIPToolBarRowWrap").children(".EIPToolBarRow").width();
                TamBarra = TamBarra + (25 * $($(".EIPToolBarRowWrap").children(".EIPToolBarRow")[i]).find(".EIPToolBarRow_Propiedades").find("a").size());

                if (TamBarra > Tamanyo) {
                    Tamanyo = TamBarra;
                }
            }
        }
        Tamanyo = Tamanyo + 45;

        $(".EIPToolBarRowWrap").css("width", Tamanyo + "px");
        $(".EIPToolBarRowWrap").children(".EIPToolBarRow").css("width", "100%");
        if (($(".EIPToolBarRowWrap")[0].offsetWidth + $(".EIPToolBarRowWrap").position().left) > window.screen.availWidth) {
            $(".EIPToolBarRowWrap").css("left", (window.screen.availWidth - $(".EIPToolBarRowWrap")[0].offsetWidth - 40) + "px")
        }


        lDivHightliteToolBar.css("display", "none");
        lDivHightliteToolBar.fadeIn(100);
        jSource.data("highlighted", true);
        $(document).data("CurrentHighLitedElement", source);
    }
};

CmsBasePageEIP.prototype.ArrayPushUnique = function(array, element) {
    if ($.inArray(element, array) == -1) {
        array.push(element);
    }
};

// Devuelve un array con los elementos UNIQUE
CmsBasePageEIP.prototype.GetArrayUnique = function(array) {
    var lTemp = [];
    $.each(array, function(i, val) {
        if ($.inArray(lTemp, val) == -1) {
            lTemp.push(val);
        }
    });

    return lTemp;
};

CmsBasePageEIP.prototype.GetContentVersionInfo = function(contVerId) {
    var result = $.grep(this.ContentVersionList, function(val) {
        return (val.BranchId == contVerId);
    });

    return result[0];
};

CmsBasePageEIP.prototype.isDescendant = function(ancestor, candidate) {
    if (ancestor == candidate) {
        return true;
    }

    if (candidate === null || ancestor === null) {
        return false;
    }

    var temp = candidate.parentElement;
    while (temp !== null) {
        if (temp == ancestor) {
            return true;
        }

        temp = temp.parentElement;
    }

    return false;
};

CmsBasePageEIP.prototype.isHtmlEditor = function(lCtrlElem) {
    var lmap = this.getMappingFromElement(lCtrlElem);
    return lmap && lmap.SourcePropertyTypeId == this.HtmlDataTypeId;
};

/**
* Indica si es un editor de texto multi linea
*/
CmsBasePageEIP.prototype.isMultiLineTextEditor = function(lCtrlElem) {
    var lmap = this.getMappingFromElement(lCtrlElem);
    return lmap && lmap.SourcePropertyTypeId == this.MultilineTextTypeId;

};

CmsBasePageEIP.prototype.getMappingFromElement = function(lCtrlElem) {
    if (lCtrlElem && lCtrlElem.id) {
        var lmapping = $.grep(this.CmsDataMappingList,
function(val) {
    return val.TargetControlClientId == lCtrlElem.id && val.IsDefaultProperty;
});
        return lmapping[0];
    }
    return;
};

/*
* Actualiza todos los mapeos equivalentes que tengamos en la página, 
* puesto que venimos de una edición "INLINE".
*/
CmsBasePageEIP.prototype.UpdateSameMappings = function(aMapping) {
    var self = this;

    if (!aMapping.IsInlineEditable || !aMapping.IsDefaultProperty)
        return;

    var lEqMappings = $.grep(this.CmsDataMappingList, function(val) {
        return (val.FinalBranchId == aMapping.FinalBranchId
                && val.FinalContentRowId == aMapping.FinalContentRowId
                && val.FinalSourceProperty == aMapping.FinalSourceProperty
                && val.TargetControlClientId != aMapping.TargetControlClientId
                && val.IsInlineEditable
                && val.IsDefaultProperty);
    });

    // Por cada mapeo coincidente, modificaremos el TargetControl.
    if (lEqMappings.length == 0)
        return;

    $.each(lEqMappings, function(i, val) {
        $get(val.TargetControlClientId).innerHTML = aMapping.origValue;
    });
};

/**
* Abre una ventana de Telerik en la que seleccionamos un elemento
* para sus relaciones
*/
CmsBasePageEIP.prototype.OpenPropertyEditorDialog = function(aBranchId, aContentRowId, aSourceProperty, aSourcePropertyTypeId, aMapping) {
    var self = this;
    self.DownliteAll();
    // Cambio a Path absoluto.

    var lInitTime = this.InitTime;  // Por defecto usamos la fecha de renderizado de la página pero...

    // ... puede que el control haya sido modificado (y guardado), entonces usamos la fecha de cuando se guardó.
    if (aMapping == null)   // Si no viene informado como argumento a la función, todavía lo podemos encontrar (si existe, claro)
    {
        var mappingList = $.grep(self.CmsDataMappingList, function(mapping) {
            return mapping.FinalBranchId == aBranchId;
        });

        if (mappingList.length > 0) {
            aMapping = mappingList[0];  // Con el primero ya nos vale, ya que la fecha será la misma para todos los encontrados
        }
    }
    
    if (aMapping && aMapping.EIPModificationDate) {
        lInitTime = aMapping.EIPModificationDate;
    }

    var url = "/" + utils.url.get_PageLang() + "/pb/forms/BackOffice/EditInPlace/PropertyEditorPopup.aspx?BranchId=" + aBranchId + "&RowId=" + aContentRowId + "&PropertyName=" + aSourceProperty.replace('&', '-amp-') + "&IsOnlineRequest=" + this.IsOnlineRequest + "&MainContentId=" + this.MainContentId + "&InitTime=" + lInitTime;
    var oWnd;
    $("IFRAME").attr("scrolling", "yes");

    // Si la conexión es algo lenta, puede que la primera vez que se abra el popup se quede
    // enganchado el panel de "cargando" (en IE, cuando los recursos no están en caché). Con 
    // esta función forzamos su ocultación mientras no encontramos una solución mejor.
    function ForceLoadingMessageHiding() {
        var iframe = $(".rwWindowContent iframe");

        if (iframe.length > 0) {
            $(iframe).css('left', '0px');
            $(iframe).css('top', '0px');
        }
        else {  // Si todavía no se ha creado el iframe, volvemos a esperar...
            SetForceLoadingMessageHidingTimeout(500);
        }
    }

    function SetForceLoadingMessageHidingTimeout(miliseconds) {
        setTimeout(ForceLoadingMessageHiding, miliseconds);
    };

    SetForceLoadingMessageHidingTimeout(4000);

    try {
        if (window.top.TLK) {
            oWnd = window.top.TLK.ShowCenteredWindow(url, null);
        }
    }
    catch (e) {
        oWnd = TLK.ShowCenteredWindow(url, null);
    }

    var lBrowserWindow = oWnd.get_browserWindow();
    oWnd.autosize = true;
    oWnd.set_modal(true);

    if (aSourcePropertyTypeId == self.HtmlDataTypeId) {
        oWnd.set_height(750);
    }
    else if (aSourcePropertyTypeId == self.MultilineTextTypeId) {
        oWnd.set_height(600);
    }
    else if (aSourcePropertyTypeId == self.TextDataTypeId) {
        oWnd.set_height(420);
    } else {
        oWnd.set_height(480);
    }

    oWnd.set_width(850);
    oWnd.center();

    oWnd.ClientCallBackFunction = function(radWindow, returnValue) {
        if (returnValue) {
            self.UrlRedirect(returnValue);
        }
    };
};

/**
* Actualiza la URL de la página
*/
CmsBasePageEIP.prototype.UrlRedirect = function(aUrl) {
    document.location.href = aUrl + $.query.toString();
};

/**
* Abre el dialogo para crear un enlace a una URL
*/
CmsBasePageEIP.prototype.OpenHTMLLinkDialog = function(aConVerId, aRowId, aPropName) {

    // debugger;

    // TODO: Obtener el link actual del texto seleccionado
    //    var lCtrlElem = self.FocusedElement;
    //    var lMapping = self.getMappingFromElement(lCtrlElem);
    //    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
    //        // document.execCommand("Bold", false, null);
    //    }

    var aDialogOpener = TLK.GetTopDialogOpener();

    var args = new Telerik.Web.UI.EditorCommandEventArgs("LinkManager", null, document.createElement("a"));
    args.CssClasses = [];
    args.set_callbackFunction(this.OpenHTMLLinkDialogCallBack);
    args.CmsText = "aa";
    args.realLink = { title: "titulo aqui" };

    //aDialogOpener.set_additionalQueryString('&PreselectedItemUrl=' + encodeURIComponent(initialPath));
    // Establecer función de CallBack
    //aDialogOpener.get_dialogDefinitions().DocumentManager.ClientCallbackFunction = this.OpenContentLinkDialogCallBack;

    // Abrir diálogo
    aDialogOpener.open('LinkManager', args);
};

CmsBasePageEIP.prototype.OpenHTMLLinkDialogCallBack = function(sender, args) {
    // debugger;
    alert(args);
};


/**
* Abre el dialogo para crear un enlace a un contenido
*/
CmsBasePageEIP.prototype.OpenContentLinkDialog = function(aConVerId, aRowId, aPropName) {
    // http://cmsdevbo/pb/Forms/BackOffice/MainForm/Telerik.Web.UI.DialogHandler.aspx?DialogName=CmsLinkManager&Skin=PortalBuilder_Blue&Title=Link Manager&doid=a0e8697b-bdcc-4e81-908c-16da4fba15ed&dpptn=&dp=YHFlMzs5L1lRHRhySTV%2BM1cfUHN5ZXBCT1VfFFE2FBMuSmJDUzBiVTxgBmZqOmRZfwU7CQdhfghhc2kRbAR7blVjVEV%2BXHdRUUh6VHQMKBJdWEcpYwkNbTNZYVBhWwIhAicOUGY8d2R%2BU3I3b2hQRUdfYEJibnVOUjVBVTVKUHh9GWYyM1oKX2QkfARqclQvAUV%2BLXhZegtqFm9fbWBLYU5fY0licGIsYCNXFmFJcmpTIy9DGnJlCmAGaTo4Cy9DVDJBbnwPSCxkeQQPbAJ4QnRvS1JqUmMiARV2dFEJSAgpciRfUSp4Wn8EIBI%2FRFtRSQZEEncXRUd5BhIAfFlJb1AVQDh%2BCCBOdXYFbGkJUGQbYHobU35DDSw0LxtpVhhkSSVyBmZHcl51AUJAelRbb2oNaxIHYn5SZSRcPTxhGmRRDkZvZi4RLAdselZ0BR0xWQd%2Fa2dcZVp8AUVKZEhYKncKJFJdd3Y%2FZR4zRidNfSxmZw59
    // TLK.OpenModalWindow("/pb/forms/Details/RelationsSelector.aspx?GUID=" + val.GuidValue, function(radWindow, returnValue) {

    // var lUrl = "/pb/Controls/Backoffice/Edition/PropertyEditors/HtmlEditor08/CmsLinkDialog.ascx";

    // debugger;

    // TODO: Obtener el link actual del texto seleccionado
    //    var lCtrlElem = self.FocusedElement;
    //    var lMapping = self.getMappingFromElement(lCtrlElem);
    //    if (lCtrlElem.contentEditable == 'true' && self.isHtmlEditor(lCtrlElem)) {
    //        // document.execCommand("Bold", false, null);
    //    }

    var aDialogOpener = TLK.GetTopDialogOpener();

    var args = new Telerik.Web.UI.EditorCommandEventArgs("CmsLinkManager", null, document.createElement("a"));
    args.CssClasses = [];
    args.set_callbackFunction(this.OpenContentLinkDialogCallBack);
    args.CmsText = "aa";
    args.realLink = { title: "titulo aqui" };

    //aDialogOpener.set_additionalQueryString('&PreselectedItemUrl=' + encodeURIComponent(initialPath));
    // Establecer función de CallBack
    //aDialogOpener.get_dialogDefinitions().DocumentManager.ClientCallbackFunction = this.OpenContentLinkDialogCallBack;

    // Abrir diálogo
    aDialogOpener.open('CmsLinkManager', args);
};

CmsBasePageEIP.prototype.OpenContentLinkDialogCallBack = function(sender, args) {
    // debugger;
    alert(args);

    // TODO: Establecer link en el EIP
};


/**
* Guarda la modificación actual a través de un WebService
* @mapping {Object} CmsDataBindingEntity del control activo 
* @value {String} Valor modificado
*/
CmsBasePageEIP.prototype.save = function(mapping, value) {
    var self = this;

    var lToSave = value;

    //    // filtrar html si se ha de guardar en texto simple
    //    if (mapping.SourcePropertyTypeId != this.HtmlDataTypeId)
    //        lToSave = lToSave.replace(/(<([^>]+)>)/ig, "");

    var params = $.compactJSON({
        "aOnline": self.IsOnlineRequest,
        "aBranchId": mapping.FinalBranchId,
        "aRowId": mapping.FinalContentRowId,
        "aPropertyName": mapping.FinalSourceProperty,
        "aPropertyValue": lToSave,
        "aInitTime": mapping.EIPModificationDate == null ? self.InitTime : mapping.EIPModificationDate
    });

    $.ajax({
        type: "POST",
        url: "/pb/Services/EIPService.asmx/SaveEIPChange?pbl=" + utils.url.get_PageLang(),
        data: params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function() {
            mapping.origValue = value;
            self.UpdateSameMappings(mapping);
            self.OnSave();
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            mapping.saveError = true;
            self.ShowBackMsg("Error: " + $.evalJSON(XMLHttpRequest.responseText).Message, "EIPBackgroundProgressError");
            mapping.saveError = false;
        }
    });
};

CmsBasePageEIP.prototype.ShowStatusIcons = function(e, aBranchId, aRow) {
    var param = new Array(aBranchId);
    var self = this;
    this.GetBranchDetails(param, function(result) {
        var lInfo = result.d[0];
        //inyectando iconos
        $(lInfo.PublishingInfoImageTag).appendTo(aRow);
        $(lInfo.LockingInfoImageTag).appendTo(aRow);
    });
}

CmsBasePageEIP.prototype.ShowCtxMenu = function(e, aBranchId) {
    var param = new Array(aBranchId);
    var self = this;
    if (!self.CtxMenuEnabled) {
        self.CtxMenuEnabled = true;
        this.GetBranchDetails(param, function(result) {
            var lInfo = result.d[0];
            // menu contextual
            self.CtxMenuId = self.OnShowContentVersionCtxMenu(e, lInfo);
            // suscribirnos a la ocultacion del menu
            var lMenu = $find(self.CtxMenuId);
            lMenu.add_hidden(function(e) {
                self.CtxMenuEnabled = false;
                self.DownliteAll();
            });
        });
    }
    else {
        self.CtxMenuEnabled = false;
        var lMenu = $find(self.CtxMenuId);
        lMenu.hide();
    }
}

CmsBasePageEIP.prototype.GetBranchDetails = function(aBranchIdList, aSuccessFunc) {
    var self = this;

    var params = $.compactJSON({
        "aOnline": this.IsOnlineRequest,
        "aBranchIdList": aBranchIdList
    });

    $.ajax({
        type: "POST",
        url: "/pb/Services/EIPService.asmx/GetBranchDetails?pbl=" + utils.url.get_PageLang(),
        data: params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: aSuccessFunc,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            self.ShowBackMsg("Error: " + $.evalJSON(XMLHttpRequest.responseText).Message, "EIPBackgroundProgressError");
        }
    });
}

CmsBasePageEIP.prototype.ShowBackMsg = function(aMessage, aCssClass, aNoAutoFadeOut, aElapsedTimeAutoFadeOut, aCallBackFunction) {
    if (this.OnShowBackgroundMessage) {
        this.OnShowBackgroundMessage(aMessage, aCssClass, aNoAutoFadeOut, aElapsedTimeAutoFadeOut, aCallBackFunction);
    }
};

CmsBasePageEIP.prototype.BuildErrorTraceList = function() {
    var lWrapper = $("#EIPErrorTraceList");
    if (this.TraceErrorList != null) {
        if (this.TraceErrorList.length > 0) {
            $.each(this.TraceErrorList,
                    function(i, val) {
                        var lErrorListItem = $("<div id='EIPErrorListItem'" + i + " class='EIPErrorListItem'>" + val.toString() + "</div>").appendTo(lWrapper);
                    }
                  );
        }
    };

    $("#EIPspanOcultar_ListaErrores").click(function() { $("#EIPErrorTraceListWrapper").fadeOut(300); });
};

