/**
 * @version     $Id: mmooload.js 181 2009-09-15 11:52:31Z martin $
 * @package     Joomla
 * @subpackage  mmPortfolio
 * @author      Martin Gray <author [at] mmplugins.com>
 * @copyright   Copyright (C) 2009 mmPlugins; All rights reserved
 * @license     GNU/GPL v.2
 * @see         /administrator/components/com_mmportfolio/LICENSE.php
 * 
 * mmooLoad 0.1 beta by Martin Gray <martin.m.gray@gmail.com> 
 * inspired by protoload 0.1 beta by Andreas Kalsch
 *
 * This simple piece of code automates the creating of Ajax loading symbols.
 * The loading symbol covers an HTML element with correct position and size - example:
 * $('myElement').startWaiting() and $('myElement').stopWaiting()
 */

var mmooLoad = new Class({
	element: '',
	options : {
		opacity: 0.8,			// opacity of loading element
		timeUntilShow: 250,		// the script should wait this amount of msecs until it shows the loading element
		className: 'waiting', 	// default class name of loading element
		onStart: Class.empty,
		onStop: Class.empty
	},
	initialize: function(options, element) {
		this.setOptions(options);
		if (typeof element == 'string') this.element = document.getElementById(element);
		else this.element = element;
	},
	// Start waiting status - show loading element	
	startWaiting: function()
	{
		this.element._waiting = true;
		if (!this.element._loading) {
			var e = document.createElement('div');
			(this.element.offsetParent || document.body).appendChild(this.element._loading = e);
			e.style.position = 'absolute';
			try {e.style.display = 'none';} catch(e) {}
			try {e.style.opacity = this.options.opacity;} catch(e) {}
			try {e.style.MozOpacity = this.options.opacity;} catch(e) {}
			try {e.style.filter = 'alpha(opacity='+Math.round(this.options.opacity * 100)+')';} catch(e) {}
			try {e.style.KhtmlOpacity = this.options.opacity;} catch(e) {}
		}
		this.element._loading.className = this.options.className;
		
		//
		this.fireEvent('onStart');
		window.setTimeout((function() {
			if (this._waiting) {
				var left = this.offsetLeft, 
					top = this.offsetTop,
					width = this.offsetWidth,
					height = this.offsetHeight,
					l = this._loading;
				l.style.left = left+'px';
				l.style.top = top+'px';
				l.style.width = width+'px';
				l.style.height = height+'px';
				l.style.display = 'inline';
			}
		}).bind(this.element), this.options.timeUntilShow);
	},
	// Stop waiting status - hide loading element
	stopWaiting: function(element) {
		this.fireEvent('onStop');
		
		if (this.element._waiting) {
			this.element._waiting = false;
			this.element._loading.parentNode.removeChild(this.element._loading);
			this.element._loading = null;
		}
	}
});

// Extend 1.1 style
mmooLoad.implement(new Options, new Events);

Element.extend({
	startWaiting : function(options)
	{
		this.mooLoader = new mmooLoad(options, this);
	    return this.mooLoader.startWaiting();
	},
	stopWaiting : function(options)
	{
		return this.mooLoader.stopWaiting();
	}
});

