/**
 * Обработчик контрола "листалка". Листалка дозагружает некоторое количество
 * ответов и позволяет удалить загруженые листалкой ответы.
 *
 * Структура контрола до добавления ответов:
 *
 * <li>
 *     <p class="b-more-replies c-more-replies">
 *         <a onclick="return ['source','item_no','parent_id','from']" href="">+100 ответов</a>&#32;
 *         <i>осталось <span>250</span></i>
 *     </p>
 * </li>
 *
 * Структура контрола после добавления 2-х ответов:
 *
 * <li>
 *     <p class="b-more-replies c-more-replies">
 *         <a onclick="return ['source','item_no','parent_id','from',2]" href="">+100 ответов</a>&#32;
 *         <a href="">-2 ответа</a>&#32;
 *         <i>осталось <span>250</span></i>
 *     </p>
 * </li>
 *
 * Значение атрибута onclick вычисляется и сохраняется в this.params. Вторая
 * ссылка (-2 ответа) должны быть в контроле только если им уже были загружены
 * ответы. Последний параметр (2) это количество ответы, которое было добавлено.
 * Если он отсутствует или равен 0, то ответа не добавлялись.
 *
 * Текущая реализация предполает, что при загрузке ответов с сервера приедут
 * ответы в таком виде:
 *
 * <li>
 *     комментарий1
 * </li>
 * ...
 * <li>
 *     комментарийN
 * </li>
 * <li>
 *     <p class="b-more-replies c-more-replies">...</p>
 * </li>
 *
 * Т.о. после загрузки ответов контрол удаляет <li>, в котором он расположен,
 * и добавляет ответы и новый контрол, после чего инициализирует все контролы
 * в элементе <ul>, в который добавились ответы.
 */
Friends.MoreRepliesControl = new function() {
    this.createFromTag = function(element) {
        new Friends.MoreRepliesControl.Constructor(element);
    };
};

/**
 * Удаление/редактирование записей/комментариев.
 */
Friends.MoreRepliesControl.Constructor = function(element) {
    /** control container. */
    this.control = element;

    /** параметры, переданые в html коде. */
    this.params = 0;

    this.init();
};

Friends.MoreRepliesControl.Constructor.prototype = new function() {
//public
    /**
     * Вызывает загрузку дополнительных ответов.
     *
     *  @param  _element    элемент на который пришёлся click
     */
    this.add = function(_element) {
//        resetControls();

        // проверяем, не идёт ли сейчас загрузка ответов
        if ( !y5.Classes.test(_element, 'b-replies-count-loading') ){
            y5.Classes.add(_element, 'b-replies-count-loading')

            this.load();
        }


        // проверяем, не идёт ли сейчас загрузка ответов
/*
        if (this.control.getElementsByTagName("img").length==0)
        {
            var img=document.createElement("img");
            img.src=g_globals.img_base + "bar.gif";
            img.alt="Идёт загрузка ответов";
            this.control.appendChild(img);

            this.load();
        }
*/
        return false;
    };

    /**
     * Удаляет загруженые до этого через метод add ответы.
     *
     *  @param  _element    элемент на который пришёлся click
     */
    this.del = function(_element) {
//        resetControls();

        // проверяем, не идёт ли сейчас загрузка ответов
        // if (this.control.getElementsByTagName("img").length==0)
        if ( !y5.Classes.test(this.links[0], 'b-replies-count-loading') ) {
            var count=this.params[4];
            var comment=this.control.parentNode;
            var parent=comment.parentNode;

            // удаляем ответы
            for (var i=0; i<count; i++)
                parent.removeChild(getPrevElement(comment, "li"));

            // добавляем количество удалённых ответов к текущему
            var c=this.control.getElementsByTagName("span")[0];
            c.innerHTML=(parseInt(c.innerHTML)+count);

            // уменьшаем количество добавленых ответов
            this.params[4]-=count;

            // если добавленых ответов больше нет, то удаляем ссылку -N
            if (this.params[4]==0)
                _element.parentNode.removeChild(_element);
        }
        return false;
    };

//private
    this.load = function() {
        var _this = this;
        // "осмысление" параметров
        var params = {
            source : this.params[0],
            item_no : this.params[1],
            parent_id : this.params[2],
            from : this.params[3],
            added: this.params[4] || 10
        };

        // функция на успех запроса
        function responceOK(request, trace) {
            var parentUl = y5.Dom.getAncestorOrSelf(trace.parent.control, 'ul', '*');
            var parentLi = y5.Dom.getAncestorOrSelf(trace.parent.control, 'li', '*');

            parentUl.removeChild(parentLi);
            _this.appendHTML(parentUl, request.html, 'ul');

            // global init
            init(parentUl);

            // y5 components init
            y5.Components.init(parentUl);
        }

        // функция на неудачу запроса
        function responceError(trace) {
            alert("Ошибка загрузки ответов.");
        };

        try {
            var url = friendsURL('ajax/replies',
                'source=' + params.source.id +
                '&item_no=' + params.item_no + '&parent_id=' + params.parent_id +
                '&with_parent=0' +
                '&from=' + params.from + (params.added ? '&added=' + params.added : '')
            );

            (new y5.Ajax(new y5.AjaxJS(), url, responceOK, responceError, {parent: this})).send();
        } catch(e) {
            responceError({parent: this});
        }
    };

    this.init = function() {
        this.links=this.control.getElementsByTagName("a");

        // инициализируем "+N ответов"
        // атрибут onclick в html содержит массив с URL обработчика, который
        // будет отдавать ответы
        this.params=getParams(this.links[0]);
        this.links[0].onclick=associateEventWithObject(this, "add");

        // инициализируем "-N ответов"
        if (this.links.length==2)
            this.links[1].onclick=associateEventWithObject(this, "del");
    };

    this.appendHTML = function(container, html, tmpTagName) {
        var node;
        var tmpElement = document.createElement(tmpTagName || 'div');
        tmpElement.innerHTML = html;

        while (node = tmpElement.firstChild) {
         container.appendChild(node);
        }
    };
}

y5.loaded('{Friends}.MoreRepliesControl');