phpBB

Code Changes

File: assets/javascript/plupload.js

  Unmodified   Added   Modified   Removed
Line 1Line 1
 
/* global phpbb, plupload, attachInline */


plupload.addI18n(phpbb.plupload.i18n);
phpbb.plupload.ids = [];

(function($) { // Avoid conflicts with other libraries


plupload.addI18n(phpbb.plupload.i18n);
phpbb.plupload.ids = [];

(function($) { // Avoid conflicts with other libraries


"use strict";

'use strict';


/**
* Set up the uploader.


/**
* Set up the uploader.

 *
* @return undefined

 
 */
phpbb.plupload.initialize = function() {
// Initialize the Plupload uploader.

 */
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.


// 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.

		phpbb.plupload.rowTpl = $('#attach-row-tpl')[0].outerHTML;

// Hide the basic upload panel and remove the attach row template.

Line 29Line 29
		$('#attach-panel-multi').show();
});


		$('#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.

		// 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();
}

			$('#drag-n-drop-message').show();
}

 

// Ensure "Add files" button position is correctly calculated.
if ($('#attach-panel-multi').is(':visible')) {
phpbb.plupload.uploader.refresh();
}
$('[data-subpanel="attach-panel"]').one('click', function() {
phpbb.plupload.uploader.refresh();
});

	});
};

/**
* Unsets all elements in the object uploader.settings.multipart_params whose keys
* begin with 'attachment_data['

	});
};

/**
* Unsets all elements in the object uploader.settings.multipart_params whose keys
* begin with 'attachment_data['

 *
* @return undefined

 
 */
phpbb.plupload.clearParams = function() {

 */
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;
}


	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.
*

	}
};

/**
* Update uploader.settings.multipart_params object with new data.
*

 * @param object obj
* @return undefined

 * @param {object} obj


 */
phpbb.plupload.updateMultipartParams = function(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.
*

};

/**
* 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() {

 * 	expected by the server
*/
phpbb.plupload.getSerializedData = function() {

Line 92Line 95
 * Get the index from the phpbb.plupload.data array where the given
* attachment id appears.
*

 * 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.
*

	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.

 * 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.

 */
phpbb.plupload.setData = function(data) {
// Make sure that the array keys are reset.

Line 122Line 122
/**
* Update the attachment data in the HTML and the phpbb & phpbb.plupload objects.
*

/**
* 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) {


 */
phpbb.plupload.update = function(data, action, index, downloadUrl) {


Line 140Line 139
/**
* Update the relevant elements and hidden data for all attachments.
*

/**
* 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++) {

 */
phpbb.plupload.updateRows = function(downloadUrl) {
for (var i = 0; i < phpbb.plupload.ids.length; i++) {

Line 155Line 153
 * data for the file inserted into it. The row is then appended or prepended to
* #file-list based on the attach_order setting.
*

 * 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);

 */
phpbb.plupload.insertRow = function(file) {
var row = $(phpbb.plupload.rowTpl);

Line 165Line 162
	row.find('.file-name').html(plupload.xmlEncode(file.name));
row.find('.file-size').html(plupload.formatSize(file.size));


	row.find('.file-name').html(plupload.xmlEncode(file.name));
row.find('.file-size').html(plupload.formatSize(file.size));


	if (phpbb.plupload.order == 'desc') {

	if (phpbb.plupload.order === 'desc') {

		$('#file-list').prepend(row);
} else {
$('#file-list').append(row);

		$('#file-list').prepend(row);
} else {
$('#file-list').append(row);

Line 175Line 172
/**
* Update the relevant elements and hidden data for an attachment.
*

/**
* 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],

 */
phpbb.plupload.updateRow = function(index, downloadUrl) {
var attach = phpbb.plupload.data[index],

Line 189Line 185
			link = $('<a></a>');

link.attr('href', url).html(attach.real_filename);

			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 + ']');

	}

row.find('textarea').attr('name', 'comment_list[' + index + ']');

Line 199Line 195
/**
* Update hidden input data for an attachment.
*

/**
* 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) {

 */
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')

		var input = $('<input />')
.attr('type', 'hidden')

			.attr('name', 'attachment_data[' + index + '][' + key +']')

			.attr('name', 'attachment_data[' + index + '][' + key + ']')

			.attr('value', attach[key]);
$('textarea', row).after(input);
}

			.attr('value', attach[key]);
$('textarea', row).after(input);
}

Line 222Line 221
 * responds with the updated attachment data list so that any future
* uploads can maintain state with the server
*

 * 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') {

 */
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();


row.slideUp(100, function() {
row.remove();

Line 259Line 256

// trigger_error() was called which likely means a permission error was encountered.
if (typeof response.title !== 'undefined') {


// 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');


			// We will have to assume that the deletion failed. So leave the file status as uploaded.
row.find('.file-status').toggleClass('file-uploaded');


Line 270Line 267
		phpbb.plupload.handleMaxFilesReached();

if (row.attr('id')) {

		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();
});

		}
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, {
type: 'POST',
data: $.extend(fields, phpbb.plupload.getSerializedData()),

	};

$.ajax(phpbb.plupload.config.url, {
type: 'POST',
data: $.extend(fields, phpbb.plupload.getSerializedData()),

		headers: {'X-PHPBB-USING-PLUPLOAD': '1', 'X-Requested-With': 'XMLHttpRequest'}

		headers: phpbb.plupload.config.headers

	})
.always(always)
.done(done);

	})
.always(always)
.done(done);

Line 292Line 289

/**
* Check the attachment list and hide its container if it's empty.


/**
* 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);
}

 */
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
* correspond to the correct file after a file is added or removed. This should be called
* 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.

 * Update the indices used in inline attachment bbcodes. This ensures that the
* bbcodes correspond to the correct file after a file is added or removed.
* This should be called before the phpbb.plupload,data and phpbb.plupload.ids
* arrays are updated, otherwise it will not work correctly.




 *

 *

 * @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),

 */
phpbb.plupload.updateBbcode = function(action, index) {
var textarea = $('#message', phpbb.plupload.form),

Line 322Line 315
		return;
}


		return;
}


	// Private function used to replace the bbcode.
var updateBbcode = function(match, fileName) {


	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);

		// Remove the bbcode if the file was removed.
if (removal && index === i) {
return '';
}
var newIndex = i + ((removal) ? -1 : 1);

		return '[attachment=' + newIndex +']' + fileName + '[/attachment]';
};


			return '[attachment=' + newIndex + ']' + fileName + '[/attachment]';
});
}





	// Private function used to generate search regexp
var searchRegexp = function(index) {
return new RegExp('\\[attachment=' + index + '\\](.*?)\\[\\/attachment\\]', 'g');




	// 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);

	}

	}

	// 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;

	} 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.
*

	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 = [];


 */
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;

		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.
*


/**
* 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.

 */
phpbb.plupload.handleMaxFilesReached = function() {
// If there is no limit, the user is an admin or moderator.

Line 392Line 380
		phpbb.plupload.markQueuedFailed(phpbb.plupload.lang.TOO_MANY_ATTACHMENTS);
// Disable the uploader.
phpbb.plupload.disableUploader();

		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;


return true;

	} else if(phpbb.plupload.maxFiles > phpbb.plupload.ids.length) {

	} else if (phpbb.plupload.maxFiles > phpbb.plupload.ids.length) {

		// Enable the uploader if the user is under the limit
phpbb.plupload.enableUploader();
}
return false;

		// Enable the uploader if the user is under the limit
phpbb.plupload.enableUploader();
}
return false;

}

};


/**
* Disable the uploader


/**
* Disable the uploader

 *
* @return undefined

 
 */
phpbb.plupload.disableUploader = function() {
$('#add_files').addClass('disabled');

 */
phpbb.plupload.disableUploader = function() {
$('#add_files').addClass('disabled');

	uploader.disableBrowse();
}

	phpbb.plupload.uploader.disableBrowse();
};


/**
* Enable the uploader


/**
* Enable the uploader

 *
* @return undefined

 
 */
phpbb.plupload.enableUploader = function() {
$('#add_files').removeClass('disabled');

 */
phpbb.plupload.enableUploader = function() {
$('#add_files').removeClass('disabled');

	uploader.disableBrowse(false);
}

	phpbb.plupload.uploader.disableBrowse(false);
};


/**
* Mark all queued files as failed.
*


/**
* 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);

 */
phpbb.plupload.markQueuedFailed = function(error) {
var files = phpbb.plupload.getFilesByStatus(plupload.QUEUED);

Line 435Line 418
		$('#' + file.id).find('.file-progress').hide();
phpbb.plupload.fileError(file, error);
});

		$('#' + file.id).find('.file-progress').hide();
phpbb.plupload.fileError(file, error);
});

}

};


/**
* Marks a file as failed and sets the error message for it.
*


/**
* 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;

 */
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.
*/



/**
* 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();


phpbb.plupload.initialize();





var $fileList = $('#file-list');



/**
* Insert inline attachment bbcode.
*/


/**
* 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);


	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.
*/

	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');


	var row = $(this).parents('.attach-row'),
attachId = row.attr('data-attach-id');


Line 487Line 471
/**
* Display the error message for a particular file when the error icon is clicked.
*/

/**
* 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();
});

	phpbb.alert($(this).attr('data-error-title'), $(this).attr('data-error-message'));
e.preventDefault();
});

Line 495Line 479
/**
* Fires when an error occurs.
*/

/**
* 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.

	error.file.name = plupload.xmlEncode(error.file.name);

// The error message that Plupload provides for these is vague, so we'll be more specific.

Line 512Line 496
 * 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
*

 * 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;
}


	if (phpbb.plupload.handleMaxFilesReached()) {
return;
}


	phpbb.plupload.updateMultipartParams({'real_filename': file.name});

	phpbb.plupload.updateMultipartParams({ real_filename: file.name });

});

/**

});

/**

Line 531Line 512
 * 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
*

 * 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

 * 	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;
}

	if (response.chunk >= response.chunks - 1) {
return;
}

Line 559Line 538

// If trigger_error() was called, then a permission error likely occurred.
if (typeof json.title !== 'undefined') {


// If trigger_error() was called, then a permission error likely occurred.
if (typeof json.title !== 'undefined') {

		json.error = {message: json.message};

		json.error = { message: json.message };

	}

if (json.error) {

	}

if (json.error) {

Line 576Line 555

/**
* Fires when files are added to the queue.


/**
* 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()) {

	// Prevent unnecessary requests to the server if the user already uploaded
// the maximum number of files allowed.
if (phpbb.plupload.handleMaxFilesReached()) {

Line 587Line 564
	}

// Switch the active tab if the style supports it

	}

// 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.

	}

// 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) {

	}

$.each(files, function(i, file) {

Line 601Line 579
	});

up.bind('UploadProgress', function(up, file) {

	});

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 + '%');
});


		$('#file-total-progress-bar').css('width', up.total.percent + '%');
});


Line 619Line 597
 * appends it to the next file upload so that the server can maintain state
* with regards to the attachments in a given post
*

 * 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

 * 	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;

	var json = {},
row = $('#' + file.id),
error;

Line 635Line 611
	row.find('.file-progress').hide();

try {

	row.find('.file-progress').hide();

try {

		json = $.parseJSON(response.response);

		json = JSON.parse(response.response);

	} catch (e) {
error = 'Error parsing server response.';
}

	} catch (e) {
error = 'Error parsing server response.';
}

Line 643Line 619
	// If trigger_error() was called, then a permission error likely occurred.
if (typeof json.title !== 'undefined') {
error = json.message;

	// If trigger_error() was called, then a permission error likely occurred.
if (typeof json.title !== 'undefined') {
error = json.message;

		up.trigger('Error', {message: error});

		up.trigger('Error', { message: error });


// The rest of the queue will fail.
phpbb.plupload.markQueuedFailed(error);


// The rest of the queue will fail.
phpbb.plupload.markQueuedFailed(error);

Line 654Line 630
	if (typeof error !== 'undefined') {
phpbb.plupload.fileError(file, error);
} else if (file.status === plupload.DONE) {

	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');


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.

	}
});

/**
* 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() {

	// Hide the progress bar
setTimeout(function() {
$('#file-total-progress-bar').fadeOut(500, function() {