var Warning = function(dialog_element, message) {
	if (!Warning.instance) { 	//implements a singleton pattern...
		Warning.instance = this
		Warning.prototype.initialize(dialog_element, message);
	}
	else { 
		Warning.instance.initialize(dialog_element, message);
		return Warning.instance;
	}
}
Warning.prototype = {
	initialize: function(dialog_element, message) {
		this.dialog_element = dialog_element;
		$A(this.dialog_element.getElementsByTagName('p')).invoke('remove');
		message_element = document.createElement('p');
		message_element.innerHTML = message
		this.dialog_element.appendChild(message_element);
		context = this;
		this.dialog_element.getElementsByClassName('close')[0].observe('click', this.dismiss.bindAsEventListener(self, this));
		this.is_raised = false;
	},
	__prepare_window__: function(target, offset) {
		if (this.timeout) { 
					if (console) { console.log("timeout " + this.timeout + " destroyed."); }
					window.clearTimeout(this.timeout);
					delete this.timeout;
		}
		if (this.is_raised) { this.dialog_element.hide(); }
		var pos, p_top, p_left;
		pos = Position.cumulativeOffset(target);
		p_top = pos[1] - offset[0];
		p_left = pos[0] - offset[1];
		this.dialog_element.setStyle( { 'top': p_top+"px", 'left': p_left+"px"} );
		this.is_raised = true;	
	},
	raise: function(target) {
		offset = (!arguments[1]) ? offset = [60, 5] : arguments[2];
		this.__prepare_window__(target, offset)
		Effect.Appear(this.dialog_element, { duration: 0.7 });	
	},
	raise_intermittent: function (target, timeout) {
		offset = (!arguments[2]) ? offset = [60, 5] : arguments[2];
		
		timeout *= 1000;
		this.__prepare_window__(target, offset);
		Effect.Appear(this.dialog_element, { duration: 0.7 });
		function callback(context, stub) { 
			Effect.Fade(context.dialog_element, { duration: 0.7 });
			context.is_raised = false;
			if (console) {
				console.log("timeout " + context.timeout + " callback called... " );
			}
		}
		this.timeout = window.setTimeout(callback.bind(false, this), timeout);
		if (console) {
			console.log("timeout set: " + this.timeout);
		}
		
	},
	dismiss: function(event, context) {
		Effect.Fade(context.dialog_element, { duration: 0.7 });
		context.is_raised = false;
		Event.stop(event);
	}
}
