{"version":3,"sources":["node_modules/nodebb-plugin-composer-default/static/lib/composer.js"],"names":["define","taskbar","translator","controls","uploads","formatting","drafts","tags","categoryList","preview","resize","autocomplete","scrollStop","composer","active","undefined","posts","bsEnvironment","$","window","off","onWindowResize","on","ev","data","localStorage","removeItem","cid","env","utils","findBootstrapEnvironment","modified","discard","discardConfirm","length","modal","translate","translated","bootbox","confirm","removeComposerHistory","ajaxify","template","compose","history","back","isMobile","toggle","reposition","location","pathname","startsWith","config","relative_path","mobileHistoryAppend","alreadyOpen","post","type","id","hasOwnProperty","uuid","push","generateUUID","existingUUID","updateActive","load","actionText","action","translatedAction","title","replace","save_id","app","user","uid","join","tid","pid","composerAlert","post_uuid","message","find","removeAttr","alert","timeout","alert_id","findByTid","parseInt","addButton","iconClass","onClick","newTopic","pushData","body","isMain","trigger","addQuote","toPid","selectedPid","username","text","escapedTitle","link","newReply","postContainer","bodyEl","prevText","val","defaultLang","onTranslated","focusElements","render","editPost","socket","emit","err","threadData","alertError","activate","onShow","createNewComposer","options","enhance","postData","attr","titleEl","handleEl","tagsEl","submitBtn","init","addHandler","addComposerButtons","handleToggler","removeClass","privileges","initialize","allowTopicsThumbnail","toggleThumbEls","thumb","updateVisibility","e","preventDefault","stopPropagation","this","keypress","event","keyCode","which","ctrlKey","btn","prop","minimize","matchScroll","draft","get","handle","split","forEach","tag","tagsinput","handleHelp","handleSearch","screenfull","enabled","addClass","isTopic","isEditing","isGuestPost","mobile","resizable","isTopicOrMain","minimumTagLength","maximumTagLength","showHandleInput","allowGuestHandles","isAdmin","tagWhitelist","toggleNavbar","createData","parseAndTranslate","composerTemplate","each","unescape","document","append","isActive","handleResize","submitBtns","mobileSubmitBtn","textareaEl","idx","toggleClass","composerData","apply","path","returnPath","slice","replaceState","url","pushState","helpBtn","html","enableTopicSearch","searchElements","inputEl","resultEl","hideOnNoMatches","setTimeout","focus","putCursorAtEnd","thumbEl","onComposeRoute","trim","rtrim","checkTitle","isCategorySelected","payload","titleLen","bodyLen","inProgress","minimumTitleLength","maximumTitleLength","minimumPostLength","maximumPostLength","isEnoughTags","minTagCount","content","getSelectedCid","getTags","submitHookData","composerEl","redirect","taskbarIconEl","showEmailConfirmWarning","removeDraft","queued","go","slug","name","topic","onHide","css","paddingBottom","remove","close"],"mappings":"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","file":"node_modules/nodebb-plugin-composer-default/static/lib/composer.js","sourcesContent":["'use strict';\r\n\r\n/* globals define, socket, app, config, ajaxify, utils, bootbox, screenfull */\r\n\r\ndefine('composer', [\r\n\t'taskbar',\r\n\t'translator',\r\n\t'composer/controls',\r\n\t'composer/uploads',\r\n\t'composer/formatting',\r\n\t'composer/drafts',\r\n\t'composer/tags',\r\n\t'composer/categoryList',\r\n\t'composer/preview',\r\n\t'composer/resize',\r\n\t'composer/autocomplete',\r\n\t'scrollStop'\r\n], function(taskbar, translator, controls, uploads, formatting, drafts, tags, categoryList, preview, resize, autocomplete, scrollStop) {\r\n\tvar composer = {\r\n\t\tactive: undefined,\r\n\t\tposts: {},\r\n\t\tbsEnvironment: undefined,\r\n\t\tformatting: undefined,\r\n\t};\r\n\r\n\t$(window).off('resize', onWindowResize).on('resize', onWindowResize);\r\n\tonWindowResize();\r\n\r\n\t$(window).on('action:composer.topics.post', function(ev, data) {\r\n\t\tlocalStorage.removeItem('category:' + data.data.cid + ':bookmark');\r\n\t\tlocalStorage.removeItem('category:' + data.data.cid + ':bookmark:clicked');\r\n\t});\r\n\r\n\t$(window).on('popstate', function() {\r\n\t\tvar env = utils.findBootstrapEnvironment();\r\n\t\tif (composer.active && (env === 'xs' || env ==='sm')) {\r\n\t\t\tif (!composer.posts[composer.active].modified) {\r\n\t\t\t\tcomposer.discard(composer.active);\r\n\t\t\t\tif (composer.discardConfirm && composer.discardConfirm.length) {\r\n\t\t\t\t\tcomposer.discardConfirm.modal('hide');\r\n\t\t\t\t\tdelete composer.discardConfirm;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttranslator.translate('[[modules:composer.discard]]', function(translated) {\r\n\t\t\t\tcomposer.discardConfirm = bootbox.confirm(translated, function(confirm) {\r\n\t\t\t\t\tif (confirm) {\r\n\t\t\t\t\t\tcomposer.discard(composer.active);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcomposer.posts[composer.active].modified = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tcomposer.posts[composer.active].modified = false;\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\tfunction removeComposerHistory() {\r\n\t\tvar env = composer.bsEnvironment;\r\n\t\tif (ajaxify.data.template.compose === true || env === 'xs' || env ==='sm') {\r\n\t\t\thistory.back();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction onWindowResize() {\r\n\t\tvar env = utils.findBootstrapEnvironment();\r\n\t\tvar isMobile = env === 'xs' || env === 'sm';\r\n\r\n\t\tif (preview.toggle) {\r\n\t\t\tif (preview.env !== env && isMobile) {\r\n\t\t\t\tpreview.env = env;\r\n\t\t\t\tpreview.toggle(false);\r\n\t\t\t}\r\n\t\t\tpreview.env = env;\r\n\t\t}\r\n\r\n\t\tif (composer.active !== undefined) {\r\n\t\t\tresize.reposition($('.composer[data-uuid=\"' + composer.active + '\"]'));\r\n\r\n\t\t\tif (!isMobile && window.location.pathname.startsWith(config.relative_path + '/compose')) {\r\n\t\t\t\t/*\r\n\t\t\t\t *\tIf this conditional is met, we're no longer in mobile/tablet\r\n\t\t\t\t *\tresolution but we've somehow managed to have a mobile\r\n\t\t\t\t *\tcomposer load, so let's go back to the topic\r\n\t\t\t\t */\r\n\t\t\t\thistory.back();\r\n\t\t\t} else if (isMobile && !window.location.pathname.startsWith(config.relative_path + '/compose')) {\r\n\t\t\t\t/*\r\n\t\t\t\t *\tIn this case, we're in mobile/tablet resolution but the composer\r\n\t\t\t\t *\tthat loaded was a regular composer, so let's fix the address bar\r\n\t\t\t\t */\r\n\t\t\t\tmobileHistoryAppend();\r\n\t\t\t}\r\n\t\t}\r\n\t\tcomposer.bsEnvironment = env;\r\n\t}\r\n\r\n\tfunction alreadyOpen(post) {\r\n\t\t// If a composer for the same cid/tid/pid is already open, return the uuid, else return bool false\r\n\t\tvar\ttype, id;\r\n\r\n\t\tif (post.hasOwnProperty('cid')) {\r\n\t\t\ttype = 'cid';\r\n\t\t} else if (post.hasOwnProperty('tid')) {\r\n\t\t\ttype = 'tid';\r\n\t\t} else if (post.hasOwnProperty('pid')) {\r\n\t\t\ttype = 'pid';\r\n\t\t}\r\n\r\n\t\tid = post[type];\r\n\r\n\t\t// Find a match\r\n\t\tfor(var uuid in composer.posts) {\r\n\t\t\tif (composer.posts[uuid].hasOwnProperty(type) && id === composer.posts[uuid][type]) {\r\n\t\t\t\treturn uuid;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// No matches...\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfunction push(post) {\r\n\t\tvar uuid = utils.generateUUID(),\r\n\t\t\texistingUUID = alreadyOpen(post);\r\n\r\n\t\tif (existingUUID) {\r\n\t\t\ttaskbar.updateActive(existingUUID);\r\n\t\t\treturn composer.load(existingUUID);\r\n\t\t}\r\n\r\n\t\tvar actionText = '[[topic:composer.new_topic]]';\r\n\t\tif (post.action === 'posts.reply') {\r\n\t\t\tactionText = '[[topic:composer.replying_to]]';\r\n\t\t} else if (post.action === 'posts.edit') {\r\n\t\t\tactionText = '[[topic:composer.editing]]';\r\n\t\t}\r\n\r\n\t\ttranslator.translate(actionText, function(translatedAction) {\r\n\t\t\ttaskbar.push('composer', uuid, {\r\n\t\t\t\ttitle: translatedAction.replace('%1', '\"' + post.title + '\"')\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// Construct a save_id\r\n\t\tif (post.hasOwnProperty('cid')) {\r\n\t\t\tpost.save_id = ['composer', app.user.uid, 'cid', post.cid].join(':');\r\n\t\t} else if (post.hasOwnProperty('tid')) {\r\n\t\t\tpost.save_id = ['composer', app.user.uid, 'tid', post.tid].join(':');\r\n\t\t} else if (post.hasOwnProperty('pid')) {\r\n\t\t\tpost.save_id = ['composer', app.user.uid, 'pid', post.pid].join(':');\r\n\t\t}\r\n\r\n\t\tcomposer.posts[uuid] = post;\r\n\t\tcomposer.load(uuid);\r\n\t}\r\n\r\n\tfunction composerAlert(post_uuid, message) {\r\n\t\t$('.composer[data-uuid=\"' + post_uuid + '\"]').find('.composer-submit').removeAttr('disabled');\r\n\t\tapp.alert({\r\n\t\t\ttype: 'danger',\r\n\t\t\ttimeout: 3000,\r\n\t\t\ttitle: '',\r\n\t\t\tmessage: message,\r\n\t\t\talert_id: 'post_error'\r\n\t\t});\r\n\t}\r\n\r\n\tcomposer.findByTid = function(tid) {\r\n\t\t// Iterates through the initialised composers and returns the uuid of the matching composer\r\n\t\tfor(var uuid in composer.posts) {\r\n\t\t\tif (composer.posts.hasOwnProperty(uuid) && composer.posts[uuid].hasOwnProperty('tid') && parseInt(composer.posts[uuid].tid, 10) === parseInt(tid, 10)) {\r\n\t\t\t\treturn uuid;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\tcomposer.addButton = function(iconClass, onClick, title) {\r\n\t\tformatting.addButton(iconClass, onClick, title);\r\n\t};\r\n\r\n\tcomposer.newTopic = function(data) {\r\n\t\tvar pushData = {\r\n\t\t\taction: 'topics.post',\r\n\t\t\tcid: data.cid,\r\n\t\t\ttitle: data.title || '',\r\n\t\t\tbody: data.body || '',\r\n\t\t\ttags: data.tags || [],\r\n\t\t\tmodified: ((data.title && data.title.length) || (data.body && data.body.length)) ? true : false,\r\n\t\t\tisMain: true\r\n\t\t};\r\n\r\n\t\t$(window).trigger('filter:composer.topic.push', {\r\n\t\t\tdata: data,\r\n\t\t\tpushData: pushData\r\n\t\t});\r\n\r\n\t\tpush(pushData);\r\n\t};\r\n\r\n\tcomposer.addQuote = function(tid, toPid, selectedPid, title, username, text, uuid) {\r\n\t\tuuid = uuid || composer.active;\r\n\r\n\t\tvar escapedTitle = (title || '').replace(/([\\\\`*_{}\\[\\]()#+\\-.!])/g, '\\\\$1').replace(/\\[/g, '[').replace(/\\]/g, ']').replace(/%/g, '%').replace(/,/g, ',');\r\n\r\n\t\tif (text) {\r\n\t\t\ttext = '> ' + text.replace(/\\n/g, '\\n> ') + '\\n\\n';\r\n\t\t}\r\n\t\tvar link = '[' + escapedTitle + '](' + config.relative_path + '/post/' + (selectedPid || toPid) + ')';\r\n\t\tif (uuid === undefined) {\r\n\t\t\tif (title && (selectedPid || toPid)) {\r\n\t\t\t\tcomposer.newReply(tid, toPid, title, '[[modules:composer.user_said_in, ' + username + ', ' + link + ']]\\n' + text);\r\n\t\t\t} else {\r\n\t\t\t\tcomposer.newReply(tid, toPid, title, '[[modules:composer.user_said, ' + username + ']]\\n' + text);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t} else if (uuid !== composer.active) {\r\n\t\t\t// If the composer is not currently active, activate it\r\n\t\t\tcomposer.load(uuid);\r\n\t\t}\r\n\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + uuid + '\"]');\r\n\t\tvar bodyEl = postContainer.find('textarea');\r\n\t\tvar prevText = bodyEl.val();\r\n\t\tif (title && (selectedPid || toPid)) {\r\n\t\t\ttranslator.translate('[[modules:composer.user_said_in, ' + username + ', ' + link + ']]\\n', config.defaultLang, onTranslated);\r\n\t\t} else {\r\n\t\t\ttranslator.translate('[[modules:composer.user_said, ' + username + ']]\\n', config.defaultLang, onTranslated);\r\n\t\t}\r\n\r\n\t\tfunction onTranslated(translated) {\r\n\t\t\tcomposer.posts[uuid].body = (prevText.length ? prevText + '\\n\\n' : '') + translated + text;\r\n\t\t\tbodyEl.val(composer.posts[uuid].body);\r\n\t\t\tfocusElements(postContainer);\r\n\t\t\tpreview.render(postContainer);\r\n\t\t}\r\n\t};\r\n\r\n\tcomposer.newReply = function(tid, toPid, title, text) {\r\n\t\ttranslator.translate(text, config.defaultLang, function(translated) {\r\n\t\t\tpush({\r\n\t\t\t\taction: 'posts.reply',\r\n\t\t\t\ttid: tid,\r\n\t\t\t\ttoPid: toPid,\r\n\t\t\t\ttitle: title,\r\n\t\t\t\tbody: translated,\r\n\t\t\t\tmodified: ((title && title.length) || (translated && translated.length)) ? true : false,\r\n\t\t\t\tisMain: false\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\tcomposer.editPost = function(pid) {\r\n\t\tsocket.emit('plugins.composer.push', pid, function(err, threadData) {\r\n\t\t\tif (err) {\r\n\t\t\t\treturn app.alertError(err.message);\r\n\t\t\t}\r\n\t\t\tthreadData.action = 'posts.edit';\r\n\t\t\tthreadData.pid = pid;\r\n\t\t\tthreadData.modified = false;\r\n\t\t\tpush(threadData);\r\n\t\t});\r\n\t};\r\n\r\n\tcomposer.load = function(post_uuid) {\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tif (postContainer.length) {\r\n\t\t\tactivate(post_uuid);\r\n\t\t\tresize.reposition(postContainer);\r\n\t\t\tfocusElements(postContainer);\r\n\t\t\tonShow();\r\n\t\t} else {\r\n\t\t\tif (composer.formatting) {\r\n\t\t\t\tcreateNewComposer(post_uuid);\r\n\t\t\t} else {\r\n\t\t\t\tsocket.emit('plugins.composer.getFormattingOptions', function(err, options) {\r\n\t\t\t\t\tcomposer.formatting = options;\r\n\t\t\t\t\tcreateNewComposer(post_uuid);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tcomposer.enhance = function(postContainer, post_uuid, postData) {\r\n\t\t/*\r\n\t\t\tThis method enhances a composer container with client-side sugar (preview, etc)\r\n\t\t\tEverything in here also applies to the /compose route\r\n\t\t*/\r\n\r\n\t\tif (!post_uuid && !postData) {\r\n\t\t\tpost_uuid = utils.generateUUID();\r\n\t\t\tcomposer.posts[post_uuid] = postData = ajaxify.data;\r\n\t\t\tpostContainer.attr('data-uuid', post_uuid);\r\n\t\t}\r\n\r\n\t\tvar titleEl = postContainer.find('input.title');\r\n\t\tvar handleEl = postContainer.find('input.handle');\r\n\t\tvar tagsEl = postContainer.find('input.tags');\r\n\t\tvar bodyEl = postContainer.find('textarea');\r\n\t\tvar submitBtn = postContainer.find('.composer-submit');\r\n\r\n\t\tcategoryList.init(postContainer, composer.posts[post_uuid]);\r\n\r\n\t\tformatting.addHandler(postContainer);\r\n\t\tformatting.addComposerButtons();\r\n\t\tpreview.handleToggler(postContainer);\r\n\r\n\t\tpostContainer.find('.img-upload-btn').removeClass('hide');\r\n\t\tpostContainer.find('#files.lt-ie9').removeClass('hide');\r\n\r\n\t\tif (app.user.privileges['upload:post:file']) {\r\n\t\t\tpostContainer.find('.file-upload-btn').removeClass('hide');\r\n\t\t\tpostContainer.find('#files.lt-ie9').removeClass('hide');\r\n\t\t}\r\n\r\n\t\tuploads.initialize(post_uuid);\r\n\r\n\t\tif (config.allowTopicsThumbnail && postData.isMain) {\r\n\t\t\tuploads.toggleThumbEls(postContainer, composer.posts[post_uuid].thumb || '');\r\n\t\t}\r\n\r\n\t\ttags.init(postContainer, composer.posts[post_uuid]);\r\n\r\n\t\tautocomplete.init(postContainer, post_uuid);\r\n\r\n\t\tpostContainer.on('change', 'input, textarea', function() {\r\n\t\t\tcomposer.posts[post_uuid].modified = true;\r\n\r\n\t\t\t// Post is modified, save to list of opened drafts\r\n\t\t\tdrafts.updateVisibility('available', composer.posts[post_uuid].save_id, true);\r\n\t\t\tdrafts.updateVisibility('open', composer.posts[post_uuid].save_id, true);\r\n\t\t});\r\n\r\n\t\tsubmitBtn.on('click', function(e) {\r\n\t\t\te.preventDefault();\r\n\t\t\te.stopPropagation();\t// Other click events bring composer back to active state which is undesired on submit\r\n\r\n\t\t\t$(this).attr('disabled', true);\r\n\t\t\tpost(post_uuid);\r\n\t\t});\r\n\r\n\t\tpostContainer.keypress(function (event) {\r\n\t\t\tvar keyCode = (event.which ? event.which : event.keyCode);\r\n\t\t\tif ((keyCode === 10 || keyCode == 13) && event.ctrlKey) {\r\n\t\t\t\tsubmitBtn.attr('disabled', true);\r\n\t\t\t\tpost(post_uuid);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tpostContainer.find('.composer-discard').on('click', function(e) {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tif (!composer.posts[post_uuid].modified) {\r\n\t\t\t\tcomposer.discard(post_uuid);\r\n\t\t\t\treturn removeComposerHistory();\r\n\t\t\t}\r\n\r\n\t\t\tvar btn = $(this).prop('disabled', true);\r\n\t\t\ttranslator.translate('[[modules:composer.discard]]', function(translated) {\r\n\t\t\t\tbootbox.confirm(translated, function(confirm) {\r\n\t\t\t\t\tif (confirm) {\r\n\t\t\t\t\t\tcomposer.discard(post_uuid);\r\n\t\t\t\t\t\tremoveComposerHistory();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbtn.prop('disabled', false);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tpostContainer.find('.composer-minimize').on('click', function (e) {\r\n\t\t\te.preventDefault();\r\n\t\t\te.stopPropagation();\r\n\t\t\tcomposer.minimize(post_uuid);\r\n\t\t});\r\n\r\n\t\tbodyEl.on('input propertychange', function() {\r\n\t\t\tpreview.render(postContainer);\r\n\t\t});\r\n\r\n\t\tbodyEl.on('scroll', function() {\r\n\t\t\tpreview.matchScroll(postContainer);\r\n\t\t});\r\n\r\n\t\tpreview.render(postContainer, function() {\r\n\t\t\tpreview.matchScroll(postContainer);\r\n\t\t});\r\n\r\n\t\tdrafts.init(postContainer, postData);\r\n\t\tvar draft = drafts.get(postData.save_id);\r\n\t\tif (draft && draft.title) {\r\n\t\t\ttitleEl.val(draft.title);\r\n\t\t}\r\n\t\tif (draft && draft.handle) {\r\n\t\t\thandleEl.val(draft.handle);\r\n\t\t}\r\n\t\tif (draft && draft.tags) {\r\n\t\t\tconst tags = draft.tags.split(',');\r\n\t\t\ttags.forEach(function (tag) {\r\n\t\t\t\ttagsEl.tagsinput('add', tag);\r\n\t\t\t});\r\n\t\t}\r\n\t\tbodyEl.val(draft.text ? draft.text : postData.body);\r\n\r\n\t\thandleHelp(postContainer);\r\n\t\thandleSearch(postContainer);\r\n\t\tfocusElements(postContainer);\r\n\r\n\t\t// Hide \"zen mode\" if fullscreen API is not enabled/available (ahem, iOS...)\r\n\t\tif (typeof screenfull !== 'undefined' && !screenfull.enabled) {\r\n\t\t\t$('[data-format=\"zen\"]').addClass('hidden');\r\n\t\t}\r\n\r\n\t\t$(window).trigger('action:composer.enhanced', {\r\n\t\t\tpostContainer: postContainer,\r\n\t\t\tpostData: postData,\r\n\t\t\tdraft: draft,\r\n\t\t});\r\n\t};\r\n\r\n\tfunction createNewComposer(post_uuid) {\r\n\t\tvar postData = composer.posts[post_uuid];\r\n\r\n\t\tvar allowTopicsThumbnail = config.allowTopicsThumbnail && postData.isMain,\r\n\t\t\tisTopic = postData ? postData.hasOwnProperty('cid') : false,\r\n\t\t\tisMain = postData ? !!postData.isMain : false,\r\n\t\t\tisEditing = postData ? !!postData.pid : false,\r\n\t\t\tisGuestPost = postData ? parseInt(postData.uid, 10) === 0 : false;\r\n\r\n\t\t// see\r\n\t\t// https://github.com/NodeBB/NodeBB/issues/2994 and\r\n\t\t// https://github.com/NodeBB/NodeBB/issues/1951\r\n\t\t// remove when 1951 is resolved\r\n\r\n\t\tvar title = postData.title.replace(/%/g, '%').replace(/,/g, ',');\r\n\r\n\t\tvar data = {\r\n\t\t\ttitle: title,\r\n\t\t\tmobile: composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm',\r\n\t\t\tresizable: true,\r\n\t\t\tallowTopicsThumbnail: allowTopicsThumbnail,\r\n\t\t\tisTopicOrMain: isTopic || isMain,\r\n\t\t\tminimumTagLength: config.minimumTagLength,\r\n\t\t\tmaximumTagLength: config.maximumTagLength,\r\n\t\t\tisTopic: isTopic,\r\n\t\t\tisEditing: isEditing,\r\n\t\t\tshowHandleInput: config.allowGuestHandles && (app.user.uid === 0 || (isEditing && isGuestPost && app.user.isAdmin)),\r\n\t\t\thandle: postData ? postData.handle || '' : undefined,\r\n\t\t\tformatting: composer.formatting,\r\n\t\t\ttagWhitelist: ajaxify.data.tagWhitelist,\r\n\t\t\tprivileges: app.user.privileges,\r\n\t\t};\r\n\r\n\t\tif (data.mobile) {\r\n\t\t\tmobileHistoryAppend();\r\n\r\n\t\t\tapp.toggleNavbar(false);\r\n\t\t}\r\n\r\n\t\tpostData.mobile = composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm';\r\n\r\n\t\t$(window).trigger('filter:composer.create', {\r\n\t\t\tpostData: postData,\r\n\t\t\tcreateData: data\r\n\t\t});\r\n\r\n\t\tapp.parseAndTranslate('composer', data, function(composerTemplate) {\r\n\t\t\tif ($('.composer.composer[data-uuid=\"' + post_uuid + '\"]').length) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcomposerTemplate = $(composerTemplate);\r\n\r\n\t\t\tcomposerTemplate.find('.title').each(function () {\r\n\t\t\t\t$(this).text(translator.unescape($(this).text()));\r\n\t\t\t});\r\n\r\n\t\t\tcomposerTemplate.attr('data-uuid', post_uuid);\r\n\r\n\t\t\t$(document.body).append(composerTemplate);\r\n\r\n\t\t\tvar postContainer = $(composerTemplate[0]);\r\n\r\n\t\t\tresize.reposition(postContainer);\r\n\t\t\tcomposer.enhance(postContainer, post_uuid, postData);\r\n\t\t\t/*\r\n\t\t\t\tEverything after this line is applied to the resizable composer only\r\n\t\t\t\tWant something done to both resizable composer and the one in /compose?\r\n\t\t\t\tPut it in composer.enhance().\r\n\r\n\t\t\t\tEventually, stuff after this line should be moved into composer.enhance().\r\n\t\t\t*/\r\n\r\n\t\t\tactivate(post_uuid);\r\n\r\n\t\t\tpostContainer.on('click', function() {\r\n\t\t\t\tif (!taskbar.isActive(post_uuid)) {\r\n\t\t\t\t\ttaskbar.updateActive(post_uuid);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tresize.handleResize(postContainer);\r\n\r\n\t\t\tif (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') {\r\n\t\t\t\tvar submitBtns = postContainer.find('.composer-submit'),\r\n\t\t\t\t\tmobileSubmitBtn = postContainer.find('.mobile-navbar .composer-submit'),\r\n\t\t\t\t\ttextareaEl = postContainer.find('.write'),\r\n\t\t\t\t\tidx = textareaEl.attr('tabindex');\r\n\r\n\t\t\t\tsubmitBtns.removeAttr('tabindex');\r\n\t\t\t\tmobileSubmitBtn.attr('tabindex', parseInt(idx, 10)+1);\r\n\r\n\t\t\t\t$('.category-name-container').on('click', function() {\r\n\t\t\t\t\t$('.category-selector').toggleClass('open');\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t$(window).trigger('action:composer.loaded', {\r\n\t\t\t\tpost_uuid: post_uuid,\r\n\t\t\t\tcomposerData: composer.posts[post_uuid],\r\n\t\t\t\tformatting: composer.formatting,\r\n\t\t\t});\r\n\r\n\t\t\tscrollStop.apply(postContainer.find('.write'));\r\n\t\t\tfocusElements(postContainer);\r\n\t\t\tonShow();\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction mobileHistoryAppend() {\r\n\t\tvar path = 'compose?p=' + window.location.pathname,\r\n\t\t\treturnPath = window.location.pathname.slice(1);\r\n\r\n\t\t// Remove relative path from returnPath\r\n\t\tif (returnPath.startsWith(config.relative_path.slice(1))) {\r\n\t\t\treturnPath = returnPath.slice(config.relative_path.length);\r\n\t\t}\r\n\r\n\t\t// Add in return path to be caught by ajaxify when post is completed, or if back is pressed\r\n\t\twindow.history.replaceState({\r\n\t\t\turl: null,\r\n\t\t\treturnPath: returnPath\r\n\t\t}, returnPath, config.relative_path + '/' + returnPath);\r\n\r\n\t\t// Update address bar in case f5 is pressed\r\n\t\twindow.history.pushState({\r\n\t\t\turl: path\r\n\t\t}, path, config.relative_path + '/' + path);\r\n\t}\r\n\r\n\tfunction handleHelp(postContainer) {\r\n\t\tvar helpBtn = postContainer.find('.help');\r\n\t\tsocket.emit('plugins.composer.renderHelp', function(err, html) {\r\n\t\t\tif (!err && html && html.length > 0) {\r\n\t\t\t\thelpBtn.removeClass('hidden');\r\n\t\t\t\thelpBtn.on('click', function() {\r\n\t\t\t\t\tbootbox.alert(html);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction handleSearch(postContainer) {\r\n\t\tvar uuid = postContainer.attr('data-uuid');\r\n\t\tvar isEditing = composer.posts[uuid] && composer.posts[uuid].action === 'posts.edit';\r\n\t\tvar env = utils.findBootstrapEnvironment();\r\n\t\tvar isMobile = env === 'xs' || env === 'sm';\r\n\t\tif (isEditing || isMobile) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tapp.enableTopicSearch({\r\n\t\t\tsearchElements: {\r\n\t\t\t\tinputEl: postContainer.find('input.title'),\r\n\t\t\t\tresultEl: postContainer.find('.quick-search-container'),\r\n\t\t\t},\r\n\t\t\thideOnNoMatches: true,\r\n\t\t});\r\n\t}\r\n\r\n\tfunction activate(post_uuid) {\r\n\t\tif(composer.active && composer.active !== post_uuid) {\r\n\t\t\tcomposer.minimize(composer.active);\r\n\t\t}\r\n\r\n\t\tcomposer.active = post_uuid;\r\n\t}\r\n\r\n\tfunction focusElements(postContainer) {\r\n\t\tsetTimeout(function() {\r\n\t\t\tvar title = postContainer.find('input.title');\r\n\r\n\t\t\tif (title.length) {\r\n\t\t\t\ttitle.focus();\r\n\t\t\t} else {\r\n\t\t\t\tpostContainer.find('textarea').focus().putCursorAtEnd();\r\n\t\t\t}\r\n\t\t}, 20);\r\n\t}\r\n\r\n\tfunction post(post_uuid) {\r\n\t\tvar postData = composer.posts[post_uuid];\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tvar handleEl = postContainer.find('.handle');\r\n\t\tvar titleEl = postContainer.find('.title');\r\n\t\tvar bodyEl = postContainer.find('textarea');\r\n\t\tvar thumbEl = postContainer.find('input#topic-thumb-url');\r\n\t\tvar onComposeRoute = postData.hasOwnProperty('template') && postData.template.compose === true;\r\n\r\n\t\ttitleEl.val(titleEl.val().trim());\r\n\t\tbodyEl.val(utils.rtrim(bodyEl.val()));\r\n\t\tif (thumbEl.length) {\r\n\t\t\tthumbEl.val(thumbEl.val().trim());\r\n\t\t}\r\n\r\n\t\tvar action = postData.action;\r\n\r\n\t\tvar checkTitle = (postData.hasOwnProperty('cid') || parseInt(postData.pid, 10)) && postContainer.find('input.title').length;\r\n\t\tvar isCategorySelected = !checkTitle || (checkTitle && parseInt(postData.cid, 10));\r\n\r\n\t\t// Specifically for checking title/body length via plugins\r\n\t\tvar payload = {\r\n\t\t\tpost_uuid: post_uuid,\r\n\t\t\tpostData: postData,\r\n\t\t\tpostContainer: postContainer,\r\n\t\t\ttitleEl: titleEl,\r\n\t\t\ttitleLen: titleEl.val().length,\r\n\t\t\tbodyEl: bodyEl,\r\n\t\t\tbodyLen: bodyEl.val().length,\r\n\t\t};\r\n\t\t$(window).trigger('action:composer.check', payload);\r\n\r\n\t\tif (uploads.inProgress[post_uuid] && uploads.inProgress[post_uuid].length) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:still-uploading]]');\r\n\t\t} else if (checkTitle && payload.titleLen < parseInt(config.minimumTitleLength, 10)) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:title-too-short, ' + config.minimumTitleLength + ']]');\r\n\t\t} else if (checkTitle && payload.titleLen > parseInt(config.maximumTitleLength, 10)) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:title-too-long, ' + config.maximumTitleLength + ']]');\r\n\t\t} else if (action === 'topics.post' && !isCategorySelected) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:category-not-selected]]');\r\n\t\t} else if (payload.bodyLen < parseInt(config.minimumPostLength, 10)) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:content-too-short, ' + config.minimumPostLength + ']]');\r\n\t\t} else if (payload.bodyLen > parseInt(config.maximumPostLength, 10)) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:content-too-long, ' + config.maximumPostLength + ']]');\r\n\t\t} else if (checkTitle && !tags.isEnoughTags(post_uuid)) {\r\n\t\t\treturn composerAlert(post_uuid, '[[error:not-enough-tags, ' + tags.minTagCount() + ']]');\r\n\t\t}\r\n\r\n\t\tvar composerData = {};\r\n\r\n\t\tif (action === 'topics.post') {\r\n\t\t\tcomposerData = {\r\n\t\t\t\thandle: handleEl ? handleEl.val() : undefined,\r\n\t\t\t\ttitle: titleEl.val(),\r\n\t\t\t\tcontent: bodyEl.val(),\r\n\t\t\t\tthumb: thumbEl.val() || '',\r\n\t\t\t\tcid: categoryList.getSelectedCid(),\r\n\t\t\t\ttags: tags.getTags(post_uuid)\r\n\t\t\t};\r\n\t\t} else if (action === 'posts.reply') {\r\n\t\t\tcomposerData = {\r\n\t\t\t\ttid: postData.tid,\r\n\t\t\t\thandle: handleEl ? handleEl.val() : undefined,\r\n\t\t\t\tcontent: bodyEl.val(),\r\n\t\t\t\ttoPid: postData.toPid\r\n\t\t\t};\r\n\t\t} else if (action === 'posts.edit') {\r\n\t\t\tcomposerData = {\r\n\t\t\t\tpid: postData.pid,\r\n\t\t\t\thandle: handleEl ? handleEl.val() : undefined,\r\n\t\t\t\tcontent: bodyEl.val(),\r\n\t\t\t\ttitle: titleEl.val(),\r\n\t\t\t\tthumb: thumbEl.val() || '',\r\n\t\t\t\ttags: tags.getTags(post_uuid)\r\n\t\t\t};\r\n\t\t}\r\n\t\tvar submitHookData = {\r\n\t\t\tcomposerEl: postContainer,\r\n\t\t\taction: action,\r\n\t\t\tcomposerData: composerData,\r\n\t\t\tpostData: postData,\r\n\t\t\tredirect: true,\r\n\t\t}\r\n\t\t$(window).trigger('action:composer.submit', submitHookData);\r\n\r\n\t\t// Minimize composer (and set textarea as readonly) while submitting\r\n\t\tvar taskbarIconEl = $('#taskbar .composer[data-uuid=\"' + post_uuid + '\"] i');\r\n\t\tvar textareaEl = postContainer.find('.write');\r\n\t\ttaskbarIconEl.removeClass('fa-plus').addClass('fa-circle-o-notch fa-spin');\r\n\t\tcomposer.minimize(post_uuid);\r\n\t\ttextareaEl.prop('readonly', true);\r\n\r\n\t\tsocket.emit(action, composerData, function (err, data) {\r\n\t\t\tpostContainer.find('.composer-submit').removeAttr('disabled');\r\n\t\t\tif (err) {\r\n\t\t\t\t// Restore composer on error\r\n\t\t\t\tcomposer.load(post_uuid);\r\n\t\t\t\ttextareaEl.prop('readonly', false);\r\n\t\t\t\tif (err.message === '[[error:email-not-confirmed]]') {\r\n\t\t\t\t\treturn app.showEmailConfirmWarning(err);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn app.alertError(err.message);\r\n\t\t\t}\r\n\r\n\t\t\tcomposer.discard(post_uuid);\r\n\t\t\tdrafts.removeDraft(postData.save_id);\r\n\r\n\t\t\tif (data.queued) {\r\n\t\t\t\tbootbox.alert(data.message);\r\n\t\t\t} else {\r\n\t\t\t\tif (action === 'topics.post') {\r\n\t\t\t\t\tif (submitHookData.redirect) {\r\n\t\t\t\t\t\tajaxify.go('topic/' + data.slug, undefined, (onComposeRoute || composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') ? true : false);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (action === 'posts.reply') {\r\n\t\t\t\t\tif (onComposeRoute || composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') {\r\n\t\t\t\t\t\twindow.history.back();\r\n\t\t\t\t\t} else if (submitHookData.redirect &&\r\n\t\t\t\t\t\t((ajaxify.data.template.name !== 'topic') ||\r\n\t\t\t\t\t\t(ajaxify.data.template.topic && parseInt(postData.tid, 10) !== parseInt(ajaxify.data.tid, 10)))\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tajaxify.go('post/' + data.pid);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tremoveComposerHistory();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t$(window).trigger('action:composer.' + action, { composerData: composerData, data: data });\r\n\t\t});\r\n\t}\r\n\r\n\tfunction onShow() {\r\n\t\t$('html').addClass('composing');\r\n\t}\r\n\r\n\tfunction onHide() {\r\n\t\t$('body').css({ paddingBottom: 0 });\r\n\t\t$('html').removeClass('composing');\r\n\t\tapp.toggleNavbar(true);\r\n\t}\r\n\r\n\tcomposer.discard = function(post_uuid) {\r\n\t\tif (composer.posts[post_uuid]) {\r\n\t\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\t\tpostContainer.remove();\r\n\t\t\tdrafts.removeDraft(composer.posts[post_uuid].save_id);\r\n\r\n\t\t\tdelete composer.posts[post_uuid];\r\n\t\t\tcomposer.active = undefined;\r\n\t\t\ttaskbar.discard('composer', post_uuid);\r\n\t\t\t$('[data-action=\"post\"]').removeAttr('disabled');\r\n\r\n\t\t\t$(window).trigger('action:composer.discard', {\r\n\t\t\t\tpost_uuid: post_uuid,\r\n\t\t\t});\r\n\t\t}\r\n\t\tonHide();\r\n\t};\r\n\r\n\t// Alias to .discard();\r\n\tcomposer.close = composer.discard;\r\n\r\n\tcomposer.minimize = function(post_uuid) {\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tpostContainer.css('visibility', 'hidden');\r\n\t\tcomposer.active = undefined;\r\n\t\ttaskbar.minimize('composer', post_uuid);\r\n\t\t$(window).trigger('action:composer.minimize', {\r\n\t\t\tpost_uuid: post_uuid,\r\n\t\t});\r\n\r\n\t\tonHide();\r\n\t};\r\n\r\n\treturn composer;\r\n});\r\n"]}