Вход Регистрация
Файл: js/xenforo/full/attachment_editor.js
Строк: 632
<?php
/** @param {jQuery} $ jQuery Object */
!function($, window, document, _undefined)
{
    
// *********************************************************************

    
var insertSpeed = XenForo.speed.normal,
        
removeSpeed = XenForo.speed.fast;

    
XenForo.AttachmentUploader = function($container)
    {
        var 
$trigger = $($container.data('trigger')),
            
$form = $container.closest('form'),

            
// SWFUpload-related
            
$placeholder = $($container.data('placeholder')),
            
postParams = {},
            
swfUploader = null,
            
swfAlert = null,
            
maxFileSize = $container.data('maxfilesize'),
            
maxUploads = $container.data('maxuploads'),
            
extensions = $container.data('extensions'),
            
uniqueKey = $container.data('uniquekey');

        
// --------------------------------------

        // un-hide the upload button
        
$container.show();

        var 
flashUrl = XenForo.canonicalizeUrl($container.data('flashurl') || 'js/swfupload/Flash/swfupload.swf');

        
console.info('flash url: %s', flashUrl);

        
// Attempt to init SWFUpload
        
if (typeof SWFUpload == 'function' && !window.navigator.userAgent.match(/Android|iOS|iPhone|iPad|Mobile Safari/i))
        {
            
swfUploader = new SWFUpload(
            {
                
upload_url: $container.data('action'),

                
file_post_name: $container.data('postname'),
                
file_types: '*.' + (extensions.toLowerCase() + ',' + extensions.toUpperCase()).replace(/,/g, ';*.'),

                
/*file_upload_limit: maxUploads,
                file_quote_limit: maxUploads,*/
                // commented out as the behavior of triggering an error with no uploads is possibly more annoying
                // TODO: different approach: upload up to limit and ignore the rest

                
post_params: $.extend(
                {
                    
_xfToken: XenForo._csrfToken,
                    
_xfNoRedirect: 1,
                    
_xfResponseType: 'json'
                
}, postParams),

                
button_placeholder_id: $placeholder.attr('id'),
                
button_width: 1,
                
button_height: 1,

                
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
                
button_cursor: SWFUpload.CURSOR.HAND,

                
flash_url: flashUrl,
                
prevent_swf_caching: false,

                
swfupload_loaded_handler: function()
                {
                    
// give the button its correct dimensions
                    
this.setButtonDimensions($trigger.outerWidth(), $trigger.outerHeight());
                    $(
this.movieElement).css('top', $trigger.position().top);

                    
// add extra post params
                    
$container.find('.HiddenInput').each(function(i, element)
                    {
                        
swfUploader.addPostParam($(element).data('name'), $(element).data('value'));
                    });

                    
// Keep the CSRF token and the session ID up to date
                    
$(document).bind('CSRFRefresh', function(e)
                    {
                        if (
e.ajaxData)
                        {
                            
swfUploader.addPostParam('_xfToken', e.ajaxData.csrfToken);
                            
swfUploader.addPostParam('_xfSessionId', e.ajaxData.sessionId);
                        }
                    });
                },

                
/**
                 * Fires when the file selction dialog is closed
                 *
                 * @param integer Number of files selected
                 * @param integer Number of files queued
                 */
                
file_dialog_complete_handler: function(numSelected, numQueued)
                {
                    try
                    {
                        if (
this.getStats().files_queued > 0)
                        {
                            
this.startUpload(this.getFile(0).ID);
                        }
                    }
                    catch (
exception)
                    {
                        
this.debug(exception);
                    }
                },

                
/**
                 * Fires when a file is added to the upload queue
                 *
                 * @param SWFUpload.File
                 */
                
file_queued_handler: function(file)
                {
                    var 
isImage;

                    switch (
file.name.substr(file.name.lastIndexOf('.')).toLowerCase())
                    {
                        case 
'.jpg':
                        case 
'.jpeg':
                        case 
'.jpe':
                        case 
'.png':
                        case 
'.gif':
                        {
                            
isImage = true;
                            break;
                        }

                        default:
                        {
                            
isImage = false;
                        }
                    }

                    var 
event = $.Event('AttachmentQueueValidation');
                    
event.file = file;
                    
event.swfUpload = this;
                    
event.isImage = isImage;
                    
$container.trigger(event);

                    if (
event.isDefaultPrevented())
                    {
                        return;
                    }

                    if (
file.size > maxFileSize && !isImage) // allow web images to bypass the file size check, as they (may) be resized on the server
                    
{
                        
// non image type, abort the upload with a file-too-large error
                        
this.cancelUpload(file.id, false);
                        if (
typeof this.settings.file_queue_error_handler == 'function')
                        {
                            
this.settings.file_queue_error_handler.call(
                                
this, file, SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT, 'The uploaded file is too large.'
                            
);
                        }
                        return;
                    }

                    
event = $.Event('AttachmentQueued');
                    
event.file = file;
                    
event.swfUpload = this;
                    
event.isImage = isImage;
                    
$container.trigger(event);
                },

                
/**
                 * Fires when a file fails to be queued
                 *
                 * @param SWFUpload.File
                 * @param integer Error code
                 * @param string Message
                 */
                
file_queue_error_handler: function(file, errorCode, message)
                {
                    var 
$event = $.Event('AttachmentQueueError');
                    
$event.file = file;
                    
$event.errorCode = errorCode;
                    
$event.message = message;
                    
$event.swfUpload = this;

                    
$container.trigger($event);

                    if (!
$event.isDefaultPrevented())
                    {
                        
swfAlert(file, errorCode, message);
                    }
                },

                
/**
                 * Fires when a file upload begins
                 *
                 * @param SWFUpload.File
                 */
                
upload_start_handler: function(file)
                {
                    
console.log('Uploading %s', file.name);
                },

                
/**
                 * Fires upon receiving a progress update
                 *
                 * @param SWFUpload.File
                 * @param integer Bytes uploaded so far
                 */
                
upload_progress_handler: function(file, bytes)
                {
                    
$container.trigger(
                    {
                        
type: 'AttachmentUploadProgress',
                        
file: file,
                        
bytes: bytes,
                        
swfUpload: this
                    
});
                },

                
/**
                 * Fires when receiving an upload success code from the server
                 *
                 * @param SWFUpload.File
                 * @param string Server response text
                 * @param string Server response status
                 */
                
upload_success_handler: function(file, serverData, status)
                {
                    try
                    {
                        var 
ajaxData = $.parseJSON(serverData);
                    }
                    catch (
exception)
                    {
                        
console.warn(exception);
                        return;
                    }

                    if (
ajaxData.error)
                    {
                        
$container.trigger(
                        {
                            
type: 'AttachmentUploadError',
                            
file: file,
                            
ajaxData: ajaxData,
                            
swfUpload: this
                        
});
                    }
                    else
                    {
                        
$container.trigger(
                        {
                            
type: 'AttachmentUploaded',
                            
file: file,
                            
ajaxData: ajaxData,
                            
swfUpload: this
                        
});
                    }
                },

                
upload_error_handler: function(file, errorCode, message)
                {
                    if (
errorCode == SWFUpload.UPLOAD_ERROR.FILE_CANCELLED)
                    {
                        return;
                    }

                    
console.warn('Upload failed: %o', arguments);

                    
$container.trigger(
                    {
                        
type: 'AttachmentUploadError',
                        
file: file,
                        
errorCode: errorCode,
                        
message: message,
                        
ajaxData: { error: [ $container.data('err-unknown') ] },
                        
swfUpload: this
                    
});
                },

                
/**
                 * Fires when an upload is completed, either success or failure
                 *
                 * @param SWFUpload.File
                 */
                
upload_complete_handler: function(file)
                {
                    try
                    {
                        if (
this.getStats().files_queued > 0)
                        {
                            
this.startUpload(this.getFile(0).ID);
                        }
                        else
                        {
                            
console.info('All files uploaded.');
                        }
                    }
                    catch (
exception)
                    {
                        
this.debug(exception);
                    }
                }
            });

            
/**
             * Fires a phrased error
             *
             * @param SWFUpload.File
             * @param integer
             * @param string
             */
            
swfAlert = function(file, errorCode, message)
            {
                var 
messageText = $container.data('err' + errorCode) || message;

                if (
file)
                {
                    
XenForo.alert(messageText + '<br /><br />' + file.name);
                }
                else
                {
                    
XenForo.alert(messageText);
                }
            };
        }

        
/**
         * Bind to the AutoInlineUploadEvent of the document, just in case SWFUpload failed
         */
        
$(document).bind('AutoInlineUploadComplete', function(e)
        {
            if (
uniqueKey && e.ajaxData && uniqueKey !== e.ajaxData.key)
            {
                return 
false;
            }

            var 
$target = $(e.target);

            if (
$target.is('form.AttachmentUploadForm'))
            {
                if (
$trigger.overlay())
                {
                    
$trigger.overlay().close();
                }

                
$container.trigger(
                {
                    
type: 'AttachmentUploaded',
                    
ajaxData: e.ajaxData
                
});

                return 
false;
            }
        });

        return {
            
getSwfUploader: function()
            {
                return 
swfUploader;
            },
            
swfAlert: swfAlert
        
};
    };

    
// *********************************************************************

    
XenForo.AttachmentEditor = function($editor)
    {
        
this.setVisibility = function(instant)
        {
            var 
$hideElement = $editor.closest('.ctrlUnit'),
                
$insertAll = $editor.find('.AttachmentInsertAllBlock'),
                
$files = $editor.find('.AttachedFile:not(#AttachedFileTemplate)'),
                
$images = $files.filter('.AttachedImage');

            
console.log('Attachments changed, total files: %d, images: %d', $files.length, $images.length);

            if (
$hideElement.length == 0)
            {
                
$hideElement = $editor;
            }

            if (
instant === true)
            {
                if (
$files.length)
                {
                    if (
$images.length > 1)
                    {
                        
$insertAll.show();
                    }
                    else
                    {
                        
$insertAll.hide();
                    }

                    
$hideElement.show();
                }
                else
                {
                    
$hideElement.hide();
                }
            }
            else
            {
                if (
$files.length)
                {
                    if (
$images.length > 1)
                    {
                        if (
$hideElement.is(':hidden'))
                        {
                            
$insertAll.show();
                        }
                        else
                        {
                            
$insertAll.xfFadeDown(XenForo.speed.fast);
                        }
                    }
                    else
                    {
                        if (
$hideElement.is(':hidden'))
                        {
                            
$insertAll.hide();
                        }
                        else
                        {
                            
$insertAll.xfFadeUp(XenForo.speed.fast, false, XenForo.speed.fast, 'swing');
                        }
                    }

                    
$hideElement.xfFadeDown(XenForo.speed.normal);
                }
                else
                {
                    
$insertAll.slideUp(XenForo.speed.fast);

                    
$hideElement.xfFadeUp(XenForo.speed.normal, false, false, 'swing');
                }
            }
        };

        
this.setVisibility(true);

        $(
'#AttachmentUploader').bind(
        {
            
/**
             * Fires when a file is added to the upload queue
             *
             * @param event Including e.file
             */
            
AttachmentQueued: function(e)
            {
                
console.info('Queued file %s (%d bytes).', e.file.name, e.file.size);

                var 
$template = $('#AttachedFileTemplate').clone().attr('id', e.file.id);

                
$template.find('.Filename').text(e.file.name);
                
$template.find('.ProgressCounter').text('0%');
                
$template.find('.ProgressGraphic span').css('width', '0%');

                if (
e.isImage)
                {
                    
$template.addClass('AttachedImage');
                }

                
$template.xfInsert('appendTo', '.AttachmentList.New', null, insertSpeed);

                
$template.find('.AttachmentCanceller').css('display', 'block').click(function()
                {
                    
e.swfUpload.cancelUpload(e.file.id);
                    
$template.xfRemove(null, function() {
                        
$editor.trigger('AttachmentsChanged');
                    }, 
removeSpeed, 'swing');
                });

                
$editor.trigger('AttachmentsChanged');
            },

            
/**
             * Fires when an upload progress update is received
             *
             * @param event Including e.file and e.bytes
             */
            
AttachmentUploadProgress: function(e)
            {
                
console.log('Uploaded %d/%d bytes.', e.bytes, e.file.size);

                var 
percentNum = Math.min(100, Math.ceil(e.bytes * 100 / e.file.size)),
                    
percentage = percentNum + '%',
                    
$placeholder = $('#' + e.file.id),
                    
$counter = $placeholder.find('.ProgressCounter'),
                    
$graphic = $placeholder.find('.ProgressGraphic');

                
$counter.text(percentage);
                
$graphic.css('width', percentage);

                if (
percentNum >= 100)
                {
                    
$placeholder.find('.AttachmentCanceller').prop('disabled', true).addClass('disabled');
                }

                if (
$graphic.width() > $counter.outerWidth())
                {
                    
$counter.appendTo($graphic);
                }
            },

            
/**
             * Fires if an error occurs during the upload
             *
             * @param event
             */
            
AttachmentUploadError: function(e)
            {
                var 
error = '';

                $.
each(e.ajaxData.error, function(i, errorText) { error += errorText + "n"; });

                
XenForo.alert(error + '<br /><br />' + e.file.name);

                $(
'#' + e.file.id).xfRemove();

                
console.warn('AttachmentUploadError: %o', e);
            },

            
/**
             * Fires when a file has been successfully uploaded
             *
             * @param event
             */
            
AttachmentUploaded: function(e)
            {
                if (
e.file) // SWFupload method
                
{
                    var 
$attachment = $('#' + e.file.id),
                        
$attachmentText = $attachment.find('.AttachmentText'),
                        
$templateHtml = $(e.ajaxData.templateHtml),
                        
$thumbnail;

                    
$attachmentText.fadeOut(XenForo.speed.fast, function()
                    {
                        
$templateHtml.find('.AttachmentText').xfInsert('insertBefore', $attachmentText, 'fadeIn', XenForo.speed.fast);

                        
$thumbnail = $attachment.find('.Thumbnail');
                        
$thumbnail.html($templateHtml.find('.Thumbnail').html());
                        
//XenForo.activate($thumbnail);

                        
$attachmentText.xfRemove();

                        
$attachment.attr('id', 'attachment' + e.ajaxData.attachment_id);
                    });
                }
                else 
// regular javascript method
                
{
                    var 
$attachment = $('#attachment' + e.ajaxData.attachment_id);

                    if (!
$attachment.length)
                    {
                        
$attachment = $(e.ajaxData.templateHtml).xfInsert('appendTo', $editor.find('.AttachmentList.New'), null, insertSpeed);
                    }
                }

                
$editor.trigger('AttachmentsChanged');
            }
        });

        var 
thisVis = $.context(this, 'setVisibility');

        $(
'#QuickReply').bind('QuickReplyComplete', function(e)
        {
            
$editor.find('.AttachmentList.New li:not(#AttachedFileTemplate)').xfRemove(null, thisVis);
        });

        
$editor.bind('AttachmentsChanged', thisVis);
    };

    
// *********************************************************************

    
XenForo.AttachmentInserter = function($trigger)
    {
        
$trigger.click(function(e)
        {
            var 
$attachment = $trigger.closest('.AttachedFile').find('.Thumbnail a'),
                
attachmentId = $attachment.data('attachmentid'),
                 
editor,
                
bbcode,
                
html,
                
thumb = $attachment.find('img').attr('src'),
                
img = $attachment.attr('href');

            
e.preventDefault();

            if (
$trigger.attr('name') == 'thumb')
            {
                
bbcode = '[ATTACH]' + attachmentId + '[/ATTACH] ';
                
html = '<img src="' + thumb + '" class="attachThumb bbCodeImage" alt="attachThumb' + attachmentId + '" /> ';
            }
            else
            {
                
bbcode = '[ATTACH=full]' + attachmentId + '[/ATTACH] ';
                
html = '<img src="' + img + '" class="attachFull bbCodeImage" alt="attachFull' + attachmentId + '" /> ';
            }

            var 
editor = XenForo.getEditorInForm($trigger.closest('form'), ':not(.NoAttachment)');
            if (
editor)
            {
                if (
editor.$editor)
                {
                    
editor.insertHtml(html);
                    var 
update = editor.$editor.data('xenForoElastic');
                    if (
update)
                    {
                        
setTimeout(function() { update(); }, 250);
                        
setTimeout(function() { update(); }, 1000);
                    }
                }
                else
                {
                    
editor.val(editor.val() + bbcode);
                }
            }
        });
    };

    
// *********************************************************************

    
XenForo.AttachmentDeleter = function($trigger)
    {
        
$trigger.css('display', 'block').click(function(e)
        {
            var 
$trigger = $(e.target),
                
href = $trigger.attr('href') || $trigger.data('href'),
                
$attachment = $trigger.closest('.AttachedFile'),
                
$thumb = $trigger.closest('.AttachedFile').find('.Thumbnail a'),
                
attachmentId = $thumb.data('attachmentid');

            if (
href)
            {
                
$attachment.xfFadeUp(XenForo.speed.normal, null, removeSpeed, 'swing');

                
XenForo.ajax(href, '', function(ajaxData, textStatus)
                {
                    if (
XenForo.hasResponseError(ajaxData))
                    {
                        
$attachment.xfFadeDown(XenForo.speed.normal);
                        return 
false;
                    }

                    var 
$editor = $attachment.closest('.AttachmentEditor');

                    
$attachment.xfRemove(null, function() {
                        
$editor.trigger('AttachmentsChanged');
                    }, 
removeSpeed, 'swing');
                });

                if (
attachmentId)
                {
                    var 
editor = XenForo.getEditorInForm($trigger.closest('form'), ':not(.NoAttachment)');
                    if (
editor && editor.$editor)
                    {
                        
editor.$editor.find('img[alt=attachFull' + attachmentId + '], img[alt=attachThumb' + attachmentId + ']').remove();
                        var 
update = editor.$editor.data('xenForoElastic');
                        if (
update)
                        {
                            
update();
                        }
                    }
                }

                return 
false;
            }

            
console.warn('Unable to locate href for attachment deletion from %o', $trigger);
        });
    };

    
// *********************************************************************

    
XenForo.AttachmentInsertAll = function($trigger)
    {
        
$trigger.click(function()
        {
            $(
'.AttachmentInserter[name=' + $trigger.attr('name') + ']').each(function(i, input)
            {
                $(
input).trigger('click');
            });
        });
    };

    
// *********************************************************************

    
XenForo.AttachmentDeleteAll = function($trigger)
    {
        
$trigger.click(function()
        {
            
// TODO: This is a fairly horrible way of doing this, but it's going to be used very infrequently.
            
$('.AttachmentDeleter').each(function(i, input)
            {
                $(
input).trigger('click');
            });
        });
    };

    
// *********************************************************************

    
XenForo.register('.AttachmentUploader', 'XenForo.AttachmentUploader');

    
XenForo.register('.AttachmentEditor', 'XenForo.AttachmentEditor');

    
XenForo.register('.AttachmentInserter', 'XenForo.AttachmentInserter');

    
XenForo.register('.AttachmentDeleter', 'XenForo.AttachmentDeleter');

    
XenForo.register('.AttachmentInsertAll', 'XenForo.AttachmentInsertAll');

    
XenForo.register('.AttachmentDeleteAll', 'XenForo.AttachmentDeleteAll');

}
(
jQuery, this, document);
?>
Онлайн: 2
Реклама