diff options
Diffstat (limited to 'phpBB')
31 files changed, 418 insertions, 347 deletions
diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index 806db7d35f..88ef5733fe 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -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), @@ -262,8 +257,15 @@ phpbb.ajaxify = function(options) {  				console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);  			}  			phpbb.clearLoadingTimeout(); -			var errorText = false; -			if (typeof errorThrown === 'string' && errorThrown.length > 0) { +			var responseText, errorText = false; +			try { +				responseText = JSON.parse(jqXHR.responseText); +				responseText = responseText.message; +			} catch (e) {} +			if (typeof responseText === 'string' && responseText.length > 0) { +				errorText = responseText; +			} +			else if (typeof errorThrown === 'string' && errorThrown.length > 0) {  				errorText = errorThrown;  			}  			else { @@ -283,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; @@ -429,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]) { @@ -442,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]) { @@ -458,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(); @@ -482,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) { @@ -500,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; @@ -512,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) { @@ -531,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() { @@ -551,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), @@ -609,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') { @@ -641,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); @@ -683,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(); @@ -703,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'); @@ -714,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'; @@ -740,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); @@ -753,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); @@ -766,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'); @@ -789,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')) { @@ -824,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) { @@ -893,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') { @@ -985,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: @@ -1029,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);  		} @@ -1046,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) { @@ -1085,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, @@ -1157,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, @@ -1190,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, @@ -1233,6 +1217,31 @@ phpbb.applyCodeEditor = function(textarea) {  };  /** + * Show drag and drop animation when textarea is present + * + * This function will enable the drag and drop animation for a specified + * textarea. + * + * @param {HTMLElement} textarea Textarea DOM object to apply editor to + */ +phpbb.showDragNDrop = function(textarea) { +	if (!textarea) { +		return; +	} + +	$('body').on('dragenter dragover', function () { +		$(textarea).addClass('drag-n-drop'); +	}).on('dragleave dragout dragend drop', function() { +		$(textarea).removeClass('drag-n-drop'); +	}); +	$(textarea).on('dragenter dragover', function () { +		$(textarea).addClass('drag-n-drop-highlight'); +	}).on('dragleave dragout dragend drop', function() { +		$(textarea).removeClass('drag-n-drop-highlight'); +	}); +}; + +/**  * List of classes that toggle dropdown menu,  * list of classes that contain visible dropdown menu  * @@ -1391,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,  @@ -1445,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'), @@ -1474,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) { @@ -1503,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() { @@ -1518,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('.'), diff --git a/phpBB/assets/javascript/editor.js b/phpBB/assets/javascript/editor.js index 5fd4f7eae3..298526ab1f 100644 --- a/phpBB/assets/javascript/editor.js +++ b/phpBB/assets/javascript/editor.js @@ -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();  } @@ -355,6 +355,9 @@ function getCaretPosition(txtarea) {  		textarea = doc.forms[form_name].elements[text_name];  		phpbb.applyCodeEditor(textarea); +		if ($('#attach-panel').length) { +			phpbb.showDragNDrop(textarea); +		}  	});  })(jQuery); diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js index a58c71e64d..3845de6c56 100644 --- a/phpBB/assets/javascript/plupload.js +++ b/phpBB/assets/javascript/plupload.js @@ -1,26 +1,26 @@ +/* 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. -	uploader.init(); +	phpbb.plupload.uploader.init();  	// Set attachment data.  	phpbb.plupload.setData(phpbb.plupload.data);  	phpbb.plupload.updateMultipartParams(phpbb.plupload.getSerializedData());  	// Only execute if Plupload initialized successfully. -	uploader.bind('Init', function() { -		phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0], +	phpbb.plupload.uploader.bind('Init', function() { +		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. @@ -29,18 +29,18 @@ phpbb.plupload.initialize = function() {  		$('#attach-panel-multi').show();  	}); -	uploader.bind('PostInit', function() { +	phpbb.plupload.uploader.bind('PostInit', function() {  		// Point out the drag-and-drop zone if it's supported. -		if (uploader.features.dragdrop) { +		if (phpbb.plupload.uploader.features.dragdrop) {  			$('#drag-n-drop-message').show();  		}  		// Ensure "Add files" button position is correctly calculated.  		if ($('#attach-panel-multi').is(':visible')) { -			uploader.refresh(); +			phpbb.plupload.uploader.refresh();  		}  		$('[data-subpanel="attach-panel"]').one('click', function() { -			uploader.refresh(); +			phpbb.plupload.uploader.refresh();  		});  	});  }; @@ -48,37 +48,32 @@ 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 = uploader.settings.multipart_params; +	var obj = phpbb.plupload.uploader.settings.multipart_params;  	for (var key in obj) {  		if (!obj.hasOwnProperty(key) || key.indexOf('attachment_data[') !== 0) {  			continue;  		} -		delete uploader.settings.multipart_params[key]; +		delete phpbb.plupload.uploader.settings.multipart_params[key];  	}  };  /**   * Update uploader.settings.multipart_params object with new data.   * - * @param object obj - * @return undefined + * @param {object} obj   */  phpbb.plupload.updateMultipartParams = function(obj) { -	uploader.settings.multipart_params = $.extend( -		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,16 +221,14 @@ 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.  	if (typeof attachId === 'undefined') { -		var file = uploader.getFile(row.attr('id')); -		uploader.removeFile(file); +		var file = phpbb.plupload.uploader.getFile(row.attr('id')); +		phpbb.plupload.uploader.removeFile(file);  		row.slideUp(100, function() {  			row.remove(); @@ -267,7 +256,7 @@ phpbb.plupload.deleteFile = function(row, attachId) {  		// trigger_error() was called which likely means a permission error was encountered.  		if (typeof response.title !== 'undefined') { -			uploader.trigger('Error', {message: response.message}); +			phpbb.plupload.uploader.trigger('Error', {message: response.message});  			// We will have to assume that the deletion failed. So leave the file status as uploaded.  			row.find('.file-status').toggleClass('file-uploaded'); @@ -278,15 +267,15 @@ phpbb.plupload.deleteFile = function(row, attachId) {  		phpbb.plupload.handleMaxFilesReached();  		if (row.attr('id')) { -			var file = uploader.getFile(row.attr('id')); -			uploader.removeFile(file); +			var file = phpbb.plupload.uploader.getFile(row.attr('id')); +			phpbb.plupload.uploader.removeFile(file);  		}  		row.slideUp(100, function() {  			row.remove();  			// Hide the file list if it's empty now.  			phpbb.plupload.hideEmptyList();  		}); -		uploader.trigger('FilesRemoved'); +		phpbb.plupload.uploader.trigger('FilesRemoved');  	};  	$.ajax(phpbb.plupload.config.url, { @@ -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,64 +315,59 @@ 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]'; -	}; - -	// Private function used to generate search regexp -	var searchRegexp = function(index) { -		return new RegExp('\\[attachment=' + index + '\\](.*?)\\[\\/attachment\\]', 'g'); +	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]'; +		});  	} -	// 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; + +	// Loop forwards when removing and backwards when adding ensures we don't +	// corrupt the bbcode index. +	var 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);  		} -		return (removal) ? (i < phpbb.plupload.ids.length): (i >= index);  	} -	var i; -	while (searchLoop()) { -		text = text.replace(searchRegexp(i), updateBbcode); -		(removal) ? i++ : 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 = []; -	$.each(uploader.files, function(i, file) { +	$.each(phpbb.plupload.uploader.files, function(i, file) {  		if (file.status === status) {  			files.push(file);  		}  	});  	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. @@ -400,7 +380,7 @@ phpbb.plupload.handleMaxFilesReached = function() {  		phpbb.plupload.markQueuedFailed(phpbb.plupload.lang.TOO_MANY_ATTACHMENTS);  		// Disable the uploader.  		phpbb.plupload.disableUploader(); -		uploader.trigger('Error', {message: phpbb.plupload.lang.TOO_MANY_ATTACHMENTS}); +		phpbb.plupload.uploader.trigger('Error', {message: phpbb.plupload.lang.TOO_MANY_ATTACHMENTS});  		return true;  	} else if(phpbb.plupload.maxFiles > phpbb.plupload.ids.length) { @@ -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'); -	uploader.disableBrowse(); -} +	phpbb.plupload.uploader.disableBrowse(); +};  /**   * Enable the uploader - * - * @return undefined   */  phpbb.plupload.enableUploader = function() {  	$('#add_files').removeClass('disabled'); -	uploader.disableBrowse(false); -} +	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,48 +418,49 @@ 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 +		}); +};  /**   * Set up the Plupload object and get some basic data.   */ -var	uploader = new plupload.Uploader(phpbb.plupload.config); +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();  }); @@ -503,7 +479,7 @@ $('#file-list').on('click', '.file-error', function(e) {  /**   * Fires when an error occurs.   */ -uploader.bind('Error', function(up, error) { +phpbb.plupload.uploader.bind('Error', function(up, error) {  	error.file.name = plupload.xmlEncode(error.file.name);  	// The error message that Plupload provides for these is vague, so we'll be more specific. @@ -520,13 +496,10 @@ 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   */ -uploader.bind('BeforeUpload', function(up, file) { +phpbb.plupload.uploader.bind('BeforeUpload', function(up, file) {  	if (phpbb.plupload.handleMaxFilesReached()) {  		return;  	} @@ -539,14 +512,12 @@ 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   */ -uploader.bind('ChunkUploaded', function(up, file, response) { +phpbb.plupload.uploader.bind('ChunkUploaded', function(up, file, response) {  	if (response.chunk >= response.chunks - 1) {  		return;  	} @@ -584,10 +555,8 @@ uploader.bind('ChunkUploaded', function(up, file, response) {  /**   * Fires when files are added to the queue. - * - * @return undefined   */ -uploader.bind('FilesAdded', function(up, files) { +phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {  	// Prevent unnecessary requests to the server if the user already uploaded  	// the maximum number of files allowed.  	if (phpbb.plupload.handleMaxFilesReached()) { @@ -595,13 +564,14 @@ 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 @@ 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,14 +597,12 @@ 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   */ -uploader.bind('FileUploaded', function(up, file, response) { +phpbb.plupload.uploader.bind('FileUploaded', function(up, file, response) {  	var json = {},  		row = $('#' + file.id),  		error; @@ -643,7 +611,7 @@ 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 @@ 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   */ -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() { diff --git a/phpBB/composer.json b/phpBB/composer.json index 69f0de8479..f2564de0f5 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -38,11 +38,11 @@  	},  	"require-dev": {  		"fabpot/goutte": "1.0.*", +		"phing/phing": "2.4.*",  		"phpunit/dbunit": "1.3.*",  		"phpunit/phpunit": "4.1.*", -		"phing/phing": "2.4.*",  		"sami/sami": "1.*", -		"squizlabs/php_codesniffer": "1.*", +		"squizlabs/php_codesniffer": "2.*",  		"symfony/browser-kit": "2.3.*",  		"symfony/css-selector": "2.3.*",  		"symfony/debug": "2.3.*", diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 07ae59f863..4a034bbdf8 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -1,9 +1,10 @@  {      "_readme": [          "This file locks the dependencies of your project to a known state", -        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" +        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", +        "This file is @generated automatically"      ], -    "hash": "d93446768ea0665b7c55c01890153a67", +    "hash": "17b51553237b78392baf2ec78bfdfbc0",      "packages": [          {              "name": "lusitanian/oauth", @@ -652,12 +653,12 @@              "version": "v1.13.2",              "source": {                  "type": "git", -                "url": "https://github.com/fabpot/Twig.git", +                "url": "https://github.com/twigphp/Twig.git",                  "reference": "6d6a1009427d1f398c9d40904147bf9f723d5755"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/fabpot/Twig/zipball/6d6a1009427d1f398c9d40904147bf9f723d5755", +                "url": "https://api.github.com/repos/twigphp/Twig/zipball/6d6a1009427d1f398c9d40904147bf9f723d5755",                  "reference": "6d6a1009427d1f398c9d40904147bf9f723d5755",                  "shasum": ""              }, @@ -682,14 +683,11 @@              "authors": [                  {                      "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" +                    "email": "fabien@symfony.com"                  },                  {                      "name": "Armin Ronacher", -                    "email": "armin.ronacher@active-4.com", -                    "role": "Project Founder" +                    "email": "armin.ronacher@active-4.com"                  }              ],              "description": "Twig, the flexible, fast, and secure template language for PHP", @@ -1914,41 +1912,45 @@          },          {              "name": "squizlabs/php_codesniffer", -            "version": "1.5.2", +            "version": "2.3.2",              "source": {                  "type": "git",                  "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", -                "reference": "a76a39b317ce8106abe6264daa505e24e1731860" +                "reference": "e96d8579fbed0c95ecf2a0501ec4f307a4aa6404"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/a76a39b317ce8106abe6264daa505e24e1731860", -                "reference": "a76a39b317ce8106abe6264daa505e24e1731860", +                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e96d8579fbed0c95ecf2a0501ec4f307a4aa6404", +                "reference": "e96d8579fbed0c95ecf2a0501ec4f307a4aa6404",                  "shasum": ""              },              "require": {                  "ext-tokenizer": "*", +                "ext-xmlwriter": "*",                  "php": ">=5.1.2"              }, -            "suggest": { -                "phpunit/php-timer": "dev-master" -            },              "bin": [ -                "scripts/phpcs" +                "scripts/phpcs", +                "scripts/phpcbf"              ],              "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0.x-dev" +                } +            },              "autoload": {                  "classmap": [                      "CodeSniffer.php",                      "CodeSniffer/CLI.php",                      "CodeSniffer/Exception.php",                      "CodeSniffer/File.php", +                    "CodeSniffer/Fixer.php",                      "CodeSniffer/Report.php",                      "CodeSniffer/Reporting.php",                      "CodeSniffer/Sniff.php",                      "CodeSniffer/Tokens.php",                      "CodeSniffer/Reports/", -                    "CodeSniffer/CommentParser/",                      "CodeSniffer/Tokenizers/",                      "CodeSniffer/DocGenerators/",                      "CodeSniffer/Standards/AbstractPatternSniff.php", @@ -1974,13 +1976,13 @@                      "role": "lead"                  }              ], -            "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", +            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",              "homepage": "http://www.squizlabs.com/php-codesniffer",              "keywords": [                  "phpcs",                  "standards"              ], -            "time": "2014-02-04 23:49:58" +            "time": "2015-04-28 23:28:20"          },          {              "name": "symfony/browser-kit", @@ -2236,17 +2238,13 @@              "time": "2014-10-01 05:38:33"          }      ], -    "aliases": [ - -    ], +    "aliases": [],      "minimum-stability": "stable", -    "stability-flags": [ - -    ], +    "stability-flags": [], +    "prefer-stable": false, +    "prefer-lowest": false,      "platform": {          "php": ">=5.3.3"      }, -    "platform-dev": [ - -    ] +    "platform-dev": []  } diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index d460497669..705222d66b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1159,7 +1159,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $  	/**  	 * This event is used for performing actions directly before marking forums,  	 * topics or posts as read. -	 *  +	 *  	 * It is also possible to prevent the marking. For that, the $should_markread parameter  	 * should be set to FALSE.  	 * diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php index f9ceecff63..90d59cfd1e 100644 --- a/phpBB/includes/functions_module.php +++ b/phpBB/includes/functions_module.php @@ -976,7 +976,7 @@ class p_master  	*  	* @param string $class module class (acp/mcp/ucp)  	* @param string $name module name (class name of the module, or its basename -    *                     phpbb_ext_foo_acp_bar_module, ucp_zebra or zebra) +	*                     phpbb_ext_foo_acp_bar_module, ucp_zebra or zebra)  	* @param string $mode mode, as passed through to the module  	*  	*/ diff --git a/phpBB/phpbb/auth/provider/oauth/token_storage.php b/phpBB/phpbb/auth/provider/oauth/token_storage.php index f488c2022d..9b6afae255 100644 --- a/phpBB/phpbb/auth/provider/oauth/token_storage.php +++ b/phpBB/phpbb/auth/provider/oauth/token_storage.php @@ -13,7 +13,6 @@  namespace phpbb\auth\provider\oauth; -  use OAuth\OAuth1\Token\StdOAuth1Token;  use OAuth\Common\Token\TokenInterface;  use OAuth\Common\Storage\TokenStorageInterface; diff --git a/phpBB/phpbb/db/sql_insert_buffer.php b/phpBB/phpbb/db/sql_insert_buffer.php index 14e3c54f09..18e4814a77 100644 --- a/phpBB/phpbb/db/sql_insert_buffer.php +++ b/phpBB/phpbb/db/sql_insert_buffer.php @@ -107,7 +107,7 @@ class sql_insert_buffer  	* first building a huge rowset. Or at least sizeof($rows) should be kept  	* small.  	* -	* @param array $rows  +	* @param array $rows  	*  	* @return bool		True when some data was flushed to the database.  	*					False otherwise. diff --git a/phpBB/phpbb/event/md_exporter.php b/phpBB/phpbb/event/md_exporter.php index 7f94ca9299..02c2a1b9d6 100644 --- a/phpBB/phpbb/event/md_exporter.php +++ b/phpBB/phpbb/event/md_exporter.php @@ -157,20 +157,64 @@ class md_exporter  			}  			list($file_details, $details) = explode("\n* Since: ", $details, 2); -			list($since, $description) = explode("\n* Purpose: ", $details, 2); + +			$changed_versions = array(); +			if (strpos($details, "\n* Changed: ") !== false) +			{ +				list($since, $details) = explode("\n* Changed: ", $details, 2); +				while (strpos($details, "\n* Changed: ") !== false) +				{ +					list($changed, $details) = explode("\n* Changed: ", $details, 2); +					$changed_versions[] = $changed; +				} +				list($changed, $description) = explode("\n* Purpose: ", $details, 2); +				$changed_versions[] = $changed; +			} +			else +			{ +				list($since, $description) = explode("\n* Purpose: ", $details, 2); +				$changed_versions = array(); +			}  			$files = $this->validate_file_list($file_details);  			$since = $this->validate_since($since); +			$changes = array(); +			foreach ($changed_versions as $changed) +			{ +				list($changed_version, $changed_description) = $this->validate_changed($changed); + +				if (isset($changes[$changed_version])) +				{ +					throw new \LogicException("Duplicate change information found for event '{$this->current_event}'"); +				} + +				$changes[$changed_version] = $changed_description; +			} +			$description = trim($description, "\n") . "\n";  			if (!$this->version_is_filtered($since))  			{ -				continue; +				$is_filtered = false; +				foreach ($changes as $version => $null) +				{ +					if ($this->version_is_filtered($version)) +					{ +						$is_filtered = true; +						break; +					} +				} + +				if (!$is_filtered) +				{ +					continue; +				}  			}  			$this->events[$event_name] = array(  				'event'			=> $this->current_event,  				'files'			=> $files,  				'since'			=> $since, +				'changed'		=> $changes,  				'description'	=> $description,  			);  		} @@ -182,6 +226,7 @@ class md_exporter  	 * The version to check  	 *  	 * @param string $version +	 * @return bool  	 */  	protected function version_is_filtered($version)  	{ @@ -269,7 +314,7 @@ class md_exporter  	*/  	public function validate_since($since)  	{ -		if (!preg_match('#^\d+\.\d+\.\d+(?:-(?:a|b|RC|pl)\d+)?$#', $since)) +		if (!$this->validate_version($since))  		{  			throw new \LogicException("Invalid since information found for event '{$this->current_event}'");  		} @@ -278,6 +323,44 @@ class md_exporter  	}  	/** +	* Validate "Changed" Information +	* +	* @param string $changed +	* @return string +	* @throws \LogicException +	*/ +	public function validate_changed($changed) +	{ +		if (strpos($changed, ' ') !== false) +		{ +			list($version, $description) = explode(' ', $changed, 2); +		} +		else +		{ +			$version = $changed; +			$description = ''; +		} + +		if (!$this->validate_version($version)) +		{ +			throw new \LogicException("Invalid changed information found for event '{$this->current_event}'"); +		} + +		return array($version, $description); +	} + +	/** +	* Validate "version" Information +	* +	* @param string $version +	* @return bool True if valid, false otherwise +	*/ +	public function validate_version($version) +	{ +		return preg_match('#^\d+\.\d+\.\d+(?:-(?:a|b|RC|pl)\d+)?$#', $version); +	} + +	/**  	* Validate the files list  	*  	* @param string $file_details diff --git a/phpBB/phpbb/event/php_exporter.php b/phpBB/phpbb/event/php_exporter.php index 8cffa4620f..d2ab0595c0 100644 --- a/phpBB/phpbb/event/php_exporter.php +++ b/phpBB/phpbb/event/php_exporter.php @@ -293,6 +293,7 @@ class php_exporter  	 * The version to check  	 *  	 * @param string $version +	 * @return bool  	 */  	protected function version_is_filtered($version)  	{ diff --git a/phpBB/phpbb/notification/method/base.php b/phpBB/phpbb/notification/method/base.php index a0bbed6fcd..6ee1d2984a 100644 --- a/phpBB/phpbb/notification/method/base.php +++ b/phpBB/phpbb/notification/method/base.php @@ -60,7 +60,7 @@ abstract class base implements \phpbb\notification\method\method_interface  	/**  	* Notification Method Base Constructor -	*  +	*  	* @param \phpbb\user_loader $user_loader  	* @param \phpbb\db\driver\driver_interface $db  	* @param \phpbb\cache\driver\driver_interface $cache @@ -85,7 +85,7 @@ abstract class base implements \phpbb\notification\method\method_interface  	/**  	* Set notification manager (required) -	*  +	*  	* @param \phpbb\notification\manager $notification_manager  	*/  	public function set_notification_manager(\phpbb\notification\manager $notification_manager) diff --git a/phpBB/phpbb/template/twig/node/definenode.php b/phpBB/phpbb/template/twig/node/definenode.php index c110785c4b..ddbd151d20 100644 --- a/phpBB/phpbb/template/twig/node/definenode.php +++ b/phpBB/phpbb/template/twig/node/definenode.php @@ -14,7 +14,6 @@  namespace phpbb\template\twig\node; -  class definenode extends \Twig_Node  {  	public function __construct($capture, \Twig_NodeInterface $name, \Twig_NodeInterface $value, $lineno, $tag = null) diff --git a/phpBB/phpbb/template/twig/node/event.php b/phpBB/phpbb/template/twig/node/event.php index 8fc4ba4775..b765bde98d 100644 --- a/phpBB/phpbb/template/twig/node/event.php +++ b/phpBB/phpbb/template/twig/node/event.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\node; -  class event extends \Twig_Node  {  	/** diff --git a/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php b/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php index 8c7f7b378d..2cd15d59da 100644 --- a/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php +++ b/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\node\expression\binary; -  class equalequal extends \Twig_Node_Expression_Binary  {  	public function operator(\Twig_Compiler $compiler) diff --git a/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php b/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php index 2e95c68090..5f2908fb9b 100644 --- a/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php +++ b/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\node\expression\binary; -  class notequalequal extends \Twig_Node_Expression_Binary  {  	public function operator(\Twig_Compiler $compiler) diff --git a/phpBB/phpbb/template/twig/node/includenode.php b/phpBB/phpbb/template/twig/node/includenode.php index 42428b6106..c36ac3c324 100644 --- a/phpBB/phpbb/template/twig/node/includenode.php +++ b/phpBB/phpbb/template/twig/node/includenode.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\node; -  class includenode extends \Twig_Node_Include  {  	/** diff --git a/phpBB/phpbb/template/twig/node/includephp.php b/phpBB/phpbb/template/twig/node/includephp.php index 659495fd9e..76182c2f84 100644 --- a/phpBB/phpbb/template/twig/node/includephp.php +++ b/phpBB/phpbb/template/twig/node/includephp.php @@ -14,7 +14,6 @@  namespace phpbb\template\twig\node; -  class includephp extends \Twig_Node  {  	/** @var \Twig_Environment */ diff --git a/phpBB/phpbb/template/twig/node/php.php b/phpBB/phpbb/template/twig/node/php.php index 3a24513dca..4ee415e446 100644 --- a/phpBB/phpbb/template/twig/node/php.php +++ b/phpBB/phpbb/template/twig/node/php.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\node; -  class php extends \Twig_Node  {  	/** @var \Twig_Environment */ diff --git a/phpBB/phpbb/template/twig/tokenparser/defineparser.php b/phpBB/phpbb/template/twig/tokenparser/defineparser.php index 2b88d61118..b755836ccd 100644 --- a/phpBB/phpbb/template/twig/tokenparser/defineparser.php +++ b/phpBB/phpbb/template/twig/tokenparser/defineparser.php @@ -14,7 +14,6 @@  namespace phpbb\template\twig\tokenparser; -  class defineparser extends \Twig_TokenParser  {  	/** diff --git a/phpBB/phpbb/template/twig/tokenparser/event.php b/phpBB/phpbb/template/twig/tokenparser/event.php index 4c7c8e07d9..f73ef4ae25 100644 --- a/phpBB/phpbb/template/twig/tokenparser/event.php +++ b/phpBB/phpbb/template/twig/tokenparser/event.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\tokenparser; -  class event extends \Twig_TokenParser  {  	/** diff --git a/phpBB/phpbb/template/twig/tokenparser/includejs.php b/phpBB/phpbb/template/twig/tokenparser/includejs.php index 4156048e42..4b67d2c468 100644 --- a/phpBB/phpbb/template/twig/tokenparser/includejs.php +++ b/phpBB/phpbb/template/twig/tokenparser/includejs.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\tokenparser; -  class includejs extends \Twig_TokenParser  {  	/** diff --git a/phpBB/phpbb/template/twig/tokenparser/includeparser.php b/phpBB/phpbb/template/twig/tokenparser/includeparser.php index 6ee78e5562..aa7236aaa6 100644 --- a/phpBB/phpbb/template/twig/tokenparser/includeparser.php +++ b/phpBB/phpbb/template/twig/tokenparser/includeparser.php @@ -14,7 +14,6 @@  namespace phpbb\template\twig\tokenparser; -  class includeparser extends \Twig_TokenParser_Include  {  	/** diff --git a/phpBB/phpbb/template/twig/tokenparser/includephp.php b/phpBB/phpbb/template/twig/tokenparser/includephp.php index c09f7729b0..3992636f8c 100644 --- a/phpBB/phpbb/template/twig/tokenparser/includephp.php +++ b/phpBB/phpbb/template/twig/tokenparser/includephp.php @@ -14,7 +14,6 @@  namespace phpbb\template\twig\tokenparser; -  class includephp extends \Twig_TokenParser  {  	/** diff --git a/phpBB/phpbb/template/twig/tokenparser/php.php b/phpBB/phpbb/template/twig/tokenparser/php.php index 557a70cca1..f11ce35896 100644 --- a/phpBB/phpbb/template/twig/tokenparser/php.php +++ b/phpBB/phpbb/template/twig/tokenparser/php.php @@ -13,7 +13,6 @@  namespace phpbb\template\twig\tokenparser; -  class php extends \Twig_TokenParser  {  	/** diff --git a/phpBB/styles/prosilver/template/ajax.js b/phpBB/styles/prosilver/template/ajax.js index 168efff4b4..1d95fa42fa 100644 --- a/phpBB/styles/prosilver/template/ajax.js +++ b/phpBB/styles/prosilver/template/ajax.js @@ -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'));  }); diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index e0c8e51d25..4e2013e276 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -27,22 +27,36 @@  	Modified by:  --> -<link href="{T_THEME_PATH}/print.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="print" title="printonly" /> -<!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF --> -<link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> -<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> -<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> +<!-- IF S_ALLOW_CDN --> +<script> +	WebFontConfig = { +		google: { +			families: ['Open Sans:n6'] +		} +	}; + +	(function(d) { +		var wf = d.createElement('script'), s = d.scripts[0]; +		wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js'; +		wf.async = true; +		s.parentNode.insertBefore(wf, s); +	})(document); +</script> +<!-- ENDIF --> +<link href="{T_STYLESHEET_LINK}" rel="stylesheet"> +<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet"> +<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px), all and (max-device-width: 700px)" />  <!-- IF S_CONTENT_DIRECTION eq 'rtl' --> -	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> +	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">  <!-- ENDIF -->  <!-- IF S_PLUPLOAD --> -	<link href="{T_THEME_PATH}/plupload.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> +	<link href="{T_THEME_PATH}/plupload.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">  <!-- ENDIF -->  <!--[if lte IE 9]> -	<link href="{T_THEME_PATH}/tweaks.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> +	<link href="{T_THEME_PATH}/tweaks.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">  <![endif]-->  <!-- EVENT overall_header_head_append --> diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 4743b4b39b..29cf641df2 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -977,6 +977,14 @@ fieldset.quick-login input.inputbox {  	color: #333333;  } +#message-box textarea.drag-n-drop { +	outline-color: rgba(102, 102, 102, 0.5); +} + +#message-box textarea.drag-n-drop-highlight { +	outline-color: rgba(17, 163, 234, 0.5); +} +  /* Input field styles  ---------------------------------------- */  .inputbox { diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index c0cc2bb2dd..7b17c58698 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -59,6 +59,7 @@ body {  	margin: 0;  	padding: 12px 0;  	word-wrap: break-word; +	-webkit-print-color-adjust: exact;  }  h1 { diff --git a/phpBB/styles/prosilver/theme/forms.css b/phpBB/styles/prosilver/theme/forms.css index f08a8a9691..777f011c35 100644 --- a/phpBB/styles/prosilver/theme/forms.css +++ b/phpBB/styles/prosilver/theme/forms.css @@ -243,6 +243,13 @@ fieldset.submit-buttons input {  	max-width: 100%;  	font-size: 1.2em;  	resize: vertical; +	outline: 3px dashed transparent; +	outline-offset: -4px; +	-webkit-transition: all .5s ease; +	-moz-transition: all .5s ease; +	-ms-transition: all .5s ease; +	-o-transition: all .5s ease; +	transition: all .5s ease;  }  /* Emoticons panel */ diff --git a/phpBB/styles/subsilver2/template/posting_body.html b/phpBB/styles/subsilver2/template/posting_body.html index 815d8c4a99..cde6873a90 100644 --- a/phpBB/styles/subsilver2/template/posting_body.html +++ b/phpBB/styles/subsilver2/template/posting_body.html @@ -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> <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> <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 -->  | 
