$.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 inFileBrowser == 'undefined') inFileBrowser = false;
		var name = model + '_' + field;
		var runtime = '';
		
		if (typeof Shin.Upload._uploaders[name] == 'object') {
			Shin.Upload.refreshUploader(model, field);
			return;
		}
		
		if (!inFileBrowser && Shin.isIE()) {
			$("#"+model+"_form").attr("enctype", "multipart/form-data");
			$("#"+model+"_form").attr("encoding", "multipart/form-data");
		}

		Shin.Upload._uploaders[name] = new plupload.Uploader({
			runtimes : 'flash,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')+'?sessid='+Shin._config.sessionId+'&model='+model+'&field='+field+'&shin_isadmin='+(Shin.isAdmin() ? '1' : '0'),
			flash_swf_url : Shin.href(';js/plupload/plupload.flash.swf')
		});
		
		Shin.Upload._uploaders[name].bind('Init', function(up, params) {
			if (!Shin.Upload.allowMultiple(name) && up.features.html5) {
				$('#'+up.id+'_html5').removeAttr("multiple");
			}
			runtime = params.runtime;
		});
		
		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) {
				if (runtime=='flash') Shin.hideFileBrowser(true);
				else 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(true);
			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].bind('UploadComplete', function(up, files) {
			Shin.refreshFileBrowser(model, field);
			Shin.Upload._uploaders[name].destroy();
		});
		
		Shin.Upload._uploaders[name].bind('Destroy', function(up, files) {
			Shin.hideProgress();
			Shin.hideFileBrowser();
			delete Shin.Upload._uploaders[name];
		});
		
		Shin.Upload._uploaders[name].init();	
	},
	
	onError: function(model, field, message) {
		Shin.Upload._uploaders[model + '_' + field].destroy();
		Shin.hideProgress();
		Shin.hideFileBrowser();
		Shin.alert('error', Shin.i18n('GLOBAL.UPLOAD_ERROR'), message, Shin.i18n('ADMIN.CLOSE'));
		if ($('#'+model+'_'+field).hasClass('type_file')) { 
			Shin.Upload.initUploader(model, field); 
		}
	},
	
	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);
		} else if ($('#'+model+'_'+field).hasClass('type_wysiwyg')) {
			Shin.wysiwygInsertImage(model+'_'+field, file['url'], file['legend']);	
		}
	},
	
	refreshUploader: function(model, field) {
		if (typeof Shin.Upload._uploaders[model+'_'+field] == 'object') {
			if (!$('#'+model+'_'+field).hasClass('type_file')) {
				Shin.Upload._uploaders[model+'_'+field].refresh();
			}
		}
	}
	
}});
