/******************************************************
 * Info: Fisheye-Effect for Script.Aculo.us
 * Last Update: 18-07-2007
******************************************************/ 
function sfisheye(options) {		
	build = function() {
		positionContainer(cfg.dock, 60);
		
		Event.observe(window, 'resize', function() {
			cfg.pos = {
				x : Position.page(cfg.dock)[0],
				y : Position.page(cfg.dock)[1]
			};
			positionContainer(cfg.dock, 0);
			positionItems(cfg.dock);
		});
		
		positionItems(cfg.dock);
		
		counter = 0;
		$$('#'+cfg.containerID+' .dock-item').each(function(el) {
			el.id = "dock_item_"+counter;
			lastSpan = 0;
			lastImg = 0;
			$$('#'+el.id+' '+cfg.itemsText).each(function(span) {
				span.id = "dock_item_text_" + counter;
				lastSpan = span;
			});
			
			$$('#'+el.id+' img').each(function(img) {
				img.id = "dock_item_image_" + counter++;
				lastImg = img;
			});
			
			Event.observe($(lastImg.id), "mouseout", function(evt) { spanNone(evt); });
			Event.observe($(lastImg.id), "mouseover", function(evt){ spanBlock(evt); });
		});
		
		Event.observe(document,'mousemove', function(e) {
			var pointer = {
				x : Event.pointerX(e),
				y : Event.pointerY(e)
			};
			
			var toAdd = 0;
			if (cfg.halign && cfg.halign == 'center') {
				var posx = pointer.x - cfg.pos.x - (cfg.dock.offsetWidth - cfg.itemWidth * cfg.items.size())/2 - cfg.itemWidth/2;
			}
			else if (cfg.halign && cfg.halign == 'right') {
				var posx = pointer.x - cfg.pos.x - cfg.dock.offsetWidth + cfg.itemWidth * cfg.items.size();
			}
			else {
				var posx = pointer.x - cfg.pos.x;
			}
			
			var posy = Math.pow(pointer.y - cfg.pos.y - cfg.dock.offsetHeight/2,2);
			//$('debug_infos').innerHTML = 'DockPos:<br>X:'+cfg.pos.x+'<br>Y:'+cfg.pos.y+'<br>Pointer:<br>X: '+pointer.x+'<br>Y: '+pointer.y+'<br>Verarbeitet:<br>X: '+posx+'<br>Y: '+posy;
			counter = 0;
			cfg.items.each(
				function(el) {
					nr = counter++;
					distance = Math.sqrt(
						Math.pow(posx - nr*cfg.itemWidth, 2)
						+ posy
					);
					distance -= cfg.itemWidth/2;
					
					distance = distance < 0 ? 0 : distance;
					distance = distance > cfg.proximity ? cfg.proximity : distance;
					distance = cfg.proximity - distance;
					
					extraWidth = cfg.maxWidth * distance/cfg.proximity;
					
					el.style.width = cfg.itemWidth + extraWidth + 'px';
					el.style.left = cfg.itemWidth * nr + toAdd + 'px';
					toAdd += extraWidth + 6;
				}
			);
			
			positionContainer(cfg.dock, toAdd);
		});
	};
	
	spanNone = function(evt) {
		id = Event.element(evt).id.replace('image_','');
		if (id != '') {
			$$('#' + id + ' span').each(function(el) {
				el.style.display = 'none';
			});
		}
	};
	
	spanBlock = function(evt) {
		id = Event.element(evt).id.replace('image_','');
		if (id != '') {
			$$('#' + id + ' span').each(function(el) {
				el.style.display = 'block';
			});
		}	
	};
		
	positionContainer = function(el, toAdd) {
		if (cfg.halign) {
			if (cfg.halign == 'center') {
				cfg.container.style.left = (cfg.dock.offsetWidth - cfg.itemWidth * cfg.items.size())/2 - toAdd/2 + 'px';
			}
			else if (cfg.halign == 'left') {
				cfg.container.style.left =  toAdd/cfg.items.size() + 'px';
			}
			else if (cfg.halign == 'right') {
				cfg.container.style.left =  (cfg.dock.offsetWidth - cfg.itemWidth * cfg.items.size()) - toAdd/2 - 12 + 'px';
			}
		}
		cfg.container.style.width = cfg.itemWidth * cfg.items.size() + toAdd + 'px';
	};
	
	positionItems = function(el) {
		counter = 0;
		cfg.items.each(function(ele) {
			nr = counter++;
			nGap = (nr > 0) ? nr * 6 : 0;
			ele.style.width = cfg.itemWidth + 'px';
			ele.style.left  = (cfg.itemWidth * nr) + nGap + 'px';
		});
	};

	var cfg = {
		items : $$('#'+options.container+' '+options.items),
		container: $(options.container),
		containerID: options.container,
		dock : $(options.dock),
		pos : {
			x : Position.page($(options.dock))[0],
			y : Position.page($(options.dock))[1]
		},
		itemWidth: options.itemWidth,
		itemsText: options.itemsText,
		proximity: options.proximity,
		valign: options.valign, /* TODO */
		halign: options.halign,
		maxWidth : options.maxWidth,
		dockShowEffect: options.dockShowEffect,/* TODO */
		dockHide: options.dockHideOnStart,/* TODO */
		dockHideEffect: options.dockHideEffect,/* TODO */
		dockletOnClickEffect: options.dockletOnClickEffect/* TODO */
	};
	
	build();
}