// JavaScript Document
var ObjectDock = {
	
	init: function(options)
	{
		this.options = $merge({
			elements: {},
			hide: true,
			implemented: {},
			key: 'l'
		}, options || {});

		window.addEvent('domready', this.setup.bind(this));
		
		this.locked = false;	
		this.element = false;
	},
	
	lock: function()
	{
		this.locked = true;
	},
	
	setup: function(options)
	{
		this.container = new Element('div', {'id': 'dockContainer', 'styles': {'display': 'none'}}).injectInside(document.body);
		this.hoverElement = new Element('strong', {'id': 'elementHover', 'styles': {'display': 'none'}}).injectInside(document.body);
		
		if(!this.options.hide) this.container.setStyle('display', '');
		
		window['addEvent']('scroll', this.position.bind(this));
		document['addEvent']('keydown', this.keydown.bindWithEvent(this));
		document['addEvent']('mousemove', this.mousemove.bindWithEvent(this));
		
		for(var element in this.options.elements)
		{
			this.options.implemented[element] = new Element('img', {'id': element, 'src': this.options.elements[element].icon, 'styles': {'cursor': 'pointer', 'display': 'inline', 'height': 64, 'margin-left': 'auto', 'margin-right': 5, 'position': 'relative', 'top': 96, 'vertical-align': 'top', 'width': 64}}).injectInside(this.container);
			
			this.options.implemented[element].onclick = this.options.elements[element].onclick.bind(this);
			this.options.implemented[element]['addEvent']('mouseover', this.hover.bind(this));
			this.options.implemented[element].onmouseout = this.mouseout.bind(this);
		}
		
		$$('input').each(function(el) {
			el.addEvent('focus', function(e){
				ObjectDock.lock();
			});
			
			el.addEvent('blur', function(e){
				ObjectDock.unlock();
			});
		});
	},

	position: function()
	{
		this.container.setStyle('top', (window.getHeight() + window.getScrollTop() - 128));
		this.container.setStyle('left', (window.getScrollLeft()));
	},
	
	mousemove: function(event)
	{
		var page = {
			x: event.page.x,
			y: event.page.y
		};
		
		for(var element in this.options.implemented)
		{
			var distance = Math.sqrt(Math.pow((page.x - this.options.implemented[element].getLeft() - this.options.implemented[element].offsetWidth / 2), 2) + Math.pow((page.y - this.options.implemented[element].getTop() - this.options.implemented[element].offsetHeight / 2), 2));
			
			var proximity = this.options.elements[element].maxsize / this.options.elements[element].proximity;
			var offset = this.options.elements[element].maxsize - proximity * distance;
			
			this.options.implemented[element].setStyle('width', Math.max(offset, 64));
			this.options.implemented[element].setStyle('height', Math.max(offset, 64));
			this.options.implemented[element].setStyle('top', 128 - Math.max(offset, 64));
		}
		
		if(this.element)
		{
			this.hoverElement.set('text', this.options.elements[this.element].title);
			this.hoverElement.setStyle('top', this.options.implemented[this.element].getTop() - (this.hoverElement.offsetHeight + 10));
			this.hoverElement.setStyle('left', this.options.implemented[this.element].getLeft() + ((this.options.implemented[this.element].offsetWidth - this.hoverElement.offsetWidth) / 2));
		}
	},
	
	keydown: function(event)
	{
		if(event['key'].toLowerCase() == this.options.key.toLowerCase() && !this.locked)
		{
			if(this.container.style.display == '') this.container.setStyle('display', 'none');
			else this.container.setStyle('display', '');
		}
	},
	
	hover: function(event)
	{
		this.element = (window.ie)?event.toElement.id:event.target.id;
		this.hoverElement.setStyle('display', '');
	},
	
	mouseout: function()
	{
		this.element = false;
		this.hoverElement.setStyle('display', 'none');
	},
	
	unlock: function()
	{
		this.locked = false;
	}
};