Element.implement({
	// the script to wait this amount of msecs until it shows the loading element
	timeUntilShow: 250,
	
	// opacity of loading element
	opacity: 0.8,

	// Start waiting status - show loading element
	startWaiting: function(className, timeUntilShow) {
			element = this;
		if (className == undefined)
			className = 'waiting';
		if (timeUntilShow == undefined)
			timeUntilShow = 250;
		element._waiting = true;
		if (!element._loading) {
			var e = document.createElement('div');
			(document.body).appendChild(element._loading = e);
			e.style.position = 'absolute';
			try {e.style.opacity =0.8;} catch(e) {}
			try {e.style.MozOpacity = 0.8;} catch(e) {}
			try {e.style.filter = 'alpha(opacity='+Math.round(0.8 * 100)+')';} catch(e) {}
			try {e.style.KhtmlOpacity = 0.8;} catch(e) {}
		}
		element._loading.className = className;
		window.setTimeout((function() {
			if (this._waiting) {
				var left = this.getLeft();
				var top = this.getTop();
				var	width = this.getCoordinates().width;
				var	height = this.getCoordinates().height;
				try {
					var	marginright = parseInt(element._loading.getStyle('margin-right'));
					var	marginleft = parseInt(element._loading.getStyle('margin-left'));
					var	margintop = parseInt(element._loading.getStyle('margin-top'));
					var	marginbottom = parseInt(element._loading.getStyle('margin-bottom'));
					var	l = this._loading;
					
					hMargin = marginleft + marginright;
					vMargin = margintop + marginbottom;
					
					l.style.left = left+'px';
					l.style.top = top+'px';
					l.style.width = (width - hMargin) + 'px';
					l.style.height = (height - vMargin) +'px';
					l.style.display = 'inline';
				} catch(e) {}
			}
		}).bind(element), timeUntilShow);
	},
	
	// Stop waiting status - hide loading element
	stopWaiting: function() {
		element = this;
		if (element._waiting) {
			element._waiting = false;
			element._loading.parentNode.removeChild(element._loading);
			element._loading = null;
		}
	}
});