$.extend(Shin,{Upload: {

	_uploaders: {},
	
	allowMultiple: function(name) {
		if ($('#'+name).hasClass('type_files') || $('#'+name).hasClass('type_images')) {
			return true;
		} else {
			return false;
		}
	},
	
	initUploader: function(model, field, inFileBrowser) {
	
		if (typeof Shin.Upload._uploaders[name] == 'object') {
			Shin.Upload.refreshUploader(model, field);
			return;
		}
	
		if (typeof inFileBrowser == 'undefined') inFileBrowser = false;
		var name = model + '_' + field;

		Shin.Upload._uploaders[name] = new plupload.Uploader({
			runtimes : 'html5,html4',
			browse_button : (inFileBrowser ? 'file_browser_uploader_button' : name+'_uploader_button'),
			container : (inFileBrowser ? 'file_browser_uploader_container' : name+'_uploader_container'),
			max_file_size : '50mb',
			url : Shin.href(';ajax/upload.ajax.php')+'?model='+model+'&field='+field+'&shin_isadmin='+(Shin.isAdmin() ? '1' : '0')
		});
		
		Shin.Upload._uploaders[name].bind('Init', function(up, params) {
			if (!Shin.Upload.allowMultiple(name) && up.features.html5) {
				$('#'+up.id+'_html5').removeAttr("multiple");
			}
		});
		
		Shin.Upload._uploaders[name].bind('Error', function(up, error) {
			switch(error.code) {
				case plupload.FILE_EXTENSION_ERROR:
					message = Shin.i18n('GLOBAL.UPLOAD_ERROR_SIZE').replace('%s', error.file.name);
					break;
				case plupload.FILE_SIZE_ERROR:
					message = Shin.i18n('GLOBAL.UPLOAD_ERROR_SIZE').replace('%s', error.file.name);
					break;
				default:
					message = Shin.i18n('GLOBAL.UPLOAD_ERROR_UNKNOW');
					break;
			}
			Shin.Upload.onError(model, field, message);
		});
		
		Shin.Upload._uploaders[name].bind('FilesAdded', function(up, files) {
			$.each(files, function(i, file) {
				// Each files is added to the queue. Nothing much to do...
			});
		});
		
		Shin.Upload._uploaders[name].bind('QueueChanged', function(up) {
			// Upload right after selecting files
			up.start();
		});
		
		Shin.Upload._uploaders[name].bind('UploadFile', function(up, file) {
			if (inFileBrowser) {
				Shin.hideFileBrowser();
			}
			Shin.showProgress(-1, file.name, Shin.i18n('ADMIN.UPLOAD_PROGRESS'));
		});
		
		Shin.Upload._uploaders[name].bind('UploadProgress', function(up, file) {
			if (file.status!=5) Shin.showProgress(file.percent/100);
		});
		
		Shin.Upload._uploaders[name].bind('FileUploaded', function(up, file, responseObject) {
			Shin.showProgress(-1, null, Shin.i18n('ADMIN.UPLOAD_FINISHED'));
			var response = eval('('+responseObject.response+')');
			Shin.hideProgress();
			if (response.errors.length>0) {
				Shin.Upload.onError(model, field, response.errors[0]);
			} else {
				Shin.Upload.onSuccess(model, field, response.saved);
			}
		});
		
		Shin.Upload._uploaders[name].init();	
	},
	
	onError: function(model, field, message) {
		Shin.hideProgress();
		try{ Shin.hideFileBrowser(); }catch(e){}
		Shin.alert('error', Shin.i18n('GLOBAL.UPLOAD_ERROR'), message, Shin.i18n('ADMIN.CLOSE'));
	},
	
	onSuccess: function(model, field, fileId) {
		var file = eval('('+Shin.syncScript('fileinfo', 'id='+fileId, false)+')');
		if ($('#'+model+'_'+field).hasClass('type_file')) {
			$('#'+model+'_'+field).val(fileId);
			$('#'+model+'_'+field+'_preview').css('background-image', 'url('+file['icon']+')');
			$('#'+model+'_'+field+'_preview_name').html(file['name']);
			$('#'+model+'_'+field+'_preview_size').html(file['human_size']);
			$('#'+model+'_'+field+'_preview').show();
			$('#'+model+'_'+field+'_uploader_container').hide();
			Shin.Upload.refreshUploader(model, field);
		} else if ($('#'+model+'_'+field).hasClass('type_files') || $('#'+model+'_'+field).hasClass('type_images')) {
			Shin.addToSerializedField(model+'_'+field, fileId);
			Shin.refreshFileBrowser(model, field);
			Shin.hideFileBrowser();
		} else if ($('#'+model+'_'+field).hasClass('type_wysiwyg')) {
			Shin.wysiwygInsertImage(model+'_'+field, file['url'], file['legend']);
			Shin.hideFileBrowser();		
		}
	},
	
	refreshUploader: function(model, field) {
		Shin.Upload._uploaders[model+'_'+field].refresh();
	}
	
}});
