/*
---

name: ProgressBar

description: 

authors: Rolf Langenhuijzen

license: MIT-style license.

requires: [Core]

provides: ProgressBar

...
*/

;(function(){

var ProgressBar = this.ProgressBar = new Class({

	Implements: [Events, Options],

	options: {
		/*
		onShow: function(){},
		onHide: function(){},
		inject: {
			where: 'after',
			target: null,
		},
		*/
		cssClassPrefix: '',
		cssClass: 'progressbar',
		id: '',
		morphOptions: {
			duration: 6400,
			transition: 'linear'
		}
	},

	initialize: function(target, options){
		this.setOptions(options);
		this.target = document.id(target) || document.id(document.body);
		this.render().inject();
	},

	render: function(){
		this.progressbar = new Element('div', {
			id: this.options.id || this.options.cssClass + '-' + String.uniqueID(),
			'class': this.options.cssClassPrefix + this.options.cssClass
		});
		this.progressbar.set('morph', this.options.morphOptions);
		this.hidden = true;
		return this;
	},

	inject: function(target, where){
		where = where || (this.options.inject ? this.options.inject.where : '') || this.target == document.body ? 'inside' : 'after';
		target = target || (this.options.inject && this.options.inject.target) || this.target;
		this.progressbar.inject(target, where);
		return this;
	},

	show: function(){
		if (!this.hidden) return this;
		this.progressbar.setStyles({
			display: 'block',
			width: 0
		});
		this.hidden = false;
		this.fireEvent('show');
		return this;
	},

	hide: function(){
		this.hidden = true;
		this.progressbar.setStyle('display', 'none');
		this.fireEvent('hide');
		return this;
	},

	start: function(){
		var calculatedWidth = this.target.getSize().x;
		this.progressbar.morph({width: [0, calculatedWidth]});
		return this;
	},

	stop: function(){
		this.progressbar.get('morph').cancel();
		return this;
	},

	reset: function(){

	},

	toggle: function(){
		this[this.hidden ? 'show' : 'hide']();
	},

	toElement: function(){
		return this.progressbar;
	}

});

})();
