/**
 * FancyUpload - Flash meets Ajax for powerful and elegant uploads.
 * 
 * Updated to latest 3.0 API. Hopefully 100% compat!
 *
 * @version		3.0
 *
 * @license		MIT License
 *
 * @author		Harald Kirschner <http://digitarald.de>
 * @copyright	Authors
 */

var FancyUpload2 = new Class({

	Extends: Swiff.Uploader,
	
	Implements: Log,
	
	options: {
		queued: 1,
		// compat
		limitSize: 0,
		limitFiles: 0,
		validateFile: $lambda(true)
	},

	initialize: function(status, list, options) {
		this.enableLog();
		this.status = document.id(status);
		this.list = document.id(list);

		// compat
		options.fileClass = options.fileClass || FancyUpload2.File;
		options.fileSizeMax = options.limitSize || options.fileSizeMax;
		options.fileListMax = options.limitFiles || options.fileListMax;

		this.parent(options);

		this.addEvents({
			'load': this.render,
			'select': this.onSelect,
			'cancel': this.onCancel,
			'start': this.onStart,
			'queue': this.onQueue,
			'complete': this.onComplete
		});
	},

	render: function() {
		this.overallTitle = this.status.getElement('.overall-title');
		//this.currentTitle = this.status.getElement('.current-title');
		//this.currentText = this.status.getElement('.current-text');

		var progress = this.status.getElement('.overall-progress');
		this.overallProgress = new Fx.ProgressBar(progress);
			
		this.updateOverall();
	},

	onSelect: function() {
		this.status.removeClass('status-browsing');
	},

	onCancel: function() {
		this.status.removeClass('file-browsing');
	},

	onStart: function() {
		this.status.addClass('file-uploading');
		this.overallProgress.set(0);
	},

	onQueue: function() {
		this.updateOverall();
	},

	onComplete: function() {
		this.status.removeClass('file-uploading');
		if (this.size) {
			this.overallProgress.start(100);
		} else {
			this.overallProgress.set(0);
			this.currentProgress.set(0);
		}
		
	},

	updateOverall: function() {
		this.overallTitle.set('html', Vadingo.translationManager._('{number} of {total} files processed', 'fancyupload').substitute({
			number: this.fileList.completed.length,
			total: this.fileList.length
		}));
		if (!this.size) {
			//this.currentTitle.set('html', MooTools.lang.get('FancyUpload', 'currentTitle'));
			//this.currentText.set('html', '');
		}
	},
	
	/**
	 * compat
	 */
	upload: function() {
		this.start();
	},
	
	removeFile: function() {
		return this.remove();
	}

});

FancyUpload2.File = new Class({
	
	Extends: Swiff.Uploader.File,
	
	types: {
		'jpg':  'image/jpeg',
		'jpeg': 'image/jpeg',
		'gif':  'image/gif',
		'png':  'image/png',
		'txt':  'text/plain',
		'pdf':  'application/pdf',
		'flv':  'video/flv'
	},

	render: function() {
		if (this.invalid) {
			if (this.validationError) {
				var msg = Vadingo.translationManager._(this.validationError, 'fancyupload');
				this.validationErrorMessage = msg.substitute({
					name: this.name,
					size: Swiff.Uploader.formatUnit(this.size, 'b'),
					fileSizeMin: Swiff.Uploader.formatUnit(this.base.options.fileSizeMin || 0, 'b'),
					fileSizeMax: Swiff.Uploader.formatUnit(this.base.options.fileSizeMax || 0, 'b'),
					fileListMax: this.base.options.fileListMax || 0,
					fileListSizeMax: Swiff.Uploader.formatUnit(this.base.options.fileListSizeMax || 0, 'b')
				});
			}
			this.remove();
			return;
		}
		
		this.addEvents({
			'start': this.onStart,
			'progress': this.onProgress,
			'complete': this.onComplete,
			'error': this.onError,
			'remove': this.onRemove
		});
		
		var fileName = Vadingo.translationManager._('{name}', 'fancyupload').substitute(this);
			fileName = fileName.substring(0, 14) + '…' + fileName.substr(-6);
		var fileMimeType = this.types[this.extension || this.type] || this.type;

		this.info = new Element('span', {'class': 'file-info'});
		this.element = new Element('li', {'class': 'mimetype-'+this.extension})
			.adopt(new Element('a', {
				'class': 'file-remove',
				html: Vadingo.translationManager._('Remove', 'fancyupload'),
				title: Vadingo.translationManager._('Click to remove this entry.', 'fancyupload'),
				events: {
					click: function() {
						this.remove();
						this.fireEvent('remove');
						return false;
					}.bind(this)
				}})
			)
			.adopt(new Element('div').adopt(
				new Element('strong', {'class': 'file-name', 'html': fileName}),
				document.newTextNode(fileMimeType+' ('+Swiff.Uploader.formatUnit(this.size, 'b')+')'),
				this.info
			)).inject(this.base.list);
	},
	
	validate: function() {
		return (this.parent() && this.base.options.validateFile(this));
	},
	
	onStart: function() {
		this.element.addClass('file-uploading');
		this.base.currentProgress.cancel().set(0);
		//this.base.currentTitle.set('html', MooTools.lang.get('FancyUpload', 'currentFile').substitute(this));
	},

	onProgress: function() {
		this.base.overallProgress.start(this.base.percentLoaded);
		/*this.base.currentText.set('html', MooTools.lang.get('FancyUpload', 'currentProgress').substitute({
			rate: (this.progress.rate) ? Swiff.Uploader.formatUnit(this.progress.rate, 'bps') : '- B',
			bytesLoaded: Swiff.Uploader.formatUnit(this.progress.bytesLoaded, 'b'),
			timeRemaining: (this.progress.timeRemaining) ? Swiff.Uploader.formatUnit(this.progress.timeRemaining, 's') : '-'
		}));*/
		this.base.currentProgress.start(this.progress.percentLoaded);
	},
	
	onComplete: function() {
		this.element.removeClass('file-uploading');
		//this.base.currentText.set('html', 'Upload completed');
		this.base.currentProgress.start(100);
		
		if (this.response.error) {
			var msg = Vadingo.translationManager._(this.response.error, 'fancyupload') || '{error} #{code}';
			this.errorMessage = msg.substitute($extend({
				name: this.name,
				size: Swiff.Uploader.formatUnit(this.size, 'b')
			}, this.response));
			var args = [this, this.errorMessage, this.response];
			this.element.addClass('file-failed');
			this.fireEvent('error', args).base.fireEvent('fileError', args);
		} else {
			this.element.addClass('file-successful');
			this.base.fireEvent('fileSuccess', [this, this.response.text || '']);
		}
	},

	onError: function() {
		this.element.addClass('file-failed');
		//var error = MooTools.lang.get('FancyUpload', 'fileError').substitute(this);
		//this.info.set('html', '<strong>' + error + ':</strong> ' + this.errorMessage);
	},

	onRemove: function() {
		this.element.getElements('a').setStyle('visibility', 'hidden');
		this.element.fade('out').retrieve('tween').chain(Element.destroy.bind(Element, this.element));
	}
	
});