/**
 * Wrapper pour swfupload.
 * $('div#upload').uploader() transforme l'élément
 * en uploader flash / ajax
 */
(function($){
	$.fn.uploader = function(options){
		return this.each(function(){
			var _this = this;
			// Paramètres principaux
			var mainOpts = $.extend({
				// Emplacement des fichiers js et flash
				swfuploadjs : '/include/jscript/swfupload.js',
				swfuploadswf : '/include/flash/swfupload.swf',

				// Options SwfUpload
				buttonPlaceholderId : null,	// Obligatoire
				buttonText : 'Envoi de fichier(s)',
				buttonTextStyle : null,
				buttonTextLeftPadding : 0,
				buttonTextTopPadding : 0,
				buttonWidth : 100,
				buttonHeight : 20,
				buttonImageUrl : null,
				buttonAction : SWFUpload.BUTTON_ACTION.SELECT_FILES,
				uploadUrl : null,	// Obligatoire
				filePostName : 'file',
				fileTypes : '*',
				fileTypesDescription : 'Tous les fichiers',
				fileSizeLimit : null,
				fileQueueLimit : 0,

				// Préfixes utilisés pour la création des
				// éléments
				idPrefix : 'swfu_',
				cssPrefix : 'swfupload_',
				// Hooks.
				// Tous les hooks reçoivent en premier paramètre
				// l'objet SWFUpload, puis les paramètres de
				// l'événement
				fileQueued : function(swfU, file) {},
				fileQueueError : function(swfU, file, error, message){},
				fileDialogComplete : function(swfU, numFilesSelected, numFilesQueued) {},
				uploadStart : function(swfU, file) {},
				uploadProgress : function(swfU, file, bytesCompleted, totalBytes) {},
				uploadError : function(swfU, file, error, message){},
				uploadSuccess : function(swfU, file, serverData){},
				uploadComplete : function(swfU, file){}
			}, options);

			// L'objet SWFUpload
			var swfU = null;

			var setMessage = function(fileId, message) {
				$('#' + mainOpts.idPrefix + 'upload_message_' + fileId).empty().text(message);
			}

			var createUploadBox = function(file) {
				var box = $('<div />').addClass(mainOpts.cssPrefix + 'upload_box').attr({
					id : mainOpts.idPrefix + 'upload_box_' + file.id
				});
				var name = $('<p />').addClass(mainOpts.cssPrefix + 'file_name').text(file.name);

				var cancelPara = $('<p />').addClass(mainOpts.cssPrefix + 'upload_p');

				var cancelButton = $('<a />').attr({
					href:'#',
					title:"Annuler l'envoi"
				}).click(function(e){
					e.preventDefault();
					swfU.cancelUpload(file.id);
					$('#' + mainOpts.idPrefix + 'upload_box_' + file.id).remove();
				});


				var cancelImg = $('<img />').attr({
					src:'/images/icons/cancel.png',
					alt:'',
					title:"Annuler l'envoi"
				});

				var uploadProgress = $('<div />').attr({
					id:mainOpts.idPrefix + 'progress_' + file.id
				});


				var uploadMessage = $('<p />').addClass(mainOpts.cssPrefix + 'upload_message').attr({
					id:mainOpts.idPrefix + 'upload_message_' + file.id
				});

				$(cancelButton).append(cancelImg);
				$(cancelPara).append(cancelButton);
				$(box).append(cancelPara);
				$(box).append(name);
				$(box).append(uploadProgress);
				$(box).append(uploadMessage);

				$(_this).append(box);
				setMessage(file.id, 'En attente');

				uploadProgress.progressbar({value:100});
			};

			var handlers = {
				fileQueued : function(file)
				{
					mainOpts.fileQueued(swfU, file);
					createUploadBox(file);
				},

				fileQueueError : function(file, error, message)
				{
					mainOpts.fileQueueError(swfU, file, error, message);
				},

				fileDialogComplete : function(numFilesSelected, numFilesQueued)
				{
					mainOpts.fileDialogComplete(swfU, numFilesSelected, numFilesQueued);
					swfU.startUpload();
				},

				uploadStart : function(file)
				{
					mainOpts.uploadStart(swfU, file);
				},

				uploadProgress : function(file, bytesCompleted, totalBytes)
				{
					mainOpts.uploadProgress(swfU, file, bytesCompleted, totalBytes);
					var percent = Math.floor(100 * (bytesCompleted / totalBytes));
					$('#' + mainOpts.idPrefix + 'progress_' + file.id).progressbar('option', 'value', percent);
				},

				uploadError : function(file, error, message)
				{
					mainOpts.uploadError(swfU, file, error, message);
					setMessage(file.id, message);
				},

				uploadSuccess : function(file, serverData)
				{
					mainOpts.uploadSuccess(swfU, file, serverData);
					setMessage(file.id, 'Envoi réussi');
				},

				uploadComplete : function(file)
				{
					mainOpts.uploadComplete(swfU, file);
					$('#' + mainOpts.idPrefix + 'progress_' + file.id).hide();
					$('#' + mainOpts.idPrefix + 'upload_box_' + file.id).hide("clip", { direction: "vertical" }, 1000);

					swfU.startUpload();
				}
			};

			var swfuParams = {
				button_placeholder_id : mainOpts.buttonPlaceholderId,
				button_text : mainOpts.buttonText,
				button_width : mainOpts.buttonWidth,
				button_height : mainOpts.buttonHeight,
				button_action : mainOpts.buttonAction,
				upload_url : mainOpts.uploadUrl,
				flash_url : mainOpts.swfuploadswf,

				file_post_name : mainOpts.filePostName,
				file_types : mainOpts.fileTypes,
				file_types_description : mainOpts.fileTypesDescription,
				file_queue_limit : mainOpts.fileQueueLimit,

				file_queued_handler : handlers.fileQueued,
				file_queue_error_handler : handlers.fileQueueError,
				file_dialog_complete_handler : handlers.fileDialogComplete,
				upload_start_handler : handlers.uploadStart,
				upload_progress_handler : handlers.uploadProgress,
				upload_error_handler : handlers.uploadError,
				upload_success_handler : handlers.uploadSuccess,
				upload_complete_handler : handlers.uploadComplete
			};

			if (null !== mainOpts.fileSizeLimit) {
				$.extend(swfuParams,{
					file_size_limit : mainOpts.fileSizeLimit
				});
			}

			if (null !== mainOpts.buttonImageUrl) {
				$.extend(swfuParams,{
					button_image_url : mainOpts.buttonImageUrl
				});
			}

			else if (null !== mainOpts.buttonTextStyle) {
				$.extend(swfuParams,{
					button_text_style : mainOpts.buttonTextStyle
				});
			}

			//$.getScript(mainOpts.swfuploadjs, function(){
				swfU = new SWFUpload(swfuParams);
			//});
		});
	};
})(jQuery);