var AjaxLoading = new Class({

	initialize: function(elementId) {

		//saving properties
		this.targetElement = $(elementId);
		this.alpha = 0.8;

		//creating elements
		this.container = new Element('div', {
			'class': 'ajaxLoading-container',
			'styles': {
				'cursor': 'progress',
				'position': 'absolute',
				'top': 0
			}
		});

		this.image = new Element('img', {
			'class':'ajaxLoading-image',
			'src': 'images/ajax-loader.gif',
			'styles': {
				'cursor': 'inherit'
			}
		});
		
		this.messageSpan = new Element('span', {
			'class': 'ajaxLoading-message'
		});

		this.messageContainer = new Element('div', {
			'styles': {
				'cursor': 'inherit',
				'text-align': 'center'
			}
		});

		this.container.fade('hide');
		
		this.messageSpan.inject(this.messageContainer, 'top');
		this.image.inject(this.messageContainer, 'top');
		this.messageContainer.inject(this.container);
		this.container.inject(document.body);

		this.setTarget(elementId);

		window.addEvent('resize', this.onTargetResize.bindWithEvent(this));
	},
	place: function() {
		this.container.set('styles', {
			'top': this.targetElement.getPosition().y,
			'left': this.targetElement.getPosition().x,
			'width': this.targetElement.getSize().x,
			'height': this.targetElement.getSize().y
		});
		this.messageContainer.set('styles', { 'margin-top': (this.targetElement.getSize().y - this.messageContainer.getSize().y) * 0.5 });
		return this;
	},
	setTarget: function(elementId) {
		this.targetElement.removeEvent('resize', this.onTargetResize.bindWithEvent(this))
		this.targetElement = $(elementId);
		this.targetElement.addEvent('resize', this.onTargetResize.bindWithEvent(this));
		this.place();
		return this;
	},
	getMessage: function(msg) {
		return this.messageText;
	},
	setMessage: function(msg) {
		this.messageText = msg;
		this.messageSpan.set('text', msg);
		return this;
	},
	onTargetResize: function() {
		if(this.targetElement) this.place();
	},
	fade: function(how) {
		this.place();
		this.container.fade(how);
		return this;
	},
	show: function() {
		this.fade(this.alpha);
		return this;
	},
	hide: function() {
		this.fade(0);
		return this;
	},
	toString: function() {
		return '[ AjaxLoadingObject: Target Element: ' + this.targetElement.get('id') + ', Message Text: ' + this.messageText + ']';
	}
});