
if(!GUI) {

	var GUI = Class.create({
		
		initialize: function(options) {
			this.registeredFunctions = $H({ 'onStart': [], 'onResize': [], 'onClick': [] });
			this.registeredElements = $H();
			
			this.options = Object.extend({}, options || {});
			this.actualEvent = null;
			
			Event.observe(document, "dom:loaded", this.onStart.bindAsEventListener(this));
			Event.observe(window, 'resize', this.onResize.bindAsEventListener(this));
			Event.observe(document, 'click', this.onClick.bindAsEventListener(this));
			},
			
			
		onStart: function(event){
			this._doInitSequence();
			this._executeFunctions('onStart', event);
			},
			
		
		onResize: function(event){
			this._executeFunctions('onResize', event);
			},
		
		
		onClick: function(event){
			this._executeFunctions('onClick', event);
			},
			
			
		_doInitSequence: function(){
			this.registerFunction('onStart', function(gui){
				var body = $(document.body);
				var overlay = new Element('div', { 'class': 'gui-overlay', 'style': 'z-index: 10000' }).hide();
				body.insert({ 'top': overlay });
				
				gui.registerElement('body', body);
				gui.registerElement('overlay', overlay);
				gui.registerElement('dialog', new Dialog(body, { 'overlay': overlay }));
				}, 'top');
			
			this.registerFunction('onStart,onResize', function(gui){
				var overlay = gui.getRegisteredElement('overlay');
				var viewport = document.viewport.getDimensions();
				
				overlay.setStyle({ 'width': ''.concat(viewport.width, 'px'), 'height': ''.concat(viewport.height, 'px') });
				});
			},
			
			
		_executeFunctions: function(eventType, event){
			this.actualEvent = event;
			
			var funktions = this.registeredFunctions.get(eventType);
				
				funktions.each(function(f){
					try {
						f(this);
					}
					catch(e){
						alert('Cy:con GUI Error in '.concat(eventType, '-Handler.\n\n', e, '\n\nTried to execute: ', f));
					}
				}.bind(this));
			},
			
			
		registerFunction: function(eventNames, funktion, position){
			eventNames = eventNames.strip().split(','); 
			
			eventNames.each(function(eventName){
				switch (position){
					case 'top':
						this.registeredFunctions.get(eventName).unshift(funktion);
						break;
					
					default:
						this.registeredFunctions.get(eventName).push(funktion);
					}
				}.bind(this));
			},
		
		
		registerElement: function(name, element){
			this.registeredElements.set(name, element);
			},
			
			
		getRegisteredElement: function(name){
			return this.registeredElements.get(name);
			}
		});
	}

if (typeof(Cycon) === 'undefined')
	Cycon = new Object();

Cycon.GUI = new GUI();
