/**
 * Fisheye menu
 * 
 * implemented with Mootools framework
 * 
 * ported from Interface Elements for jQuery (by Stephan Petre)
 * this version by Chris Thornett
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 */

/**
 * Class mooFisheye
 * Build a Fisheye menu from a list of links
 * Extends: Element
 * syntax: myElement.Fisheye(options);
 *
 * Options: 
 *   container - (string) selector for fisheye container
 *   items - (string) selector for fisheye items
 *   itemsText - (string) selector for text elements of each item
 *   itemWidth - (integer) the minimum width for each item
 *   maxWidth - (integer) the maximum width for each item
 *   proximity - (integer) the distance from element that make item to interact
 *   valign - (string) vertical alignment
 *   halign - (string) horizontal alignment
 *
 * @type jQuery
 * @cat Plugins/Interface
 * @author Stefan Petre
 */
	
mooFisheye = {
	
	build : function(options) {
		el=$(this);
		if (!el) return;
		el.fisheyeCfg = {
			items : el.getElements(options.items),
			container: el.getElement(options.container),
			pos : el.getPosition(),
			itemWidth: options.itemWidth,
			itemsText: options.itemsText,
			proximity: options.proximity,
			valign: options.valign,
			halign: options.halign,
			maxWidth : options.maxWidth
		};
		mooFisheye.positionContainer(el, 0);
		window.addEvent(
			'resize',
			function()
			{
				el.fisheyeCfg.pos = el.getPosition();
				mooFisheye.positionContainer(el, 0);
				mooFisheye.positionItems(el);
			}
		);
		mooFisheye.positionItems(el);
		
		el.fisheyeCfg.items.each(
			function(item) {
				item.addEvent(
					'mouseover',
					function()
					{
						this.getElement(el.fisheyeCfg.itemsText).style.display = 'block';
					}
				);
				item.addEvent(
					'mouseout',
					function()
					{
						this.getElement(el.fisheyeCfg.itemsText).style.display = 'none';
					}
				);
			});
		document.addEvent(
			'mousemove',
			function(e)
			{
				var pointer = mooFisheye.getPointer(e);
				var toAdd = 0;
				if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center')
					var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.length)/2 - el.fisheyeCfg.itemWidth/2;
				else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right')
					var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.length;
				else 
					var posx = pointer.x - el.fisheyeCfg.pos.x;
				var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight/2,2);
				el.fisheyeCfg.items.each(
					function(item,nr)
					{
						distance = Math.sqrt(
							Math.pow(posx - nr*el.fisheyeCfg.itemWidth, 2)
							+ posy
						);
						distance -= el.fisheyeCfg.itemWidth/2;
						
						distance = distance < 0 ? 0 : distance;
						distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;
						distance = el.fisheyeCfg.proximity - distance;
						extraWidth = el.fisheyeCfg.maxWidth * distance/el.fisheyeCfg.proximity;
						
						item.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
						item.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
						toAdd += extraWidth;
					}
				);
				mooFisheye.positionContainer(el, toAdd);
			}
		);
	},
	
	getPointer : function(event) {
		var x = event.page.x;
		var y = event.page.y;
		return {x:x, y:y};
	},
	
	positionContainer : function(el, toAdd)
	{
		if (el.fisheyeCfg.halign)
			if (el.fisheyeCfg.halign == 'center')
				el.fisheyeCfg.container.style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.length)/2 - toAdd/2 + 'px';
			else if (el.fisheyeCfg.halign == 'left')
				el.fisheyeCfg.container.style.left =  - toAdd/el.fisheyeCfg.items.length + 'px';
			else if (el.fisheyeCfg.halign == 'right')
				el.fisheyeCfg.container.style.left =  (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.length) - toAdd/2 + 'px';
		el.fisheyeCfg.container.style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.length + toAdd + 'px';
	},
	
	positionItems : function(el)
	{
		el.fisheyeCfg.items.each(
			function(item,nr)
			{
				item.style.width = el.fisheyeCfg.itemWidth + 'px';
				item.style.left = el.fisheyeCfg.itemWidth * nr + 'px';
			}
		);
	}
};

Element.extend({FishEye : mooFisheye.build});

