/* protoload 0.2 beta 
 * Created by Andreas Kalsch
 * Modified by Terence Johnson, Scribendi.com
 * Modified by Kurt Moyst, Scribendi.com
 * license: MIT
 * last change: 19.08.2009
 *
 * This simple piece of code automates the creation of Ajax loading symbols.
 * The loading symbol covers an HTML element with correct positioning and size - example:
 * $('myElement').showLoading() and $('myElement').hideLoading()
 */

if (window.Prototype) {
	Element.addMethods({
		// Start waiting status - show loading element
		showLoading: function(element) {
			element = $(element);
			element.hideLoading();
			var smallImg = '/images/waiting.gif';
			var imageName = '/images/waiting_32.gif';
			var options = Object.extend({
				size: 'big',
				timeUntilShow: 200, 
				style: {backgroundColor: '#FFF', color: '#000', textAlign:'center'} 
			}, arguments[1] || {});
			if ((options.size == 'small') || (element.getHeight() <= 48) || (element.getWidth() <= 48)) {
				imageName = smallImg;
			}
			element._waiting = true;
			if(element._cachedColor === undefined) {
				element._cachedColor = element.style.color;
			}
			if (!element._loading) {
				var e = new Element('div');
				element.getOffsetParent().appendChild(element._loading = e);
				e.setStyle(Object.extend(options.style, {position: 'absolute'})).hide();// cannot be overridden by options
				var img = new Element("img", { src: imageName } );
				img.setStyle({
					paddingRight: '10px',
					verticalAlign: 'middle'
				});
				e.update(img);
				if (!!options.message) {
					e.insert('&nbsp;' + options.message);
				}
				setTimeout(function(){img.src = img.src},100);
			}
			window.setTimeout((function() {
				if (this._waiting) {
					if(options.callback !== undefined) {
						options.callback();
					}
					this._loading.clonePosition(this);
					this._loading.setStyle({
						lineHeight: this._loading.getHeight()+"px"
					});
					this._loading.show().setOpacity(0.8);
					this.style.color = "#aaa";
				}
			}).bind(element), options.timeUntilShow);
		},		
		// Stop waiting status - hide loading element
		hideLoading: function(element) {
			if (element._waiting) {
				element._waiting = false;
				element._loading.parentNode.removeChild(element._loading);
				element._loading = null;
				element.style.color = element._cachedColor;
			}
		}
	});
}

