var CMS_ContentMenu_CurrentContentMenu = null;

function CMS_ContentMenu_ShowNav(context, parentMenuItemKey, e) {

    if (context.parameter.hideTimer) {
        clearTimeout(context.parameter.hideTimer);
    }

    if (e && context.parameter.currentMenuItemKey != parentMenuItemKey) {
        if (context.parameter.showTimer) {
            clearTimeout(context.parameter.showTimer);
        }

        if (context.parameter.currentMenuElement)
            $($(context.parameter.currentMenuElement).parent().get(0)).removeClass("active");

        var wrapper = $('#' + context.parameter.popupWrapperID);

        context.parameter.currentMenuItemKey = parentMenuItemKey;
        context.parameter.currentMenuElement = e;

        context.parameter.showTimer = setTimeout(function() { CMS_ContentMenu_GetChildMenuItems(context); }, 150);
    }

    if (!CMS_ContentMenu_CurrentContentMenu)
        setTimeout(function() { CMS_ContentMenu_CurrentContentMenu = context; }, 19);
}

function CMS_ContentMenu_MoreShowNav(context, isParent, e) {
    if (isParent == true)
        CMS_ContentMenu_ShowNav(context, -1, e);
    else
        CMS_ContentMenu_ShowNav(context, -2, e);
}

function CMS_ContentMenu_HideNav(context, parentGroupId, e) {
    if (e && context.parameter.currentGroupId == parentGroupId) {
        if (context.parameter.hideTimer) {
            clearTimeout(context.parameter.hideTimer);
        }
        context.parameter.hideTimer = setTimeout(function() { CMS_ContentMenu_HidePopup(context); }, 150);
    }
}

function CMS_ContentMenu_MoreMouseOutPopup(context, isParent, e) {
    if (isParent == true)
        CMS_ContentMenu_HideNav(context, -1, e);
    else
        CMS_ContentMenu_HideNav(context, -2, e);
}

function CMS_ContentMenu_RenderMenuItems(context, menuItemsArray) {

}

function CMS_ContentMenu_GetChildMenuItems(context) {
    var popupPanel = eval(context.parameter.popupMenuId);
    var wrapper = $('#' + context.parameter.popupWrapperID);
    $('.multiple-column-list', wrapper).hide();
    $('.internal-link.view-all-groups', wrapper).hide();

    var parentElement = $(context.parameter.currentMenuElement).parent().get(0);
    $(parentElement).addClass("active");

    var menuItemKey = context.parameter.currentMenuItemKey;

    if (menuItemKey != null && menuItemKey.length > 0) {

        var content = CMS_ContentMenu_LoadFromCache(context, menuItemKey);
        if (content) {
            popupPanel.SetPanelContent(content);
            popupPanel.ShowAtElement(parentElement);
        }
        else {
            content = context.parameter.loadingHtml
            popupPanel.SetPanelContent(content);
            popupPanel.ShowAtElement(parentElement);
            // var elementInfo = Telligent_Common.GetElementInfo(parentElement);
            // popupPanel.Show(elementInfo.Left, elementInfo.Top, elementInfo.Width, elementInfo.Height);
            var message = '{"menuName":"' + context.parameter.currentMenuName + '","menuItemKey":"' + menuItemKey + '"}';
            $.ajax({
                type: "POST",
                url: CMS_ContentMenu_AjaxEndpoint + "/GetChildren",
                contentType: "application/json; charset=utf-8",
                data: message,
                dataType: "json",
                success: function(msg) {
                    var objs = msg.d;
                    var content = "";

                    if (objs.MenuItems.length > 0) {

                        var hasChildItems = false;
                        $.each(objs.MenuItems, function() {
                            if (this.MenuItems.length > 0) {
                                hasChildItems = true;
                                return;
                            }
                        });
                        if (hasChildItems == true)
                            content += CMS_ContentMenu_RenderMenuItemsWithChildren(context, objs.MenuItems);
                        else
                            content += CMS_ContentMenu_RenderMenuItems(context, objs.MenuItems);
                    }
                    content = context.parameter.contentMenuContentWrapperHtmlBlock.replace(/{ContentMenuContent}/g, content);

                    var popupPanel = eval(context.parameter.popupMenuId);
                    popupPanel.Hide();
                    popupPanel.SetPanelContent(content);
                    popupPanel.ShowAtElement(parentElement);

                    CMS_ContentMenu_AddToCache(context, menuItemKey, content);

                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    var popupPanel = eval(context.parameter.popupMenuId);
                    popupPanel.SetPanelContent(context.parameter.errorHtml);
                }
            });
        }
    }
    else {
        var moreContent = "";
        if (menuItemKey == "")
            moreContent = $('#' + context.parameter.popupParentMoreId).html();
        else if (menuItemKey == "")
            moreContent = $('#' + context.parameter.popupChildMoreId).html();

        var popupPanel = eval(context.parameter.popupMenuId);
        popupPanel.Hide();
        popupPanel.SetPanelContent(moreContent);
        popupPanel.ShowAtElement(parentElement);
    }
}

function CMS_ContentMenu_RenderMenuItemsWithChildren(context, menuItemsArray) {
    var t1MenuItems = "";
    var columnsMarkup = "";
    var columnsCount = 0;
    var columnMenuItems = 0;

    var listContent = context.parameter.contentMenuListHtmlBlock;

    columnsCount = 1;

    // t1 MenuItems
    $.each(menuItemsArray, function() {
        if (columnsCount > 3) { return; }
        if (this.MenuItems.length + 2 + columnMenuItems > 21) {
            columnsMarkup += context.parameter.columnWrapperHtmlBlock.replace(/{ColumnId}/g, columnsCount).replace(/{t1MenuItemsData}/g, t1MenuItems);
            t1MenuItems = "";
            columnsCount++;
            columnMenuItems = 0;
            if (columnsCount > 3) { return; }
        }
        columnMenuItems += this.MenuItems.length + 2;

        var t2MenuItems = "";
        // t2 Groups
        var menuItemCount = this.MenuItems.length;
        var itemCount = 0;
        if (this.MenuItems.length > 0) {
            $.each(this.MenuItems, function() {
                itemCount++;
                var itemClass = "";
                if (itemCount == 1)
                    itemClass = " first";
                else if (itemCount == menuItemCount)
                    itemClass = " last";

                t2MenuItems += context.parameter.t2MenuHtmlBlock.replace(/{ItemClass}/g, itemClass).replace(/{Item}/g, context.parameter.linkHtmlBlock.replace(/{Text}/g, this.Text).replace(/{Url}/g, this.Url).replace(/{Tooltip}/g, this.Tooltip));

                if (this.IsAndMoreLink) {
                    t2MenuItems = t2MenuItems.replace(/{MoreClass}/g, "internal-link view-more");
                }
                else
                    t2MenuItems = t2MenuItems.replace(/{MoreClass}/g, "internal-link view-group");
            });
            t1MenuItems += context.parameter.t1MenuHtmlBlock.replace(/{NameClass}/g, " with-children").replace(/{Tooltip}/g, this.Tooltip).replace(/{Text}/g, context.parameter.linkHtmlBlock.replace(/{Text}/g, this.Text).replace(/{Url}/g, this.Url).replace(/{MoreClass}/g, "internal-link view-group"));
        }
        else {
            t1MenuItems += context.parameter.t1MenuHtmlBlock.replace(/{NameClass}/g, "").replace(/{Tooltip}/g, this.Tooltip).replace(/{Text}/g, context.parameter.linkHtmlBlock.replace(/{Text}/g, this.Text).replace(/{Url}/g, this.Url).replace(/{MoreClass}/g, "internal-link view-group"));
        }
        t1MenuItems = t1MenuItems.replace(/{Groups}/g, t2MenuItems);
    });

    if (t1MenuItems != "") {
        columnsMarkup += context.parameter.columnWrapperHtmlBlock.replace(/{ColumnId}/g, columnsCount).replace(/{t1MenuItemsData}/g, t1MenuItems);
    }

    listContent = listContent.replace(/{Columns}/g, columnsMarkup);
    listContent = listContent.replace(/{ColumnsCount}/g, columnsCount > 3 ? 3 : columnsCount);

    return listContent;
}

function CMS_ContentMenu_RenderMenuItems(context, menuItemsArray) {
    var t1MenuItems = "";
    var columnsMarkup = "";
    var columnsCount = 0;
    var columnMenuItems = 0;

    var listContent = context.parameter.contentMenuListHtmlBlock;

    columnsCount = 1;
    var itemCount = 0;
    
    for (var i = 0; i < menuItemsArray.length; i++) {
        itemCount++;
        var menuItemHtml = context.parameter.t1MenuHtmlBlock.replace(/{MenuItems}/g, "").replace(/{Text}/g, context.parameter.linkHtmlBlock.replace(/{Text}/g, menuItemsArray[i].Text).replace(/{Url}/g, menuItemsArray[i].Url).replace(/{Tooltip}/g, menuItemsArray[i].Tooltip).replace(/{MoreClass}/g, "internal-link view-group"));

        if (itemCount < 10 && i < (menuItemsArray.length - 1))
            menuItemHtml = menuItemHtml.replace(/{NameClass}/g, " no-children");
        else
            menuItemHtml = menuItemHtml.replace(/{NameClass}/g, " no-children last");

        t1MenuItems += menuItemHtml;
        
        if (itemCount >= 10) {
            columnsMarkup += context.parameter.columnWrapperHtmlBlock.replace(/{ColumnId}/g, columnsCount).replace(/{t1MenuItemsData}/g, t1MenuItems);
            t1MenuItems = "";
            columnsCount++;
            itemCount = 0;
        }
    }

    if (t1MenuItems != "") {
        columnsMarkup += context.parameter.columnWrapperHtmlBlock.replace(/{ColumnId}/g, columnsCount).replace(/{t1MenuItemsData}/g, t1MenuItems);
    }

    listContent = listContent.replace(/{Columns}/g, columnsMarkup);
    listContent = listContent.replace(/{ColumnsCount}/g, columnsCount > 3 ? 3 : columnsCount);

    return listContent;
}

function CMS_ContentMenu_LoadFromCache(context, parentMenuItemKey) {
    if (context.parameter.cache) {
        if (context.parameter.cache[parentMenuItemKey]) return context.parameter.cache[parentMenuItemKey];
    }
    return null;
}

function CMS_ContentMenu_AddToCache(context, parentMenuItemKey, content) {
    if (!context.parameter.cache) {
        context.parameter.cache = {};
    }
    context.parameter.cache[parentMenuItemKey] = content;
}

function CMS_ContentMenu_MouseOverPopup(context) {
    if (context.parameter.hideTimer) {
        clearTimeout(context.parameter.hideTimer);
    }
}

function CMS_ContentMenu_MouseOutPopup(context) {
    if (context.parameter.hideTimer) {
        clearTimeout(context.parameter.hideTimer);
    }
    context.parameter.hideTimer = setTimeout(function() { CMS_ContentMenu_HidePopup(context); }, 150);
}

function CMS_ContentMenu_HidePopup(context) {
    if (context.parameter.hideTimer) {
        clearTimeout(context.parameter.hideTimer);
    }
    eval(context.parameter.popupMenuId).Hide();
    $($(context.parameter.currentMenuElement).parent().get(0)).removeClass("active");
    context.parameter.currentMenuItemKey = '';
    context.parameter.currentMenuElement = null;
}

function CMS_ContentMenu_SetMenuItems(container, isParent, listId) {
    $('#' + listId).html("");

    var totalItems = $('.navigation-item.entry', $(container)).length;
    var itemCount = 0;

    $('.navigation-item.entry', $(container)).css("display", "none");

    var totalWidth = $(container).width() - $('#MoreLink', $(container)).outerWidth();

    if (isParent)
        totalWidth = totalWidth - 60;
    else {
        var leading = $(container + ' .leading-child');
        if (leading)
            totalWidth = totalWidth - leading.outerWidth(true);

        totalWidth = totalWidth - 100;
    }
    var currentWidth = 0;

    var hasMore = false;

    $(container + ' .entry').each(function() {
        itemCount++;
        var thisWidth = $(this).outerWidth(true);

        if ((currentWidth + thisWidth < totalWidth) && hasMore == false) {
            $(this).show();

            currentWidth = currentWidth + thisWidth;
        }
        else {
            hasMore = true;
            var e = $(this).clone();
            if (itemCount == totalItems)
                e.addClass("last");
            $(".internal-link", e).removeAttr("onmouseover").removeAttr("onmouseout");
            $('#' + listId).append(e.show());
        }
    });

    if (hasMore) {
        $('#MoreLink', $(container)).show();
    }
    else
        $('#MoreLink', $(container)).hide();
}