var Post = { init: function () { $(function () { Post.fileInput = $("input[name='attachments[]']"); Post.dropZone = $('#dropzone'); Post.dropZone.find('div').text(lang.drop_files); Post.form = Post.fileInput.parents('form'); Post.form.on('submit', Post.checkAttachments); Post.fileInput.on('change', Post.addAttachments); Post.dropZone.on('drag', function (e) { e.preventDefault(); }); Post.dropZone.on('dragstart', function (e) { e.preventDefault(); e.originalEvent.dataTransfer.setData('text/plain', ''); }); Post.dropZone.on('dragover dragenter', function (e) { e.preventDefault(); $(this).addClass('activated').find('div').text(lang.upload_initiate); }); Post.dropZone.on('dragleave dragend', function (e) { e.preventDefault(); $(this).removeClass('activated').find('div').text(lang.drop_files); }); Post.dropZone.on('click', function () { Post.fileInput.trigger('click'); }); Post.dropZone.on('drop', function (e) { e.preventDefault(); $(this).removeClass('activated'); var files = e.originalEvent.dataTransfer.files; Post.fileInput.prop('files', files).trigger('change'); }); Post.fileInput.parents().eq(1).hide(); Post.dropZone.parents().eq(1).show(); // prevent SCEditor from inserting [img] with data URI var $message = document.querySelector('#message'); if ($message !== null) { new MutationObserver(function () { // run once #message is hidden by SCEditor, and the MyBBEditor instance becomes available if (typeof MyBBEditor !== 'undefined' && MyBBEditor !== null) { MyBBEditor.bind('valuechanged', function () { var oldValue = MyBBEditor.val(); var newValue = oldValue.replace(/\[img]data:[a-z/]+;base64,[A-Za-z0-9+\/]+={0,2}\[\/img]/, ''); if (oldValue !== newValue) { MyBBEditor.val(newValue); } }); } }).observe($message, {attributes: true}); } }); }, loadMultiQuoted: function () { if (use_xmlhttprequest == 1) { tid = document.input.tid.value; $.ajax({ url: 'xmlhttp.php?action=get_multiquoted&tid=' + tid, type: 'get', complete: function (request, status) { Post.multiQuotedLoaded(request, status); } }); return false; } else { return true; } }, loadMultiQuotedAll: function () { if (use_xmlhttprequest == 1) { $.ajax({ url: 'xmlhttp.php?action=get_multiquoted&load_all=1', type: 'get', complete: function (request, status) { Post.multiQuotedLoaded(request, status); } }); return false; } else { return true; } }, multiQuotedLoaded: function (request) { var json = JSON.parse(request.responseText); if (typeof response == 'object') { if (json.hasOwnProperty("errors")) { $.each(json.errors, function (i, message) { $.jGrowl(lang.post_fetch_error + ' ' + message, { theme: 'jgrowl_error' }); }); return false; } } var id = 'message'; if (typeof MyBBEditor !== 'undefined' && MyBBEditor !== null) { MyBBEditor.insert(json.message); } else { if ($('#' + id).value) { $('#' + id).value += "\n"; } $('#' + id).val($('#' + id).val() + json.message); } $('#multiquote_unloaded').hide(); document.input.quoted_ids.value = 'all'; }, clearMultiQuoted: function () { $('#multiquote_unloaded').hide(); Cookie.unset('multiquote'); }, removeAttachment: function (aid) { MyBB.prompt(removeattach_confirm, { buttons: [ { title: yes_confirm, value: true }, { title: no_confirm, value: false } ], submit: function (e, v, m, f) { if (v == true) { Post.attachmentAction(aid, 'remove'); if (use_xmlhttprequest != 1) { Post.form.append(''); $('#rem_submit').trigger('click'); return false; } $.ajax({ type: 'POST', url: Post.form.attr('action') + '&ajax=1', data: Post.form.serialize(), success: function (data) { if (data.hasOwnProperty("errors")) { $.each(data.errors, function (i, message) { $.jGrowl(message, { theme: 'jgrowl_error' }); }); return false; } else if (data.success) { $('#attachment_' + aid).hide(500, function () { var instance = MyBBEditor; if (typeof MyBBEditor === 'undefined') { instance = $('#message').sceditor('instance'); } if (instance.sourceMode()) { instance.setSourceEditorValue(instance.getSourceEditorValue(false).split('[attachment=' + aid + ']').join('')); } else { instance.setWysiwygEditorValue(instance.getWysiwygEditorValue(false).split('[attachment=' + aid + ']').join('')); } $(this).parent().find('.tcat>strong').text(data.usage); $(this).remove(); Post.regenAttachbuttons(); }); } Post.attachmentAction('', ''); } }); } } }); return false; }, attachmentAction: function (aid, action) { document.input.attachmentaid.value = aid; document.input.attachmentact.value = action; }, getAttachments: function () { var attached = []; $('.attachment_filename').each(function () { attached.push($(this).text()); }); return attached; }, getCommonFiles: function () { var files = Post.fileInput.prop('files'); if (files.length) { var names = $.map(files, function (val) { return val.name; }); return $.grep(Post.getAttachments(), function (i) { return $.inArray(i, names) > -1; }); } else { return []; } }, addAttachments: function () { Post.checkAttachments(); if (Post.fileInput.prop('files').length) { var common = Post.getCommonFiles(); if (common.length) { var list = document.createElement('ul'); $.map(common, function (val) { var e = document.createElement('li'); e.textContent = val; list.append(e); }); MyBB.prompt(lang.update_confirm.replace("{1}", list.outerHTML), { buttons: [ { title: yes_confirm, value: true }, { title: no_confirm, value: false } ], submit: function (e, v, m, f) { if (v == true) { Post.form.append(''); Post.uploadAttachments('updateattachment'); } } }); } else { Post.uploadAttachments('newattachment'); } } return false; }, uploadAttachments: function (type) { if (use_xmlhttprequest != 1) { $("input[name='" + type + "']").trigger('click'); } else { Post.form.append(''); var formData = new FormData($(Post.form)[0]); $.ajax({ xhr: function () { var x = $.ajaxSettings.xhr(); x.upload.addEventListener("progress", function (e) { if (e.lengthComputable) { var completed = parseFloat((e.loaded / e.total) * 100).toFixed(2); $('#upload_bar').css('width', completed + '%'); Post.dropZone.find('div').text(completed + '%'); if (e.loaded === e.total) { $('#upload_bar').css('width', '0%'); Post.dropZone.find('div').text(lang.drop_files); } } }, false); return x; }, type: 'POST', url: Post.form.attr('action') + '&ajax=1', data: formData, async: true, cache: false, contentType: false, enctype: 'multipart/form-data', processData: false, success: function (data) { if (data.hasOwnProperty("errors")) { $.each(data.errors, function (i, message) { $.jGrowl(message, { theme: 'jgrowl_error' }); }); } // Append new attachment data if (data.hasOwnProperty("success")) { $.each(data.success, function (i, message) { if ($('#attachment_' + message[0]).length) { $('#attachment_' + message[0]).remove(); } Post.fileInput.parents().eq(2).append(data.template .replace(/\{1\}/g, message[0]) .replace('{2}', message[1]) .replace('{3}', message[2]) .replace('{4}', message[3])) .find('.tcat>strong').text(data.usage); }); } Post.fileInput.val(''); Post.regenAttachbuttons(); } }); $('.temp_input').remove(); } }, regenAttachbuttons: function () { var attachButton = $("input[name=newattachment], input[name=updateattachment]").eq(0).clone(); if (Post.getAttachments().length) { if (!$('input[name=updateattachment]').length) { var updateButton = attachButton.clone() .prop('name', 'updateattachment') .prop('value', lang.update_attachment) .prop('tabindex', '12'); $("input[name='newattachment']").before(updateButton).before(' '); } } else { $('input[name=updateattachment]').remove(); } if (Post.getAttachments().length < mybb_max_file_uploads) { if (!$('input[name=newattachment]').length) { var newButton = attachButton.clone() .prop('name', 'newattachment') .prop('value', lang.add_attachment) .prop('tabindex', '13'); $("input[name='updateattachment']").after(newButton).after(' '); } } else { $('input[name=newattachment]').remove(); } }, checkAttachments: function (e) { var submitter = ($.type(e) === 'undefined') ? '' : e.originalEvent.submitter.name; var file = Post.fileInput[0]; if (!file) { return true; } if (!file.files.length && (submitter == 'newattachment' || submitter == 'updateattachment')) { $.jGrowl(lang.attachment_missing, { theme: 'jgrowl_error' }); return false; } if (mybb_max_file_uploads != 0) { var common = Post.getCommonFiles().length; var moreAllowed = (mybb_max_file_uploads - (Post.getAttachments().length - common)); if (moreAllowed < 0 || (!moreAllowed && file.files.length)) { $.jGrowl(lang.error_maxattachpost.replace('{1}', mybb_max_file_uploads), { theme: 'jgrowl_error' }); file.value = ''; return false; } else if (file.files.length > moreAllowed) { $.jGrowl(lang.attachment_max_allowed_files.replace('{1}', (moreAllowed - common)), { theme: 'jgrowl_error' }); file.value = ''; return false; } } if (file.files.length > php_max_file_uploads && php_max_file_uploads != 0) { $.jGrowl(lang.attachment_too_many_files.replace('{1}', php_max_file_uploads), { theme: 'jgrowl_error' }); file.value = ''; return false; } var totalSize = 0; Post.fileInput.each(function () { for (var i = 0; i < this.files.length; i++) { totalSize += (this.files[i].size || this.files[i].fileSize); } }); if (totalSize > php_max_upload_size && php_max_upload_size > 0) { var php_max_upload_size_pretty = Math.round(php_max_upload_size / 1e4) / 1e2; $.jGrowl(lang.attachment_too_big_upload.replace('{1}', php_max_upload_size_pretty), { theme: 'jgrowl_error' }); file.value = ''; return false; } return true; }, fileInput: $(), dropZone: $(), form: $() }; Post.init();