/**
 * Interface Elements for jQuery
 * Fisheye menu
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 */

/**
 * Build a Fisheye menu from a list of links
 *
 * @name Fisheye
 * @description Build a Fisheye menu from a list of links
 * @param Hash hash A hash of parameters
 * @option String items items selection
 * @option String container container element
 * @option Integer itemWidth the minimum width for each item
 * @option Integer maxWidth the maximum width for each item
 * @option String itemsText selection of element that contains the text for each item
 * @option Integer proximity the distance from element that make item to interact
 * @option String valign vertical alignment
 * @option String halign horizontal alignment
 *
 * @type jQuery
 * @cat Plugins/Interface
 * @author Stefan Petre
 * @mod Tobias Jäck, loaden@einmalmitprofis.com
 */
jQuery.iFisheye = {
	build : function(options) {	
		return this.each(function() { 
			var el = this;
			el.fisheyeCfg = {
				items : jQuery(options.items, this),
				container: jQuery(options.container, this),
				pos : jQuery.iUtil.getPosition(this),
				itemWidth: options.itemWidth,
				itemsText: options.itemsText,
				proximity: options.proximity,
				valign: options.valign,
				halign: options.halign,
				maxWidth : options.maxWidth
			};
			jQuery.iFisheye.positionContainer(el, 0);
			jQuery(window).bind('resize', function() {
				el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);
				jQuery.iFisheye.positionContainer(el, 0);
				jQuery.iFisheye.positionItems(el);
			});
			// position: fixed; scroll-Fix: start
			var newposition = function() {
				var oldyoffset = window.pageYOffset;
				var oldxoffset = window.pageXOffset;	
				jQuery(document).bind('scroll', function() {					
					if (oldyoffset < window.pageYOffset)						
						el.fisheyeCfg.pos.y = el.fisheyeCfg.pos.y - oldyoffset + window.pageYOffset;						
					else				
						el.fisheyeCfg.pos.y = el.fisheyeCfg.pos.y - oldyoffset + window.pageYOffset;
					if (oldxoffset < window.pageXOffset)					
						el.fisheyeCfg.pos.x = el.fisheyeCfg.pos.x - oldxoffset + window.pageXOffset;						
					else					
						el.fisheyeCfg.pos.x = el.fisheyeCfg.pos.x - oldxoffset + window.pageXOffset;
					oldyoffset = window.pageYOffset;
					oldxoffset = window.pageXOffset;
					jQuery.iFisheye.positionContainer(el, 0);
					jQuery.iFisheye.positionItems(el);
				});	
			}			
			if (jQuery(el.fisheyeCfg.container).css('position') == 'fixed') {
				newposition();
			} else {			
				jQuery(el.fisheyeCfg.container).parents().each(function() {
					if (jQuery(this).css('position') == 'fixed') {
						newposition();
						return false;
					} 
				});	
			}
			// position: fixed; scroll-Fix: end
			jQuery.iFisheye.positionItems(el);
			el.fisheyeCfg.items.bind('mouseover', function() {
				jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block';
			}).bind('mouseout', function() {
				jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none';
			});
			jQuery(document).bind('mousemove', function(e) {
				var pointer = jQuery.iUtil.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.size())/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.size();
				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(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;							
					this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';
					this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';
					toAdd += extraWidth;
				});
				jQuery.iFisheye.positionContainer(el, toAdd);
			});
		})
	},	
	positionContainer : function(el, toAdd) {
		if (el.fisheyeCfg.halign)
			if (el.fisheyeCfg.halign == 'center')
				el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size())/2 - toAdd/2 + 'px';
			else if (el.fisheyeCfg.halign == 'left')
				el.fisheyeCfg.container.get(0).style.left =  - toAdd/el.fisheyeCfg.items.size() + 'px';
			else if (el.fisheyeCfg.halign == 'right')
				el.fisheyeCfg.container.get(0).style.left =  (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd/2 + 'px';
		el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px';
	},	
	positionItems : function(el) {
		el.fisheyeCfg.items.each(function(nr) {
			this.style.width = el.fisheyeCfg.itemWidth + 'px';
			this.style.left = el.fisheyeCfg.itemWidth * nr + 'px';
		});
	}
};
jQuery.fn.Fisheye = jQuery.iFisheye.build;