function cuploader_fileSelected(elid, fileId, name, size)
{
	var uploader = $('#' + elid);
		
	row = $('<div class="file uploading" id="' + fileId + '">' +
			'<div class="name">' + name + '</div>' +
			'<div class="size">' + Math.round(size / 1024) + ' KB</div>' +
			'<div class="status" style="display: none"><div class="bar"></div></div>' +
			'<div class="progress">0% (Initialising...)</div>' +
			'<div class="cancel"><a href="#">Cancel</a></div>' +
			'<div class="hide" style="display: none"><a href="#">Hide</a></div>' +
			'</div>');
	
	uploader.find('.files').append(row);
	
	// Callbacks
	
	$('#' + elid).data('onFileSelected').call();
}

function cuploader_uploadProgress(elid, fileId, loaded, total)
{
	file = $('#' + fileId);
	progress = Math.round(100 * loaded / total);
	
	file.find('.progress').html(progress + '%');
	file.find('.status').show();
	file.find('.bar').css('width', progress + '%');
	
	if(progress == 100)
	{
		file._complete();
	}
}

function _cuploader_getFieldId(s)
{
	var mayus = true;
	var r = '';
	var c;
	var regex = /^[A-Za-z]+$/;
	
	for(var i = 0; i < s.length; i++)
	{
		c = s.charAt(i);
			
		if(regex.test(c))
		{
			if(mayus)
			{
				c = c.toUpperCase();
				mayus = false;
			}
			else c = c.toLowerCase();
			
			r += c;
		}
		else mayus = true;
	}
	return r;
}

function cuploader_fileError(elid, fileId)
{
	file = $('#' + fileId);
	file.find('.status').remove();
	file.find('.progress').html('<p>Se ha producido un error subiendo el fichero. Las posibles causas son:</p>' +
			'<ul>' + 
			'<li>Tu ordenador no tiene suficiente memoria disponible para realizar la operación</li>' +
			'<li>Se ha producido un error de conexión durante la operación de subida</li>' +
			'</ul>');
	file.find('.cancel').remove();
	file.find('.hide').show();
	file.addClass('error');
	
	$('#' + elid).data('onFileError').call();
}

function cuploader_fileLoadError(elid, fileName)
{
	alert('El fichero seleccionado es demasiado grande, debe ser menor a 3GB.');
}

(function($){
	
	$.fn.cuploader = function(options)
	{
		var defaultOptions = {baseUrl: '', sendUrl: '', mode : 'single', sessionId : '', maxSize: '100 MB', field: 'data[File][files]', filterName: 'All files', filterExtensions: '*.*', onNoFlash: function(){}, onFlash: function(){}, onFileSelected: function() {}, onFileComplete: function(){}, onFileCancel: function(){}, onFileError: function(){}}; 
		$.extend(defaultOptions, options);
		
		user_version = flashembed.getVersion();
		min_version = [15,0];
		
		if(user_version[0] > min_version[0] || user_version[0] == min_version[0] && user_version[1] >= min_version[1])
		{
			
			defaultOptions.onFlash.call();
			
			return this.each(function(){
				
				var fieldId = _cuploader_getFieldId(defaultOptions['field']);
				
				for(option in defaultOptions)
				{
					$.data(this, option, defaultOptions[option]);
				}
						
				$.data(this, 'fieldId', fieldId);
				$.data(this, 'divId', $(this).attr('id'));
							
				$(this).addClass('cuploader');
				
				$(this).html('');
				$(this).append('<div class="info">' +
					'<b>File requirements:</b>' + 
					'<ul>' +
					'<li>Max file size: ' + defaultOptions['maxSize'] + '</li>' +
					'</ul>' +
					'</div>');
				$(this).append('<div class="flash"></div>');	
				$(this).append('<div class="files"></div>');
				$(this).append('<input type="hidden" name="' + defaultOptions['field'] + '" id="' + fieldId  + '" value="" />');
				$(this).find('.flash').flashembed({
					version: min_version, 
					src: defaultOptions['baseUrl'] + 'js/cuploader/uploader.swf', 
					id: 'movie_' + $(this).attr('id')
					}, $.data(this));
				$(this).delegate('.cancel a', 'click', function(e){
					$(e.target).closest('.file')._cancel();
					defaultOptions['onFileCancel'].call();
					e.preventDefault();
				});
				$(this).delegate('.hide a', 'click', function(e){
					$(e.target).closest('.file').fadeOut(500, function(){
						$(this).remove();
					});
					e.preventDefault();
				});
			});
		}
		
		defaultOptions.onNoFlash.call();
		return null;
	}
	
	$.fn._cancel = function()
	{
		return this.each(function(){
			file_id = $(this).attr('id');
			movie_id = $(this).closest('.cuploader').find('object').attr('id');
			document.getElementById(movie_id).uploadCancelled(file_id);
			$(this).addClass('error');
			$(this).find('.progress').html('Cancelled by user');
			$(this).find('.status').remove();
			$(this).find('.cancel').remove();
			$(this).find('.hide').show();
		});
	}
	
	$.fn._complete = function()
	{
		return this.each(function(){
			
			var elm = $(this).closest('.cuploader')[0];
			var fieldId = $.data(elm, 'fieldId');
			var onFileComplete = $.data(elm, 'onFileComplete');
			var field = $('#' + fieldId);
			var fieldValue = $('#' + fieldId).val();
			
			$(this).addClass('completed');
			$(this).find('.cancel').remove();
			
			if(fieldValue != '') fieldValue += ',';
			
			fieldValue += $(this).attr('id');
			
			$('#' + fieldId).val(fieldValue);
			
			// Callbacks
			
			onFileComplete.call();
		});
	}
	
})(jQuery);
