1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-01-18 06:38:43 +01:00

Merge pull request #3658 from callumacrae/js-refactoring-again

JS Refactoring
This commit is contained in:
Marc Alexander 2015-05-30 12:40:46 +02:00
commit d6cd90d325
5 changed files with 201 additions and 263 deletions

View File

@ -1,3 +1,5 @@
/* global bbfontstyle */
var phpbb = {};
phpbb.alertTime = 100;
@ -21,7 +23,7 @@ phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
/**
* Display a loading screen
*
* @returns object Returns loadingIndicator.
* @returns {object} Returns loadingIndicator.
*/
phpbb.loadingIndicator = function() {
if (!$loadingIndicator.is(':visible')) {
@ -54,7 +56,7 @@ phpbb.clearLoadingTimeout = function() {
/**
* Close popup alert after a specified delay
*
* @param int Delay in ms until darkenwrapper's click event is triggered
* @param {int} delay Delay in ms until darkenwrapper's click event is triggered
*/
phpbb.closeDarkenWrapper = function(delay) {
phpbbAlertTimer = setTimeout(function() {
@ -67,14 +69,12 @@ phpbb.closeDarkenWrapper = function(delay) {
*
* You can only call one alert or confirm box at any one time.
*
* @param string title Title of the message, eg "Information" (HTML).
* @param string msg Message to display (HTML).
* @param bool fadedark Remove the dark background when done? Defaults
* to yes.
* @param {string} title Title of the message, eg "Information" (HTML).
* @param {string} msg Message to display (HTML).
*
* @returns object Returns the div created.
* @returns {object} Returns the div created.
*/
phpbb.alert = function(title, msg, fadedark) {
phpbb.alert = function(title, msg) {
var $alert = $('#phpbb_alert');
$alert.find('.alert_title').html(title);
$alert.find('.alert_text').html(msg);
@ -94,7 +94,7 @@ phpbb.alert = function(title, msg, fadedark) {
/**
* Handler for opening an alert box.
*
* @param jQuery $alert jQuery object.
* @param {jQuery} $alert jQuery object.
*/
phpbb.alert.open = function($alert) {
if (!$dark.is(':visible')) {
@ -134,8 +134,8 @@ phpbb.alert.open = function($alert) {
/**
* Handler for closing an alert box.
*
* @param jQuery $alert jQuery object.
* @param bool fadedark Whether to remove dark background.
* @param {jQuery} $alert jQuery object.
* @param {bool} fadedark Whether to remove dark background.
*/
phpbb.alert.close = function($alert, fadedark) {
var $fade = (fadedark) ? $dark : $alert;
@ -153,13 +153,13 @@ phpbb.alert.close = function($alert, fadedark) {
*
* You can only call one alert or confirm box at any one time.
*
* @param string msg Message to display (HTML).
* @param function callback Callback. Bool param, whether the user pressed
* @param {string} msg Message to display (HTML).
* @param {function} callback Callback. Bool param, whether the user pressed
* yes or no (or whatever their language is).
* @param bool fadedark Remove the dark background when done? Defaults
* @param {bool} fadedark Remove the dark background when done? Defaults
* to yes.
*
* @returns object Returns the div created.
* @returns {object} Returns the div created.
*/
phpbb.confirm = function(msg, callback, fadedark) {
var $confirmDiv = $('#phpbb_confirm');
@ -197,8 +197,8 @@ phpbb.confirm = function(msg, callback, fadedark) {
/**
* Turn a querystring into an array.
*
* @argument string string The querystring to parse.
* @returns object The object created.
* @argument {string} string The querystring to parse.
* @returns {object} The object created.
*/
phpbb.parseQuerystring = function(string) {
var params = {}, i, split;
@ -223,12 +223,7 @@ phpbb.parseQuerystring = function(string) {
* For more info, view the following page on the phpBB wiki:
* http://wiki.phpbb.com/JavaScript_Function.phpbb.ajaxify
*
* @param object options Options.
* @param bool/function refresh If we are sent back a refresh, should it be
* acted upon? This can either be true / false / a function.
* @param function callback Callback to call on completion of event. Has
* three parameters: the element that the event was evoked from, the JSON
* that was returned and (if it is a form) the form action.
* @param {object} options Options.
*/
phpbb.ajaxify = function(options) {
var $elements = $(options.selector),
@ -290,7 +285,7 @@ phpbb.ajaxify = function(options) {
* It cannot be called from outside this function, and is purely here to
* avoid repetition of code.
*
* @param object res The object sent back by the server.
* @param {object} res The object sent back by the server.
*/
function returnHandler(res) {
var alert;
@ -436,8 +431,8 @@ phpbb.search = {
/**
* Get cached search data.
*
* @param string id Search ID.
* @return bool|object. Cached data object. Returns false if no data exists.
* @param {string} id Search ID.
* @returns {bool|object} Cached data object. Returns false if no data exists.
*/
phpbb.search.cache.get = function(id) {
if (this.data[id]) {
@ -449,11 +444,9 @@ phpbb.search.cache.get = function(id) {
/**
* Set search cache data value.
*
* @param string id Search ID.
* @param string key Data key.
* @param string value Data value.
*
* @return undefined
* @param {string} id Search ID.
* @param {string} key Data key.
* @param {string} value Data value.
*/
phpbb.search.cache.set = function(id, key, value) {
if (!this.data[id]) {
@ -465,21 +458,19 @@ phpbb.search.cache.set = function(id, key, value) {
/**
* Cache search result.
*
* @param string id Search ID.
* @param string keyword Keyword.
* @param array results Search results.
*
* @return undefined
* @param {string} id Search ID.
* @param {string} keyword Keyword.
* @param {Array} results Search results.
*/
phpbb.search.cache.setResults = function(id, keyword, value) {
this.data[id].results[keyword] = value;
phpbb.search.cache.setResults = function(id, keyword, results) {
this.data[id].results[keyword] = results;
};
/**
* Trim spaces from keyword and lower its case.
*
* @param string keyword Search keyword to clean.
* @return string Cleaned string.
* @param {string} keyword Search keyword to clean.
* @returns {string} Cleaned string.
*/
phpbb.search.cleanKeyword = function(keyword) {
return $.trim(keyword).toLowerCase();
@ -489,11 +480,11 @@ phpbb.search.cleanKeyword = function(keyword) {
* Get clean version of search keyword. If textarea supports several keywords
* (one per line), it fetches the current keyword based on the caret position.
*
* @param jQuery $input Search input|textarea.
* @param string keyword Input|textarea value.
* @param bool multiline Whether textarea supports multiple search keywords.
* @param {jQuery} $input Search input|textarea.
* @param {string} keyword Input|textarea value.
* @param {bool} multiline Whether textarea supports multiple search keywords.
*
* @return string Clean string.
* @returns string Clean string.
*/
phpbb.search.getKeyword = function($input, keyword, multiline) {
if (multiline) {
@ -507,8 +498,8 @@ phpbb.search.getKeyword = function($input, keyword, multiline) {
* Get the textarea line number on which the keyword resides - for textareas
* that support multiple keywords (one per line).
*
* @param jQuery $textarea Search textarea.
* @return int
* @param {jQuery} $textarea Search textarea.
* @returns {int} The line number.
*/
phpbb.search.getKeywordLine = function ($textarea) {
var selectionStart = $textarea.get(0).selectionStart;
@ -519,11 +510,9 @@ phpbb.search.getKeywordLine = function ($textarea) {
* Set the value on the input|textarea. If textarea supports multiple
* keywords, only the active keyword is replaced.
*
* @param jQuery $input Search input|textarea.
* @param string value Value to set.
* @param bool multiline Whether textarea supports multiple search keywords.
*
* @return undefined
* @param {jQuery} $input Search input|textarea.
* @param {string} value Value to set.
* @param {bool} multiline Whether textarea supports multiple search keywords.
*/
phpbb.search.setValue = function($input, value, multiline) {
if (multiline) {
@ -538,12 +527,10 @@ phpbb.search.setValue = function($input, value, multiline) {
/**
* Sets the onclick event to set the value on the input|textarea to the selected search result.
*
* @param jQuery $input Search input|textarea.
* @param object value Result object.
* @param jQuery $row Result element.
* @param jQuery $container jQuery object for the search container.
*
* @return undefined
* @param {jQuery} $input Search input|textarea.
* @param {object} value Result object.
* @param {jQuery} $row Result element.
* @param {jQuery} $container jQuery object for the search container.
*/
phpbb.search.setValueOnClick = function($input, value, $row, $container) {
$row.click(function() {
@ -558,11 +545,11 @@ phpbb.search.setValueOnClick = function($input, value, $row, $container) {
* already, those are displayed instead. Executes the AJAX request function
* itself due to the need to use a timeout to limit the number of requests.
*
* @param array data Data to be sent to the server.
* @param object event Onkeyup event object.
* @param function sendRequest Function to execute AJAX request.
* @param {Array} data Data to be sent to the server.
* @param {object} event Onkeyup event object.
* @param {function} sendRequest Function to execute AJAX request.
*
* @return bool Returns false.
* @returns {bool} Returns false.
*/
phpbb.search.filter = function(data, event, sendRequest) {
var $this = $(this),
@ -616,12 +603,10 @@ phpbb.search.filter = function(data, event, sendRequest) {
/**
* Handle search result response.
*
* @param object res Data received from server.
* @param jQuery $input Search input|textarea.
* @param bool fromCache Whether the results are from the cache.
* @param function callback Optional callback to run when assigning each search result.
*
* @return undefined
* @param {object} res Data received from server.
* @param {jQuery} $input Search input|textarea.
* @param {bool} fromCache Whether the results are from the cache.
* @param {function} callback Optional callback to run when assigning each search result.
*/
phpbb.search.handleResponse = function(res, $input, fromCache, callback) {
if (typeof res !== 'object') {
@ -648,12 +633,10 @@ phpbb.search.handleResponse = function(res, $input, fromCache, callback) {
/**
* Show search results.
*
* @param array results Search results.
* @param jQuery $input Search input|textarea.
* @param jQuery $container Search results container element.
* @param function callback Optional callback to run when assigning each search result.
*
* @return undefined
* @param {Array} results Search results.
* @param {jQuery} $input Search input|textarea.
* @param {jQuery} $container Search results container element.
* @param {function} callback Optional callback to run when assigning each search result.
*/
phpbb.search.showResults = function(results, $input, $container, callback) {
var $resultContainer = $('.search-results', $container);
@ -690,8 +673,7 @@ phpbb.search.showResults = function(results, $input, $container, callback) {
/**
* Clear search results.
*
* @param jQuery $container Search results container.
* @return undefined
* @param {jQuery} $container Search results container.
*/
phpbb.search.clearResults = function($container) {
$container.children(':not(.search-result-tpl)').remove();
@ -710,8 +692,8 @@ phpbb.history = {};
/**
* Check whether a method in the native history object is supported.
*
* @param string fn Method name.
* @return bool Returns true if the method is supported.
* @param {string} fn Method name.
* @returns {bool} Returns true if the method is supported.
*/
phpbb.history.isSupported = function(fn) {
return !(typeof history === 'undefined' || typeof history[fn] === 'undefined');
@ -721,12 +703,10 @@ phpbb.history.isSupported = function(fn) {
* Wrapper for the pushState and replaceState methods of the
* native history object.
*
* @param string mode Mode. Either push or replace.
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
* @param {string} mode Mode. Either push or replace.
* @param {string} url New URL.
* @param {string} [title] Optional page title.
* @param {object} [obj] Optional state object.
*/
phpbb.history.alterUrl = function(mode, url, title, obj) {
var fn = mode + 'State';
@ -747,11 +727,9 @@ phpbb.history.alterUrl = function(mode, url, title, obj) {
/**
* Wrapper for the native history.replaceState method.
*
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
* @param {string} url New URL.
* @param {string} [title] Optional page title.
* @param {object} [obj] Optional state object.
*/
phpbb.history.replaceUrl = function(url, title, obj) {
phpbb.history.alterUrl('replace', url, title, obj);
@ -760,11 +738,9 @@ phpbb.history.replaceUrl = function(url, title, obj) {
/**
* Wrapper for the native history.pushState method.
*
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
* @param {string} url New URL.
* @param {string} [title] Optional page title.
* @param {object} [obj] Optional state object.
*/
phpbb.history.pushUrl = function(url, title, obj) {
phpbb.history.alterUrl('push', url, title, obj);
@ -773,7 +749,8 @@ phpbb.history.pushUrl = function(url, title, obj) {
/**
* Hide the optgroups that are not the selected timezone
*
* @param bool keepSelection Shall we keep the value selected, or shall the user be forced to repick one.
* @param {bool} keepSelection Shall we keep the value selected, or shall the
* user be forced to repick one.
*/
phpbb.timezoneSwitchDate = function(keepSelection) {
var $timezoneCopy = $('#timezone_copy');
@ -796,7 +773,7 @@ phpbb.timezoneSwitchDate = function(keepSelection) {
}
if ($tzDate.val() !== '') {
$timezone.children('optgroup').remove(':not([data-tz-value="' + $('#tz_date').val() + '"])');
$timezone.children('optgroup').remove(':not([data-tz-value="' + $tzDate.val() + '"])');
}
if ($tzDate.val() === $tzSelectDateSuggest.attr('data-suggested-tz')) {
@ -831,7 +808,7 @@ phpbb.timezoneEnableDateSelection = function() {
/**
* Preselect a date/time or suggest one, if it is not picked.
*
* @param bool forceSelector Shall we select the suggestion?
* @param {bool} forceSelector Shall we select the suggestion?
*/
phpbb.timezonePreselectSelect = function(forceSelector) {
@ -900,8 +877,8 @@ phpbb.ajaxCallbacks = {};
*
* See the phpbb.ajaxify comments for information on stuff like parameters.
*
* @param string id The name of the callback.
* @param function callback The callback to be called.
* @param {string} id The name of the callback.
* @param {function} callback The callback to be called.
*/
phpbb.addAjaxCallback = function(id, callback) {
if (typeof callback === 'function') {
@ -992,7 +969,7 @@ phpbb.addAjaxCallback('toggle_link', function() {
* types text.
*
* @param {jQuery} $items jQuery object(s) to resize
* @param {object} options Optional parameter that adjusts default
* @param {object} [options] Optional parameter that adjusts default
* configuration. See configuration variable
*
* Optional parameters:
@ -1036,7 +1013,7 @@ phpbb.resizeTextArea = function($items, options) {
function autoResize(item) {
function setHeight(height) {
height += parseInt($item.css('height')) - $item.height();
height += parseInt($item.css('height'), 10) - $item.height();
$item.css({height: height + 'px', resize: 'none'}).addClass('auto-resized');
configuration.resizeCallback.call(item, $item);
}
@ -1053,7 +1030,7 @@ phpbb.resizeTextArea = function($items, options) {
configuration.maxHeight
),
$item = $(item),
height = parseInt($item.height()),
height = parseInt($item.height(), 10),
scrollHeight = (item.scrollHeight) ? item.scrollHeight : 0;
if (height < 0) {
@ -1092,7 +1069,7 @@ phpbb.resizeTextArea = function($items, options) {
* @param {Array} endTags List of end tags to look for
* For example, Array('[/code]')
*
* @return {boolean} True if cursor is in bbcode tag
* @returns {boolean} True if cursor is in bbcode tag
*/
phpbb.inBBCodeTag = function(textarea, startTags, endTags) {
var start = textarea.selectionStart,
@ -1164,7 +1141,7 @@ phpbb.applyCodeEditor = function(textarea) {
* @param {boolean} stripCodeStart If true, only part of line
* after [code] tag will be returned.
*
* @return {string} Line of text
* @returns {string} Line of text
*/
function getLastLine(stripCodeStart) {
var start = textarea.selectionStart,
@ -1197,7 +1174,7 @@ phpbb.applyCodeEditor = function(textarea) {
/**
* Append text at cursor position
*
* @param {string} Text Text to append
* @param {string} text Text to append
*/
function appendText(text) {
var start = textarea.selectionStart,
@ -1245,10 +1222,10 @@ phpbb.applyCodeEditor = function(textarea) {
* This function will enable the drag and drop animation for a specified
* textarea.
*
* @param {object} textarea Textarea DOM object to apply editor to
* @param {HTMLElement} textarea Textarea DOM object to apply editor to
*/
phpbb.showDragNDrop = function(textarea) {
if (textarea == null) {
if (!textarea) {
return;
}
@ -1423,9 +1400,9 @@ phpbb.registerDropdown = function(toggle, dropdown, options) {
/**
* Get the HTML for a color palette table.
*
* @param string dir Palette direction - either v or h
* @param int width Palette cell width.
* @param int height Palette cell height.
* @param {string} dir Palette direction - either v or h
* @param {int} width Palette cell width.
* @param {int} height Palette cell height.
*/
phpbb.colorPalette = function(dir, width, height) {
var r = 0,
@ -1477,7 +1454,7 @@ phpbb.colorPalette = function(dir, width, height) {
/**
* Register a color palette.
*
* @param object el jQuery object for the palette container.
* @param {jQuery} el jQuery object for the palette container.
*/
phpbb.registerPalette = function(el) {
var orientation = el.attr('data-orientation'),
@ -1506,15 +1483,15 @@ phpbb.registerPalette = function(el) {
}
e.preventDefault();
});
}
};
/**
* Set display of page element
*
* @param string id The ID of the element to change
* @param int action Set to 0 if element display should be toggled, -1 for
* @param {string} id The ID of the element to change
* @param {int} action Set to 0 if element display should be toggled, -1 for
* hiding the element, and 1 for showing it.
* @param string type Display type that should be used, e.g. inline, block or
* @param {string} type Display type that should be used, e.g. inline, block or
* other CSS "display" types
*/
phpbb.toggleDisplay = function(id, action, type) {
@ -1535,8 +1512,7 @@ phpbb.toggleDisplay = function(id, action, type) {
* Toggle additional settings based on the selected
* option of select element.
*
* @param jQuery el jQuery select element object.
* @return undefined
* @param {jQuery} el jQuery select element object.
*/
phpbb.toggleSelectSettings = function(el) {
el.children().each(function() {
@ -1550,8 +1526,8 @@ phpbb.toggleSelectSettings = function(el) {
* Get function from name.
* Based on http://stackoverflow.com/a/359910
*
* @param string functionName Function to get.
* @return function
* @param {string} functionName Function to get.
* @returns function
*/
phpbb.getFunctionByName = function (functionName) {
var namespaces = functionName.split('.'),

View File

@ -159,7 +159,7 @@ function insert_text(text, spaces, popup) {
/**
* Add inline attachment at position
*/
function attach_inline(index, filename) {
function attachInline(index, filename) {
insert_text('[attachment=' + index + ']' + filename + '[/attachment]');
document.forms[form_name].elements[text_name].focus();
}

View File

@ -1,14 +1,14 @@
/* global phpbb, plupload, attachInline */
plupload.addI18n(phpbb.plupload.i18n);
phpbb.plupload.ids = [];
(function($) { // Avoid conflicts with other libraries
"use strict";
'use strict';
/**
* Set up the uploader.
*
* @return undefined
*/
phpbb.plupload.initialize = function() {
// Initialize the Plupload uploader.
@ -20,7 +20,7 @@ phpbb.plupload.initialize = function() {
// Only execute if Plupload initialized successfully.
phpbb.plupload.uploader.bind('Init', function() {
phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0],
phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0];
phpbb.plupload.rowTpl = $('#attach-row-tpl')[0].outerHTML;
// Hide the basic upload panel and remove the attach row template.
@ -48,8 +48,6 @@ phpbb.plupload.initialize = function() {
/**
* Unsets all elements in the object uploader.settings.multipart_params whose keys
* begin with 'attachment_data['
*
* @return undefined
*/
phpbb.plupload.clearParams = function() {
var obj = phpbb.plupload.uploader.settings.multipart_params;
@ -65,20 +63,17 @@ phpbb.plupload.clearParams = function() {
/**
* Update uploader.settings.multipart_params object with new data.
*
* @param object obj
* @return undefined
* @param {object} obj
*/
phpbb.plupload.updateMultipartParams = function(obj) {
phpbb.plupload.uploader.settings.multipart_params = $.extend(
phpbb.plupload.uploader.settings.multipart_params,
obj
);
var settings = phpbb.plupload.uploader.settings;
settings.multipart_params = $.extend(settings.multipart_params, obj);
};
/**
* Convert the array of attachment objects into an object that PHP would expect as POST data.
*
* @return object An object in the form 'attachment_data[i][key]': value as
* @returns {object} An object in the form 'attachment_data[i][key]': value as
* expected by the server
*/
phpbb.plupload.getSerializedData = function() {
@ -100,22 +95,19 @@ phpbb.plupload.getSerializedData = function() {
* Get the index from the phpbb.plupload.data array where the given
* attachment id appears.
*
* @param int attach_id The attachment id of the file.
* @return bool Returns false if the id cannot be found.
* @return int Returns the index of the file if it exists.
* @param {int} attachId The attachment id of the file.
* @returns {bool|int} Index of the file if exists, otherwise false.
*/
phpbb.plupload.getIndex = function(attach_id) {
var index = $.inArray(Number(attach_id), phpbb.plupload.ids);
phpbb.plupload.getIndex = function(attachId) {
var index = $.inArray(Number(attachId), phpbb.plupload.ids);
return (index !== -1) ? index : false;
};
/**
* Set the data in phpbb.plupload.data and phpbb.plupload.ids arrays.
*
* @param array data Array containing the new data to use. In the form of
* @param {Array} data Array containing the new data to use. In the form of
* array(index => object(property: value). Requires attach_id to be one of the object properties.
*
* @return undefined
*/
phpbb.plupload.setData = function(data) {
// Make sure that the array keys are reset.
@ -130,11 +122,10 @@ phpbb.plupload.setData = function(data) {
/**
* Update the attachment data in the HTML and the phpbb & phpbb.plupload objects.
*
* @param array data Array containing the new data to use.
* @param string action The action that required the update. Used to update the inline attachment bbcodes.
* @param int index The index from phpbb.plupload_ids that was affected by the action.
* @param array downloadUrl Optional array of download urls to update.
* @return undefined
* @param {Array} data Array containing the new data to use.
* @param {string} action The action that required the update. Used to update the inline attachment bbcodes.
* @param {int} index The index from phpbb.plupload_ids that was affected by the action.
* @param {Array} downloadUrl Optional array of download urls to update.
*/
phpbb.plupload.update = function(data, action, index, downloadUrl) {
@ -148,8 +139,7 @@ phpbb.plupload.update = function(data, action, index, downloadUrl) {
/**
* Update the relevant elements and hidden data for all attachments.
*
* @param array downloadUrl Optional array of download urls to update.
* @return undefined
* @param {Array} downloadUrl Optional array of download urls to update.
*/
phpbb.plupload.updateRows = function(downloadUrl) {
for (var i = 0; i < phpbb.plupload.ids.length; i++) {
@ -163,8 +153,7 @@ phpbb.plupload.updateRows = function(downloadUrl) {
* data for the file inserted into it. The row is then appended or prepended to
* #file-list based on the attach_order setting.
*
* @param object file Plupload file object for the new attachment.
* @return undefined
* @param {object} file Plupload file object for the new attachment.
*/
phpbb.plupload.insertRow = function(file) {
var row = $(phpbb.plupload.rowTpl);
@ -183,9 +172,8 @@ phpbb.plupload.insertRow = function(file) {
/**
* Update the relevant elements and hidden data for an attachment.
*
* @param int index The index from phpbb.plupload.ids of the attachment to edit.
* @param array downloadUrl Optional array of download urls to update.
* @return undefined
* @param {int} index The index from phpbb.plupload.ids of the attachment to edit.
* @param {Array} downloadUrl Optional array of download urls to update.
*/
phpbb.plupload.updateRow = function(index, downloadUrl) {
var attach = phpbb.plupload.data[index],
@ -197,7 +185,7 @@ phpbb.plupload.updateRow = function(index, downloadUrl) {
link = $('<a></a>');
link.attr('href', url).html(attach.real_filename);
row.find('.file-name').html(link)
row.find('.file-name').html(link);
}
row.find('textarea').attr('name', 'comment_list[' + index + ']');
@ -207,15 +195,18 @@ phpbb.plupload.updateRow = function(index, downloadUrl) {
/**
* Update hidden input data for an attachment.
*
* @param object row jQuery object for the attachment row.
* @param object attach Attachment data object from phpbb.plupload.data
* @param int index Attachment index from phpbb.plupload.ids
* @return undefined
* @param {object} row jQuery object for the attachment row.
* @param {object} attach Attachment data object from phpbb.plupload.data
* @param {int} index Attachment index from phpbb.plupload.ids
*/
phpbb.plupload.updateHiddenData = function(row, attach, index) {
row.find('input[type="hidden"]').remove();
for (var key in attach) {
if (!attach.hasOwnProperty(key)) {
return;
}
var input = $('<input />')
.attr('type', 'hidden')
.attr('name', 'attachment_data[' + index + '][' + key +']')
@ -230,10 +221,8 @@ phpbb.plupload.updateHiddenData = function(row, attach, index) {
* responds with the updated attachment data list so that any future
* uploads can maintain state with the server
*
* @param object row jQuery object for the attachment row.
* @param int attachId Attachment id of the file to be removed.
*
* @return undefined
* @param {object} row jQuery object for the attachment row.
* @param {int} attachId Attachment id of the file to be removed.
*/
phpbb.plupload.deleteFile = function(row, attachId) {
// If there's no attach id, then the file hasn't been uploaded. Simply delete the row.
@ -300,14 +289,12 @@ phpbb.plupload.deleteFile = function(row, attachId) {
/**
* Check the attachment list and hide its container if it's empty.
*
* @return undefined
*/
phpbb.plupload.hideEmptyList = function() {
if (!$('#file-list').children().length) {
$('#file-list-container').slideUp(100);
}
}
};
/**
* Update the indices used in inline attachment bbcodes. This ensures that the bbcodes
@ -315,10 +302,8 @@ phpbb.plupload.hideEmptyList = function() {
* before the phpbb.plupload,data and phpbb.plupload.ids arrays are updated, otherwise it will
* not work correctly.
*
* @param string action The action that occurred -- either "addition" or "removal"
* @param int index The index of the attachment from phpbb.plupload.ids that was affected.
*
* @return undefined
* @param {string} action The action that occurred -- either "addition" or "removal"
* @param {int} index The index of the attachment from phpbb.plupload.ids that was affected.
*/
phpbb.plupload.updateBbcode = function(action, index) {
var textarea = $('#message', phpbb.plupload.form),
@ -330,46 +315,41 @@ phpbb.plupload.updateBbcode = function(action, index) {
return;
}
// Private function used to replace the bbcode.
var updateBbcode = function(match, fileName) {
// Remove the bbcode if the file was removed.
if (removal && index === i) {
return '';
}
var newIndex = i + ((removal) ? -1 : 1);
return '[attachment=' + newIndex +']' + fileName + '[/attachment]';
};
function runUpdate(i) {
var regex = new RegExp('\\[attachment=' + i + '\\](.*?)\\[\\/attachment\\]', 'g');
text = text.replace(regex, function updateBbcode(_, fileName) {
// Remove the bbcode if the file was removed.
if (removal && index === i) {
return '';
}
var newIndex = i + ((removal) ? -1 : 1);
return '[attachment=' + newIndex +']' + fileName + '[/attachment]';
});
}
// Private function used to generate search regexp
var searchRegexp = function(index) {
return new RegExp('\\[attachment=' + index + '\\](.*?)\\[\\/attachment\\]', 'g');
}
// The update order of the indices is based on the action taken to ensure that we don't corrupt
// the bbcode index by updating it several times as we move through the loop.
// Removal loop starts at the removed index and moves to the end of the array.
// Addition loop starts at the end of the array and moves to the added index at 0.
var searchLoop = function() {
if (typeof i === 'undefined') {
i = (removal) ? index : phpbb.plupload.ids.length - 1;
}
return (removal) ? (i < phpbb.plupload.ids.length): (i >= index);
}
// Loop forwards when removing and backwards when adding ensures we don't
// corrupt the bbcode index.
var i;
while (searchLoop()) {
text = text.replace(searchRegexp(i), updateBbcode);
(removal) ? i++ : i--;
if (removal) {
for (i = index; i < phpbb.plupload.ids.length; i++) {
runUpdate(i);
}
} else {
for (i = phpbb.plupload.ids.length - 1; i >= index; i--) {
runUpdate(i);
}
}
textarea.val(text);
};
/**
* Get Plupload file objects based on their upload status.
*
* @param int status Plupload status - plupload.DONE, plupload.FAILED, plupload.QUEUED,
* plupload.STARTED, plupload.STOPPED
* @param {int} status Plupload status - plupload.DONE, plupload.FAILED,
* plupload.QUEUED, plupload.STARTED, plupload.STOPPED
*
* @return Returns an array of the Plupload file objects matching the status.
* @returns {Array} The Plupload file objects matching the status.
*/
phpbb.plupload.getFilesByStatus = function(status) {
var files = [];
@ -380,14 +360,14 @@ phpbb.plupload.getFilesByStatus = function(status) {
}
});
return files;
}
};
/**
* Check whether the user has reached the maximun number of files that he's allowed
* to upload. If so, disables the uploader and marks the queued files as failed. Otherwise
* makes sure that the uploader is enabled.
*
* @return bool Returns true if the limit has been reached. False if otherwise.
* @returns {bool} True if the limit has been reached. False if otherwise.
*/
phpbb.plupload.handleMaxFilesReached = function() {
// If there is no limit, the user is an admin or moderator.
@ -408,33 +388,28 @@ phpbb.plupload.handleMaxFilesReached = function() {
phpbb.plupload.enableUploader();
}
return false;
}
};
/**
* Disable the uploader
*
* @return undefined
*/
phpbb.plupload.disableUploader = function() {
$('#add_files').addClass('disabled');
phpbb.plupload.uploader.disableBrowse();
}
};
/**
* Enable the uploader
*
* @return undefined
*/
phpbb.plupload.enableUploader = function() {
$('#add_files').removeClass('disabled');
phpbb.plupload.uploader.disableBrowse(false);
}
};
/**
* Mark all queued files as failed.
*
* @param string error Error message to present to the user.
* @return undefined
* @param {string} error Error message to present to the user.
*/
phpbb.plupload.markQueuedFailed = function(error) {
var files = phpbb.plupload.getFilesByStatus(plupload.QUEUED);
@ -443,22 +418,24 @@ phpbb.plupload.markQueuedFailed = function(error) {
$('#' + file.id).find('.file-progress').hide();
phpbb.plupload.fileError(file, error);
});
}
};
/**
* Marks a file as failed and sets the error message for it.
*
* @param object file Plupload file object that failed.
* @param string error Error message to present to the user.
* @return undefined
* @param {object} file Plupload file object that failed.
* @param {string} error Error message to present to the user.
*/
phpbb.plupload.fileError = function(file, error) {
file.status = plupload.FAILED;
file.error = error;
$('#' + file.id).find('.file-status').addClass('file-error').attr({'data-error-title': phpbb.plupload.lang.ERROR, 'data-error-message': error});
}
$('#' + file.id).find('.file-status')
.addClass('file-error')
.attr({
'data-error-title': phpbb.plupload.lang.ERROR,
'data-error-message': error
});
};
/**
@ -467,24 +444,23 @@ phpbb.plupload.fileError = function(file, error) {
phpbb.plupload.uploader = new plupload.Uploader(phpbb.plupload.config);
phpbb.plupload.initialize();
var $fileList = $('#file-list');
/**
* Insert inline attachment bbcode.
*/
$('#file-list').on('click', '.file-inline-bbcode', function(e) {
$fileList.on('click', '.file-inline-bbcode', function(e) {
var attachId = $(this).parents('.attach-row').attr('data-attach-id'),
index = phpbb.plupload.getIndex(attachId);
attach_inline(index, phpbb.plupload.data[index].real_filename);
attachInline(index, phpbb.plupload.data[index].real_filename);
e.preventDefault();
});
/**
* Delete a file.
*/
$('#file-list').on('click', '.file-delete', function(e) {
$fileList.on('click', '.file-delete', function(e) {
var row = $(this).parents('.attach-row'),
attachId = row.attr('data-attach-id');
@ -495,7 +471,7 @@ $('#file-list').on('click', '.file-delete', function(e) {
/**
* Display the error message for a particular file when the error icon is clicked.
*/
$('#file-list').on('click', '.file-error', function(e) {
$fileList.on('click', '.file-error', function(e) {
phpbb.alert($(this).attr('data-error-title'), $(this).attr('data-error-message'));
e.preventDefault();
});
@ -520,11 +496,8 @@ phpbb.plupload.uploader.bind('Error', function(up, error) {
* send the real filename along with the chunk. This is necessary because
* for some reason the filename is set to 'blob' whenever a file is chunked
*
* @param object up The plupload.Uploader object
* @param object file The plupload.File object that is about to be
* uploaded
*
* @return undefined
* @param {object} up The plupload.Uploader object
* @param {object} file The plupload.File object that is about to be uploaded
*/
phpbb.plupload.uploader.bind('BeforeUpload', function(up, file) {
if (phpbb.plupload.handleMaxFilesReached()) {
@ -539,12 +512,10 @@ phpbb.plupload.uploader.bind('BeforeUpload', function(up, file) {
* response from the server and checks for an error. If an error occurs it
* is reported to the user and the upload of this particular file is halted
*
* @param object up The plupload.Uploader object
* @param object file The plupload.File object whose chunk has just
* @param {object} up The plupload.Uploader object
* @param {object} file The plupload.File object whose chunk has just
* been uploaded
* @param object response The response object from the server
*
* @return undefined
* @param {object} response The response object from the server
*/
phpbb.plupload.uploader.bind('ChunkUploaded', function(up, file, response) {
if (response.chunk >= response.chunks - 1) {
@ -584,8 +555,6 @@ phpbb.plupload.uploader.bind('ChunkUploaded', function(up, file, response) {
/**
* Fires when files are added to the queue.
*
* @return undefined
*/
phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {
// Prevent unnecessary requests to the server if the user already uploaded
@ -595,13 +564,14 @@ phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {
}
// Switch the active tab if the style supports it
if (typeof activateSubPanel == 'function') {
activateSubPanel('attach-panel');
if (typeof activateSubPanel === 'function') {
activateSubPanel('attach-panel'); // jshint ignore: line
}
// Show the file list if there aren't any files currently.
if (!$('#file-list-container').is(':visible')) {
$('#file-list-container').show(100);
var $fileListContainer = $('#file-list-container');
if (!$fileListContainer.is(':visible')) {
$fileListContainer.show(100);
}
$.each(files, function(i, file) {
@ -609,7 +579,7 @@ phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {
});
up.bind('UploadProgress', function(up, file) {
$('#' + file.id + " .file-progress-bar").css('width', file.percent + '%');
$('.file-progress-bar', '#' + file.id).css('width', file.percent + '%');
$('#file-total-progress-bar').css('width', up.total.percent + '%');
});
@ -627,12 +597,10 @@ phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {
* appends it to the next file upload so that the server can maintain state
* with regards to the attachments in a given post
*
* @param object up The plupload.Uploader object
* @param object file The plupload.File object that has just been
* @param {object} up The plupload.Uploader object
* @param {object} file The plupload.File object that has just been
* uploaded
* @param string response The response string from the server
*
* @return undefined
* @param {string} response The response string from the server
*/
phpbb.plupload.uploader.bind('FileUploaded', function(up, file, response) {
var json = {},
@ -643,7 +611,7 @@ phpbb.plupload.uploader.bind('FileUploaded', function(up, file, response) {
row.find('.file-progress').hide();
try {
json = $.parseJSON(response.response);
json = JSON.parse(response.response);
} catch (e) {
error = 'Error parsing server response.';
}
@ -662,25 +630,19 @@ phpbb.plupload.uploader.bind('FileUploaded', function(up, file, response) {
if (typeof error !== 'undefined') {
phpbb.plupload.fileError(file, error);
} else if (file.status === plupload.DONE) {
file.attachment_data = json['data'][0];
file.attachment_data = json.data[0];
row.attr('data-attach-id', file.attachment_data.attach_id);
row.find('.file-inline-bbcode').show();
row.find('.file-status').addClass('file-uploaded');
phpbb.plupload.update(json['data'], 'addition', 0, [json['download_url']]);
phpbb.plupload.update(json.data, 'addition', 0, [json.download_url]);
}
});
/**
* Fires when the entire queue of files have been uploaded.
*
* @param object up The plupload.Uploader object
* @param array files An array of plupload.File objects that have just
* been uploaded as part of a queue
*
* @return undefined
*/
phpbb.plupload.uploader.bind('UploadComplete', function(up, files) {
phpbb.plupload.uploader.bind('UploadComplete', function() {
// Hide the progress bar
setTimeout(function() {
$('#file-total-progress-bar').fadeOut(500, function() {

View File

@ -42,8 +42,8 @@ phpbb.addAjaxCallback('mark_forums_read', function(res) {
/**
* This callback will mark all topic icons read
*
* @param update_topic_links bool Whether "Mark topics read" links should be
* updated. Defaults to true.
* @param {bool} [update_topic_links=true] Whether "Mark topics read" links
* should be updated. Defaults to true.
*/
phpbb.addAjaxCallback('mark_topics_read', function(res, updateTopicLinks) {
var readTitle = res.NO_UNREAD_POSTS;
@ -138,9 +138,9 @@ phpbb.markNotifications = function($popup, unreadCount) {
}
// Update page title
$('title').text(
(unreadCount ? '(' + unreadCount + ')' : '') + $('title').text().replace(/(\(([0-9])\))/, '')
);
var $title = $('title');
var originalTitle = $title.text().replace(/(\((\d+)\))/, '');
$title.text((unreadCount ? '(' + unreadCount + ')' : '') + originalTitle);
};
// This callback finds the post from the delete link, and removes it.
@ -205,7 +205,7 @@ phpbb.addAjaxCallback('vote_poll', function(res) {
// Set min-height to prevent the page from jumping when the content changes
var updatePanelHeight = function (height) {
var height = (typeof height === 'undefined') ? panel.find('.inner').outerHeight() : height;
height = (typeof height === 'undefined') ? panel.find('.inner').outerHeight() : height;
panel.css('min-height', height);
};
updatePanelHeight();
@ -378,7 +378,7 @@ $('#member_search').click(function () {
*/
$(function() {
phpbb.resizeTextArea($('textarea:not(#message-box textarea, .no-auto-resize)'), {minHeight: 75, maxHeight: 250});
phpbb.resizeTextArea($('#message-box textarea'));
phpbb.resizeTextArea($('textarea', '#message-box'));
});

View File

@ -221,7 +221,7 @@
<!-- IF S_INLINE_ATTACHMENT_OPTIONS -->
<tr>
<td class="row1"><b class="genmed">{L_ATTACHMENTS}{L_COLON}</b></td>
<td class="row2"><select name="attachments">{S_INLINE_ATTACHMENT_OPTIONS}</select>&nbsp;<input type="button" class="btnbbcode" accesskey="a" value="{L_PLACE_INLINE}" name="attachinline" onclick="attach_form = document.forms[form_name].elements['attachments']; attach_inline(attach_form.value, attach_form.options[attach_form.selectedIndex].text);" onmouseover="helpline('a')" onmouseout="helpline('tip')" />
<td class="row2"><select name="attachments">{S_INLINE_ATTACHMENT_OPTIONS}</select>&nbsp;<input type="button" class="btnbbcode" accesskey="a" value="{L_PLACE_INLINE}" name="attachinline" onclick="attach_form = document.forms[form_name].elements['attachments']; attachInline(attach_form.value, attach_form.options[attach_form.selectedIndex].text);" onmouseover="helpline('a')" onmouseout="helpline('tip')" />
</td>
</tr>
<!-- ENDIF -->