Файл: js/xenforo/full/discussion.js
Строк: 489
<?php
/** @param {jQuery} $ jQuery Object */
!function($, window, document, _undefined)
{
    //TODO: Enable jQuery plugin and compressor in editor template.
    /**
     * Enables quick reply for a message form
     * @param $form
     */
    XenForo.QuickReply = function($form)
    {
        if ($('#messageList').length == 0)
        {
            return console.error('Quick Reply not possible for %o, no #messageList found.', $form);
        }
        var submitEnableCallback = XenForo.MultiSubmitFix($form);
        /**
         * Scrolls QuickReply into view and focuses the editor
         */
        this.scrollAndFocus = function()
        {
            $(document).scrollTop($form.offset().top);
            var ed = XenForo.getEditorInForm($form);
            if (!ed)
            {
                return false;
            }
            if (ed.$editor)
            {
                ed.focus(true);
            }
            else
            {
                ed.focus();
            }
            return this;
        };
        $form.data('QuickReply', this).bind(
        {
            /**
             * Fires just before the form would be AJAX submitted,
             * to detect whether or not the 'more options' button was clicked,
             * and to abort AJAX submission if it was.
             *
             * @param event e
             * @return
             */
            AutoValidationBeforeSubmit: function(e)
            {
                if ($(e.clickedSubmitButton).is('input[name="more_options"]'))
                {
                    e.preventDefault();
                    e.returnValue = true;
                }
            },
            /**
             * Fires after the AutoValidator form has successfully validated the AJAX submission
             *
             * @param event e
             */
            AutoValidationComplete: function(e)
            {
                if (e.ajaxData._redirectTarget)
                {
                    window.location = e.ajaxData._redirectTarget;
                }
                $('input[name="last_date"]', $form).val(e.ajaxData.lastDate);
                if (submitEnableCallback)
                {
                    submitEnableCallback();
                }
                $form.find('input:submit').blur();
                new XenForo.ExtLoader(e.ajaxData, function()
                {
                    $('#messageList').find('.messagesSinceReplyingNotice').remove();
                    $(e.ajaxData.templateHtml).each(function()
                    {
                        if (this.tagName)
                        {
                            $(this).xfInsert('appendTo', $('#messageList'));
                        }
                    });
                });
                var $textarea = $('#QuickReply').find('textarea');
                $textarea.val('');
                var ed = $textarea.data('XenForo.BbCodeWysiwygEditor');
                if (ed)
                {
                    ed.resetEditor();
                }
                $form.trigger('QuickReplyComplete');
                return false;
            },
            BbCodeWysiwygEditorAutoSaveComplete: function(e)
            {
                var $messageList = $('#messageList'),
                    $notice = $messageList.find('.messagesSinceReplyingNotice');
                if (e.ajaxData.newPostCount && e.ajaxData.templateHtml)
                {
                    if ($notice.length)
                    {
                        $notice.remove();
                        $(e.ajaxData.templateHtml).appendTo($messageList).show().xfActivate();
                    }
                    else
                    {
                        $(e.ajaxData.templateHtml).xfInsert('appendTo', $messageList);
                    }
                }
                else
                {
                    $notice.remove();
                }
            }
        });
    };
    // *********************************************************************
    /**
     * Controls to initialise Quick Reply with a quote
     *
     * @param jQuery a.ReplyQuote, a.MultiQuote
     */
    XenForo.QuickReplyTrigger = function($trigger)
    {
        /**
         * Activates quick reply and quotes the post to which the trigger belongs
         *
         * @param e event
         *
         * @return boolean false
         */
        $trigger.click(function(e)
        {
            console.info('Quick Reply Trigger Click');
            var $form = null,
                xhr = null,
                queryData = null;
            if ($trigger.is('.MultiQuote'))
            {
                $form = $($trigger.data('form'));
                queryData =
                {
                    postIds: $($trigger.data('inputs')).map(function()
                    {
                        return this.value;
                    }).get()
                };
            }
            else
            {
                $form = $('#QuickReply');
                $form.data('QuickReply').scrollAndFocus();
            }
            if (!xhr)
            {
                xhr = XenForo.ajax
                (
                    $trigger.data('posturl') || $trigger.attr('href'),
                    queryData,
                    function(ajaxData, textStatus)
                    {
                        if (XenForo.hasResponseError(ajaxData))
                        {
                            return false;
                        }
                        delete(xhr);
                        var ed = XenForo.getEditorInForm($form);
                        if (!ed)
                        {
                            return false;
                        }
                        if (ed.$editor)
                        {
                            ed.insertHtml(ajaxData.quoteHtml);
                            if (ed.$editor.data('xenForoElastic'))
                            {
                                ed.$editor.data('xenForoElastic')();
                            }
                        }
                        else
                        {
                            ed.val(ed.val() + ajaxData.quote);
                        }
                        if ($trigger.is('.MultiQuote'))
                        {
                            // reset cookie and checkboxes
                            $form.trigger('MultiQuoteComplete');
                        }
                    }
                );
            }
            return false;
        });
    };
    // *********************************************************************
    XenForo.InlineMessageEditor = function($form)
    {
        new XenForo.MultiSubmitFix($form);
        $form.bind(
        {
            AutoValidationBeforeSubmit: function(e)
            {
                if ($(e.clickedSubmitButton).is('input[name="more_options"]'))
                {
                    e.preventDefault();
                    e.returnValue = true;
                }
            },
            AutoValidationComplete: function(e)
            {
                var overlay = $form.closest('div.xenOverlay').data('overlay'),
                    target = overlay.getTrigger().data('target');
                if (XenForo.hasTemplateHtml(e.ajaxData, 'messagesTemplateHtml') || XenForo.hasTemplateHtml(e.ajaxData))
                {
                    e.preventDefault();
                    overlay.close().getTrigger().data('XenForo.OverlayTrigger').deCache();
                    XenForo.showMessages(e.ajaxData, overlay.getTrigger(), 'instant');
                }
                else
                {
                    console.warn('No template HTML!');
                }
            }
        });
    };
    // *********************************************************************
    XenForo.NewMessageLoader = function($ctrl)
    {
        $ctrl.click(function(e) {
            e.preventDefault();
            XenForo.ajax(
                $ctrl.data('href') || $ctrl.attr('href'),
                {},
                function(ajaxData) {
                    if (XenForo.hasResponseError(ajaxData))
                    {
                        return false;
                    }
                    var $form = $('#QuickReply'),
                        $messageList = $('#messageList');
                    $('input[name="last_date"]', $form).val(ajaxData.lastDate);
                    new XenForo.ExtLoader(ajaxData, function()
                    {
                        $messageList.find('.messagesSinceReplyingNotice').remove();
                        $(ajaxData.templateHtml).each(function()
                        {
                            if (this.tagName)
                            {
                                $(this).xfInsert('appendTo', $messageList);
                            }
                        });
                    });
                }
            )
        });
    };
    // *********************************************************************
    XenForo.MessageLoader = function($ctrl)
    {
        $ctrl.click(function(e)
        {
            e.preventDefault();
            var messageIds = [];
            $($ctrl.data('messageselector')).each(function(i, msg)
            {
                messageIds.push(msg.id);
            });
            if (messageIds.length)
            {
                XenForo.ajax
                (
                    $ctrl.attr('href'),
                    {
                        messageIds: messageIds
                    },
                    function(ajaxData, textStatus)
                    {
                        XenForo.showMessages(ajaxData, $ctrl, 'fadeDown');
                    }
                );
            }
            else
            {
                console.warn('No messages found to load.'); // debug message, no phrasing
            }
        });
    };
    // *********************************************************************
    XenForo.showMessages = function(ajaxData, $ctrl, method)
    {
        var showMessage = function(selector, templateHtml)
        {
            switch (method)
            {
                case 'instant':
                {
                    method =
                    {
                        show: 'xfShow',
                        hide: 'xfHide',
                        speed: 0
                    };
                    break;
                }
                case 'fadeIn':
                {
                    method =
                    {
                        show: 'xfFadeIn',
                        hide: 'xfFadeOut',
                        speed: XenForo.speed.fast
                    };
                    break;
                }
                case 'fadeDown':
                default:
                {
                    method =
                    {
                        show: 'xfFadeDown',
                        hide: 'xfFadeUp',
                        speed: XenForo.speed.normal
                    };
                }
            }
            $(selector)[method.hide](method.speed / 2, function()
            {
                $(templateHtml).xfInsert('replaceAll', selector, method.show, method.speed);
            });
        };
        if (XenForo.hasResponseError(ajaxData))
        {
            return false;
        }
        if (XenForo.hasTemplateHtml(ajaxData, 'messagesTemplateHtml'))
        {
            new XenForo.ExtLoader(ajaxData, function()
            {
                $.each(ajaxData.messagesTemplateHtml, showMessage);
            });
        }
        else if (XenForo.hasTemplateHtml(ajaxData))
        {
            // single message
            new XenForo.ExtLoader(ajaxData, function()
            {
                showMessage($ctrl.data('messageselector'), ajaxData.templateHtml);
            });
        }
    };
    // *********************************************************************
    XenForo.PollVoteForm = function($form)
    {
        $form.bind('AutoValidationComplete', function(e)
        {
            e.preventDefault();
            if (XenForo.hasTemplateHtml(e.ajaxData))
            {
                var $container = $($form.data('container'));
                $form.xfFadeUp(XenForo.speed.normal, function()
                {
                    $form.empty().remove();
                    var $html = $(e.ajaxData.templateHtml);
                    if ($html.is($form.data('container')))
                    {
                        $html = $html.children();
                    }
                    else if ($html.find($form.data('container')).length)
                    {
                        $html = $html.find($form.data('container'));
                    }
                    $html.xfInsert('appendTo', $container);
                }, XenForo.speed.normal, 'swing');
            }
        });
    };
    // *********************************************************************
    XenForo.MultiQuote = function($button) { this.__construct($button); };
    XenForo.MultiQuote.prototype =
    {
        __construct: function($button)
        {
            this.$button = $button;
            this.$form = $button.closest('form');
            this.cookieName = $button.data('mq-cookie') || 'MultiQuote';
            this.cookieValue = [];
            this.submitUrl = $button.data('submiturl');
            this.$controls = new jQuery();
            this.getCookieValue();
            this.setButtonState();
            var self = this;
            this.$form.bind('MultiQuoteComplete', $.context(this, 'reset'));
            this.$form.bind('MultiQuoteRemove MultiQuoteAdd', function(e, data)
            {
                if (data && data.messageId)
                {
                    self.toggleControl(data.messageId, e.type == 'MultiQuoteAdd');
                }
            });
        },
        getCookieValue: function()
        {
            var cookieString = $.getCookie(this.cookieName);
            this.cookieValue = (cookieString == null ? [] : cookieString.split(','));
        },
        setButtonState: function()
        {
            this.getCookieValue();
            if (this.cookieValue.length)
            {
                this.$button.show();
            }
            else
            {
                this.$button.hide();
            }
        },
        addControl: function($control)
        {
            $control.click($.context(this, 'clickControl'));
            this.getCookieValue();
            this.setControlState($control, ($.inArray($control.data('messageid') + '', this.cookieValue) >= 0), true);
            this.$controls = this.$controls.add($control);
        },
        setControls: function()
        {
            var MQ = this;
            MQ.getCookieValue();
            this.$controls.each(function()
            {
                MQ.setControlState($(this), ($.inArray($(this).data('messageid') + '', MQ.cookieValue) >= 0));
            });
        },
        setControlState: function($control, isActive, isInitial)
        {
            var text, $button = this.$button, classExpected;
            if (isActive)
            {
                text = $button.data('remove') || '-';
                classExpected = true;
            }
            else
            {
                text = $button.data('add') || '+';
                classExpected = false;
            }
            if (!isInitial || $control.hasClass('active') !== classExpected)
            {
                $control
                    .toggleClass('active', isActive)
                    .find('span.symbol').text(text);
            }
        },
        clickControl: function(e)
        {
            e.preventDefault();
            var $control = $(e.target).closest('a.MultiQuoteControl'),
                newActive = !$control.is('.active'),
                message = this.$button.data(newActive ? 'add-message' : 'remove-message');
            this.toggleControl($control.data('messageid'), newActive);
            if (message)
            {
                XenForo.alert(message, '', 2000);
            }
        },
        toggleControl: function(itemId, active)
        {
            this.getCookieValue();
            itemId += '';
            var i = $.inArray(itemId, this.cookieValue),
                $control;
            $control = this.$controls.filter(function()
            {
                return $(this).data('messageid') == itemId;
            }).first();
            if (active)
            {
                if ($control.length)
                {
                    this.setControlState($control, true);
                }
                // add to cookie
                if (i < 0)
                {
                    this.cookieValue.push(itemId);
                }
            }
            else
            {
                if ($control.length)
                {
                    this.setControlState($control, false);
                }
                // remove from cookie
                if (i >= 0)
                {
                    this.cookieValue.splice(i, 1);
                }
            }
            if (this.cookieValue.length > 0)
            {
                $.setCookie(this.cookieName, this.cookieValue.join(','));
            }
            else
            {
                $.deleteCookie(this.cookieName);
            }
            this.setButtonState();
        },
        reset: function()
        {
            $.deleteCookie(this.cookieName);
            this.cookieValue = [];
            this.setControls();
            this.setButtonState();
        }
    };
    // *********************************************************************
    /**
     * Handles adding and removing messages from multi-quote
     */
    XenForo.MultiQuoteControl = function($link)
    {
        var mqSelector = $link.data('mq-target') || '#MultiQuote',
            mq = $(mqSelector).data('XenForo.MultiQuote');
        if (!mq)
        {
            return;
        }
        mq.addControl($link);
    };
    /**
     * Handles removal of quotes from the multi-quote overlay
     */
    XenForo.MultiQuoteRemove = function($link)
    {
        $link.click(function()
        {
            var $container = $link.closest('.MultiQuoteItem'),
                messageId = $container.find('.MultiQuoteId').val(),
                $watcherForm = $($('#MultiQuoteForm').data('form')),
                $overlay = $link.closest('.xenOverlay');
            if (messageId)
            {
                $watcherForm.trigger('MultiQuoteRemove', {messageId: messageId});
            }
            $container.remove();
            if ($overlay.length && !$overlay.find('.MultiQuoteItem').length)
            {
                $overlay.overlay().close();
            }
        });
    };
    XenForo.MultiQuoteInsert = function($trigger)
    {
        /**
         * Activates quick reply and quotes the post to which the trigger belongs
         *
         * @param e event
         *
         * @return boolean false
         */
        $trigger.click(function(e)
        {
            var $form = $($trigger.data('form')),
                xhr = null;
            if (!xhr)
            {
                xhr = XenForo.ajax(
                    $trigger.attr('href'),
                    {
                        postIds: $($trigger.data('inputs')).map(function()
                        {
                            return this.value;
                        }).get()
                    },
                    function(ajaxData, textStatus)
                    {
                        if (XenForo.hasResponseError(ajaxData))
                        {
                            return false;
                        }
                        delete(xhr);
                        var ed = XenForo.getEditorInForm($form);
                        if (!ed)
                        {
                            return false;
                        }
                        if (ed.$editor)
                        {
                            ed.insertHtml(ajaxData.quoteHtml);
                            if (ed.$editor.data('xenForoElastic'))
                            {
                                ed.$editor.data('xenForoElastic')();
                            }
                        }
                        else
                        {
                            ed.val(ed.val() + ajaxData.quote);
                        }
                        if ($trigger.is('.MultiQuote'))
                        {
                            // reset cookie and checkboxes
                            $form.trigger('MultiQuoteComplete');
                        }
                    }
                );
            }
            return false;
        });
    };
    // *********************************************************************
    XenForo.Sortable = function($container)
    {
        $container.sortable(
        {
            forcePlaceholderSize: true
        }).bind(
            {
                'sortupdate': function(e) {},
                'dragstart' : function(e)
                {
                    console.log('drag start, %o', e.target);
                },
                'dragend' : function(e) { console.log('drag end'); }
            }
        );
    };
    // *********************************************************************
    XenForo.register('#QuickReply', 'XenForo.QuickReply');
    XenForo.register('a.ReplyQuote, a.MultiQuote', 'XenForo.QuickReplyTrigger');
    XenForo.register('form.InlineMessageEditor', 'XenForo.InlineMessageEditor');
    XenForo.register('a.MessageLoader', 'XenForo.MessageLoader');
    XenForo.register('a.NewMessageLoader', 'XenForo.NewMessageLoader');
    XenForo.register('form.PollVoteForm', 'XenForo.PollVoteForm');
    XenForo.register('.MultiQuoteWatcher', 'XenForo.MultiQuote');
    XenForo.register('a.MultiQuoteControl', 'XenForo.MultiQuoteControl');
    XenForo.register('a.MultiQuoteRemove', 'XenForo.MultiQuoteRemove');
    XenForo.register('.Sortable', 'XenForo.Sortable');
}
(jQuery, this, document);
?>