/*
	Class: loader for Floor CS2
		
	Usage:
		
		
	Parameters:
		- 
		
	Exemple:
	
	About:
		Loader.js v.1.0 for mootools v1.1 05 / 2008
		
		by Floor SA (http://www.floor.ch) MIT-style license

*/
var Loader = new Class({
	Implements : Options,
	
	options : {
		'Tag' : 'div',
		'Class' : 'loader',
		'Style' : {
			'position': 'absolute',
			'top': 0,
			'left': 0,
			'display': 'none',
			'z-index': 10000
		}
 	},
    /*
	Constructor: initialize
		Constructor	
	*/
	initialize: function(options)	{

		this.setOptions(options);

		this.loaders = {
			'active': {},
			'el': {}
		};
	},
	/*
	load: 
		put or remove a loader on an element	
	*/
	load: function(el,where)	{
		var elid = $(el).id;
		if (this.loaders.el[elid])
			this._hide(elid);
		else
			this._show(elid, where);
	},
	/*
	_getLoader:
		returns id of a free loader
	 */
	_getLoader: function()	{
		var id = '';
		for (var key in this.loaders.active)	{
			if (this.loaders.active[key] == false) {
				id = key;
				break;
			}
		}
		if (id != '' && id != undefined)
			return id;
		else
			return this._create();
	},
	/*
	_create: 
		creates a loader and registers it	
	*/
	_create: function()	{
		var id = Math.random().toString().substr(2,8);
		while ($(id))	{
			id = Math.random().toString().substr(2,8);
		}
		var newload = new Element(this.options.Tag,{
			'id': id,
			'class': this.options.Class,
			'styles': this.options.Style
		});
		var body = $$('body')[0];
		newload.inject(body);
		return id;
	},
	/*
	_show: 
		shows a loader on top of an element
	*/
	_show: function(elid,where)	{
		var loaderid = this._getLoader();
		var loader = $(loaderid);
		var pos = $(elid).getCoordinates();
		var parent_width = $(elid).getStyle('width').toInt();
		var loader_width = $(loaderid).getStyle('width').toInt();
		
		if (where == 'left') {
			loader.setStyles({
				'top': pos.top,
				'left': pos.left-20,
				'display': 'block'
			});
		} else if ('center'){			
			loader.setStyles({
				'top': pos.top  + pos.height/2,
				'left': pos.left + (parent_width/2) - (loader_width/2),
				'display': 'block'
			});
		}
		else {
			loader.setStyles({
				'top': pos.top,
				'left': pos.left+20,
				'display': 'block'
			});
		}
		
		this.loaders.el[elid] = loaderid;
		this.loaders.active[loaderid] = true;
	},
	
	/*
	_hide:
		hides the loader
	*/
	_hide: function(elid)	{
		$(this.loaders.el[elid]).setStyle('display','none');
		this.loaders.active[this.loaders.el[elid]] = false;
		this.loaders.el[elid] = '';
	}
});

