/**
 * Класс отображения карты сайта.
 * @author Maxim Kazakov <kazakov.max@gmail.com>
 **/
var CMS_SITEMAP_LINK_CONTAINER_ID = 'CmsSitemapLinkContainer';

CmsSitemapLinkManager = {
    /**
     * Редактор, для которого надо произвести вставку ссылки.
     */
    currentEditor: null,
    /**
     * Обработчик события выбора контента на карте сайта.
     */
    contentSelectionHandler: null,
    /**
     * Запоминает указанный в параметре редактор и создает отображение карты сайта.
     * @param editor Объект tinyMCE редактора.
     * @param linkFilter Список отфильтровываемых узлов карты сайта.
     */
    prepareForLinkInsertion: function(editor, linkFilter) {
        this.currentEditor = editor;
        this.createSitemap(linkFilter);
    },
    /**
     * Запоминает указанный в параметре обработчик и создает отображение карты сайта.
     * @param handler Объект tinyMCE редактора.
     * @param linkFilter Список отфильтровываемых узлов карты сайта.
     */
    prepareForLinkSelection: function(handler, linkFilter) {
        this.contentSelectionHandler = handler;
        this.createSitemap(linkFilter);
    },
    /**
     * Создает контейнер и кладет в него подготовленную к отображению карту сайта.
     */
    createSitemap: function(linkFilter) {
        jQuery.ajax({
            type    : "POST",
            url     : "./admin/sitemap/ajax/view/",
            success: function(contentTree) {
                CmsSitemapLinkManager.destroySitemap();

                // Добавление контейнера карты сайта в body
                jQuery("body").append("<div id='" + CMS_SITEMAP_LINK_CONTAINER_ID + "' style='display: none; width: 800px; height: 400px; z-index: 999; position: fixed; top: 0px; background-color: #eee; overflow: scroll; border: solid 1px #000;'></div>");

                // Добавление контента в контейнер карты сайта
                var sitemap = jQuery("#" + CMS_SITEMAP_LINK_CONTAINER_ID);
                sitemap.append(contentTree);
                sitemap.show();

                var linksNotFilteredSelector, linksFilteredSelector;
                if (linkFilter) {
                    // Задан фильтр для ссылок
                    var linkFilters = linkFilter.split("|");
                    linksFilteredSelector = Array();
                    for (var i in linkFilters) {
                        // Запись в массив каждой отдельной части селектора
                        linksFilteredSelector.push("a[id^=" + linkFilters[i] + "]");
                    }

                    // Итоговые селекторы для фильтрации ненужных данных
                    linksFilteredSelector    = linksFilteredSelector.join(",");
                    linksNotFilteredSelector = ":not(" + linksFilteredSelector + ")";
                } else {
                    // Не задан фильтр для ссылок
                    linksNotFilteredSelector = "";
                    linksFilteredSelector    = "a";
                }

                // Удаление атрибута href у всех ссылок в дереве контента сайта
                sitemap.find(linksNotFilteredSelector)
                    .attr("href", "javascript:void(0)");

                sitemap.find("a").bind("click", function() {
                    return false;
                });

                // Установка обработчика клика на ссылки на страницы
                sitemap.find(linksFilteredSelector)
                    .bind("click", CmsSitemapLinkManager.onContentSelected);

                // Удаление ссылок из дерева, которые не являются ссылками
                // на страницы, и замена их на обычный текст
                sitemap.find("a").not(linksFilteredSelector).each(function() {
                    jQuery(this).after(jQuery(this).text()).remove();
                });

                // Добавление кнопки закрытия
                sitemap.prepend("<a style='float: right' href='javascript:void(0)'><b>Закрыть</b></a>");
                sitemap.find("a:first").bind("click", function() {
                    jQuery(this).parent().remove();
                });
            }
        });
    },
    /**
     * Удаляет карту сайта со страницы.
     */
    destroySitemap: function() {
        jQuery("#" + CMS_SITEMAP_LINK_CONTAINER_ID).remove();
    },
    /**
     * Обработчик события выбора ссылки в карте сайта.
     */
    onContentSelected: function() {
        var content = {
            id      : this.id.split("_")[1],
            title   : this.innerHTML,
            url     : this.href
        };

        CmsSitemapLinkManager.insertLink(content);
        CmsSitemapLinkManager.invokeHandlers(content);
        CmsSitemapLinkManager.destroySitemap();
    },
    /**
     * Выполняет вставку ссылки в tinyMCE редактор.
     */
    insertLink: function(content) {
        if (this.currentEditor) {
            var selection = this.currentEditor.selection.getContent();
            if (selection) {
                this.currentEditor.execCommand("mceInsertLink", false, content.url);
            } else {
                this.currentEditor.execCommand("mceInsertRawHTML", false, '<a href="' + content.url + '">' + content.title + '</a>');
            }
            
            this.currentEditor = null;
        }
    },
    /**
     * Последовательный вызов всех обработчиков события выбора контента.
     */
    invokeHandlers: function(content) {
        if (this.contentSelectionHandler) {
            this.contentSelectionHandler.call(content);
            this.contentSelectionHandler = null;
        }
    }
}
