var addListener = function (targetNode, type, func)
{
	if (targetNode.addEventListener)
	{
		targetNode.addEventListener(type, func, false);
	} 
	else if (targetNode.attachEvent)
	{
		targetNode.attachEvent('on'+type, func);
	}
}

var $ = function ()
{
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++)
	{
		var element = arguments[i];
		if (typeof element == 'string') element = document.getElementById(element);
		if (arguments.length == 1) return element;
		elements.push(element);
	}
	return elements;
}

/***************************************************************/

var toyoMenu2 = (function()
{
	// Private members
	
	var __isIe = typeof(document.evaluate) == 'undefined';
	
	var __imgPadding = 4;
	var __menuPadding = 20;
	var __extraImgPadding = 10;
	var __defaultOpacity = 0.5;
	var __sizeCoef = 1.8;
	var __extraBodyMargin = 15;
	
	var __menuId;
	var __images = new Array();
	var __razAll = true;
	var __leftPos;
	var __topPos;
	var __totalWidth = 0;
	var __totalHeight = 0;
	var __biggestWidth = 0;	
	var __biggestHeight = 0;

	var getLeft = function (object)
    {
		if (object.offsetParent) return (object.offsetLeft + getLeft(object.offsetParent));
		else return (object.offsetLeft);
    } 
	
	var getTop = function (object)
    {
		if (object.offsetParent) return (object.offsetTop + getTop(object.offsetParent));
		else return (object.offsetTop);
    } 
	
	var initData = function ()
	{
		var mainUl = $(__menuId);
		var liElements = mainUl.getElementsByTagName('li');
		var tmp = 0;
		var previousId = null;

		for (var i = 0; i < liElements.length; i++)
		{
			var li = liElements[i];
			var img = getInnerImg(li);
			
			__images[li.id] = new Array();
			__images[li.id].originalWidth = img.width;
			__images[li.id].originalHeight = img.height;

			if (img.width > __biggestWidth) __biggestWidth = img.width;
			if (img.height > __biggestHeight) __biggestHeight = img.height;
			
			__totalWidth += img.width + (__imgPadding * 2);
			if (img.height > __totalHeight) __totalHeight = img.height;
		}
		__totalWidth += __menuPadding * 2;
		__totalHeight += (__imgPadding * 2) + (__menuPadding * 2);		

		for (var i = 0; i < liElements.length; i++)
		{
			var li = liElements[i];
			var img = getInnerImg(li);
			
			setOpacity(img);
			img.style.padding = __imgPadding + 'px';
			
			__images[li.id].centreX = i == 0 ? __menuPadding : __images[previousId].centreX + tmp;
			tmp = __imgPadding + (__images[li.id].originalWidth / 2);
			previousId = li.id;
			__images[li.id].centreX += tmp;
			
			var heightCorrection = (__biggestHeight - __images[li.id].originalHeight) / 2;
			img.style.paddingBottom = (__imgPadding + heightCorrection) + 'px';
			__images[li.id].centreY = __menuPadding + __imgPadding + (__images[li.id].originalHeight / 2) + heightCorrection;
		}
		
		// Padding de l'ul
		mainUl.style.padding = __menuPadding + 'px';
		if (!__isIe) mainUl.style.paddingBottom = (__menuPadding - 5) + 'px';

		// On retire les noeuds "text"
		var nodeToRemove = new Array();
		for (var i = 0; i < mainUl.childNodes.length; i++)
		{
			var child = mainUl.childNodes[i];
			if (child.nodeName.toLowerCase() != 'li') nodeToRemove.push(child);
		}
		for (ind in nodeToRemove) mainUl.removeChild(nodeToRemove[ind]);
	};

	var setPosition = function()
	{
		var mainUl = $(__menuId);
		mainUl.style.bottom  = (document.documentElement.clientHeight / 2) - (__totalHeight / 2) + 'px';
		mainUl.style.left = (document.documentElement.clientWidth / 2) - (__totalWidth / 2) + 'px';
		
		__topPos = getTop(mainUl);
		__leftPos = getLeft(mainUl);
		
		return document.documentElement.clientWidth > (__totalWidth + (__biggestWidth *__sizeCoef) - __biggestWidth + __extraBodyMargin);
	}
	
	var setOpacity = function (img, opacity)
	{
		if (opacity == null) opacity = __defaultOpacity;
		img.style.opacity = opacity;
		img.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';	
	};
	
	var initImg = function (id, img)
	{
		img.width = __images[id].originalWidth;
		img.height = __images[id].originalHeight;
		img.style.top = 0;
		setOpacity(img);
	};
	
	var getInnerImg = function (liElement)
	{
		return liElement.firstChild.firstChild;
	};
	
	var animeMenu = function ()
	{
		var mainUl = $(__menuId);

		addListener(document, 'mousemove', function (event)
		{
			var posX = event.clientX - __leftPos;
			var posY = __topPos + __totalHeight - event.clientY;
			//$('debug').innerHTML = posX+' '+posY+'<br />';
		
			var wip = false;
			for (id in __images)
			{
				var img = getInnerImg($(id));
				var imgObj = __images[id];
			
				var centerX	= imgObj.centreX;
				var centerY	= imgObj.centreY;
			
				var dist = -1;
				if (posX >= 0 && posY >= 0)
				{
					var distX = Math.abs(centerX - posX);
					var distY = Math.abs(centerY - posY);
					var dist = Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2));
				}

				//$('debug').innerHTML += 'width ' + $(id).firstChild.firstChild.width + '<br />';
				//$('debug').innerHTML += 'dist ' + dist + '<br />';

				var maxDist = (imgObj.originalWidth / 2) + __imgPadding + __extraImgPadding;
				if (dist != -1 && dist < maxDist)
				{
					wip = true;
					__razAll = false;
					var maxWidthDelta = (imgObj.originalWidth * __sizeCoef) - imgObj.originalWidth;
					var widthDelta = maxWidthDelta / maxDist * (maxDist - dist);
					img.width = imgObj.originalWidth + widthDelta;

					var maxHeightDelta = (imgObj.originalHeight * __sizeCoef) - imgObj.originalHeight;
					var heightDelta = maxHeightDelta / maxDist * (maxDist - dist);
					img.height = imgObj.originalHeight + heightDelta;			

					var opacity = __defaultOpacity + ((1 - __defaultOpacity) / (maxDist - __extraImgPadding) * (maxDist - dist));
					setOpacity(img, opacity);
					
					img.style.top = (heightDelta / 2) + 'px';
					mainUl.style.left = (__leftPos - (widthDelta / 2)) + 'px';
				}
				else
				{
					if (!__razAll) initImg(id, img);
				}
			}

			if (!wip)
			{
				if (!__razAll)
				{
					for (id in __images) initImg(id, getInnerImg($(id)));
					mainUl.style.left = __leftPos + 'px';
					__razAll = true;
				}
			}
		});
	};
	
	var displayMenu = function ()
	{
		var sizeOk = setPosition();
		if (sizeOk)
		{
			if ($('error')) document.body.removeChild($('error'));
			$(__menuId).style.visibility = 'visible';
		}
		else
		{
			$(__menuId).style.visibility = 'hidden';
			var padding = 10;
			var width = 350;			
			var newP = $('error');

			if (newP == null)
			{
				newP = document.createElement('p');
				newP.id = 'error';
				newP.style.padding = padding + 'px';
				newP.style.width = width + 'px';
				newP.innerHTML = "Le menu ne peut s'afficher, la résolution de votre navigateur est trop faible.";
				document.body.appendChild(newP);
			}
			
			newP.style.bottom  = (document.documentElement.clientHeight / 2) - (padding / 2) + 'px';
			newP.style.left  = (document.documentElement.clientWidth / 2) - (width / 2) + 'px';
		}
	}
	
	// Public members
	
	return {
		launch : function (menuId)
		{
			__menuId = menuId;

			addListener(window, 'load', function()
			{
				initData();
				animeMenu();
				displayMenu();
			});

			addListener(window, 'resize', displayMenu);
		}
	};
})();
