/**
 * Menu déroulant v.2
 * par Romain Berton
 * pour www.alsacreations.com
 * le 25/03/2007
 */

(function() {

var oO =
{
	'Menus': 'menus',


	'Ul': 'ul',
	'Li': 'li',
	'A': 'a',


	'Tempo': 650, // Temps d'ouverture d'un sous-menu (ms)
	'Interval': 5, // Intervalle entre deux itérations de mouvement (ms)


	'Overflow': 'hidden', // sous-menus


	'Style': 'Surv', // menu
	'Border': 'ssMenuBordTop', // sous-menus
	'NoBorder': 'ssMenuNoBordTop', // sous-menus
	'FL': 'focusLink', // liens des sous-menus à la prise de focus
	'FT': 'focusTitle', // entête des sous-menus à la prise de focus
	'BL': 'blurLink', // liens des sous-menus à la perte de focus
	'BT': 'blurTitle', // entête des sous-menus à la perte de focus

	_bTest: function()
	{
		return document.getElementById && document.getElementsByTagName &&
		document.createElement && document.createTextNode;
	},

	_oId: function(sId)
	{
		if(document.getElementById(sId))
			return document.getElementById(sId);

		return false;
	},

	_aTag: function(oEl, sTag)
	{
		if(oEl && sTag && oEl.getElementsByTagName(sTag) != 0)
			return oEl.getElementsByTagName(sTag);

		return false;
	},

	_bElemNotLink: function(oEl)
	{
		if(oEl)
			return oEl.nodeValue != null && oEl.nodeName.toLowerCase() != oO['A'];

		return false;
	},

	_oCreaEl: function(sTag)
	{
		if(sTag)
			return document.createElement(sTag);

		return false;
	},

	_oCreaTxt: function(sTxt)
	{
		if(sTxt)
			return document.createTextNode(sTxt);

		return false;
	},

	_CancelClick: function(e)
	{
		if(e && e.stopPropagation && e.preventDefault)
		{
			e.stopPropagation();
			e.preventDefault();
		}
		else if(e && window.event)
		{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}

		return false;
	},

	_Elem: function()
	{
		var aArg = arguments,
		    oElem = oO._oCreaEl(aArg[0]),
		    iI = 2,
		    aTab = aArg.length;

		for(iI; iI < aTab; iI++)
		{
			iI % 2 === 0 ?
				oO.sAtt = aArg[iI] :
				oO.sVal = aArg[iI];

			if(oO.sAtt && oO.sAtt === aArg[iI-1])
				oO.sAtt === 'class' ?
					oElem.className = oO.sVal :
					oElem.setAttribute(oO.sAtt, oO.sVal);
		}
		if(aArg[1] && typeof aArg[1] === 'string' && aArg[1] != '')
		{
			var oText = oO._oCreaTxt(aArg[1]);

			oElem.appendChild(oText);
		}

		return oElem;
	},


	_Connect: function(oElem, sEvType, fn, bCapture)
	{
		return document.addEventListener ?
			oElem.addEventListener(sEvType, fn, bCapture):
			oElem.attachEvent ?
				oElem.attachEvent('on' + sEvType, fn):
				false;
	},

	_GetSource: function(e)
	{
		if(e)
			return e.target || e.srcElement;

		return false;
	},

	_Contains: function(container, containee)
	{
		if(container && containee)
		{
			var n = containee;

			for(n; n && n != container; n = n.parentNode) {}

			return n;
		}

		return false;
	},

	_InsertCtrlLinks: function(oMenus)
	{
		if(!oMenus)
			return;

		var aLis = oO._aTag(oMenus, oO['Li']),
		    iI = aLis.length;

		if(iI === 0)
			return;

		while(iI-- > 0)
		{
			var oChildLi = aLis[iI].firstChild;

			if(!oChildLi)
				return;

			if(oO._bElemNotLink(oChildLi))
			{
				var oA = oO._Elem('a', oChildLi.nodeValue, 'href', '#ssmenu');

				aLis[iI].replaceChild(oA, oChildLi);
				oO._Connect(oA, 'click', oO._CancelClick, false);
			}
		}

		return oMenus;
	},


	_InitCptMenu: function(oMenus)
	{
		if(!oMenus)
			return;

		oO._Connect(oMenus, 'mouseover', oO._CtrlDisplayOn, false);
		oO._Connect(oMenus, 'mouseout', oO._CtrlDisplayOut, false);

		var aA = oO._aTag(oMenus, oO['A']),
		    iI = aA.length;

		if(iI === 0)
			return;

		while(iI-- > 0)
		{
			oO._Connect(aA[iI], 'focus', oO._CtrlDisplayOn, false);
			oO._Connect(aA[iI], 'blur', oO._CtrlDisplayOut, false);
		}

		return oMenus;
	},


	_InitStyle: function(oMenus)
	{
		if(!oMenus)
			return;

		oMenus.className = oO['Style'];

		var aUls = oO._aTag(oMenus, oO['Ul']),
		    iI = aUls.length;

		if(iI === 0)
			return;

		oO.Heights = [];

		do
		{
			aUls[--iI].id = 'ssmenu' + iI;
			aUls[iI].style.overflow = oO['Overflow'];
			oO.Heights[iI] = aUls[iI].offsetHeight;
			aUls[iI].style.height = 0;
			aUls[iI].className = oO['NoBorder'];
		}
		while(iI > 0)

		return oMenus;
	},

	_Actif: function()
	{
		var oMenus = oO._oId(oO['Menus']);

		if(!oMenus)
			return;

		if(oO._InsertCtrlLinks(oMenus))
			if(oO._InitStyle(oMenus))
				return oO._InitCptMenu(oMenus);

		return;
	},


	_CtrlDisplayOn: function(e)
	{
		if(e)
		{
			var oRelatedNode = e.fromElement;

			return oO._CtrlDisplay(e, oRelatedNode, oO['Montre']);
		}

		return false;
	},

	_CtrlDisplayOut: function(e)
	{
		if(e)
		{
			var oRelatedNode = e.toElement;

			return oO._CtrlDisplay(e, oRelatedNode, oO['Cache']);
		}

		return false;
	},


	_CompareSsMenu: function(oMenus, oUl)
	{
		if(!oMenus || !oUl)
			return;

		var aUls = oO._aTag(oMenus, oO['Ul']),
		    iI = aUls.length;

		for(; iI >= 0; iI--)
			if(aUls[iI] === oUl)
				return iI;

		return;
	},


	_CtrlDisplay: function(e, oRelatedNode, css)
	{
		var oRelatedNode = e.relatedTarget || oRelatedNode,
		    oSource = oO._GetSource(e),
		    oMenus = oO._oId(oO['Menus']);

		while(oSource && oSource != oMenus)
		{
			var oUl = oO._aTag(oSource, oO['Ul'])[0],
			    oParentSource = oSource.parentNode,
			    iI;

			if(!oO._Contains(oSource, oRelatedNode) && oUl &&
			(iI = oO._CompareSsMenu(oMenus, oUl)) != null)
				if(e.type === 'mouseout')
				{
					oO._Temp = setTimeout
					(
						function()
						{
              oUl.parentNode.firstChild.className = oO['BT'];
							oO._Deroule(oUl.id, oO.Heights[iI], 0, oO['Interval']);
						},
						oO['Tempo']
					);
					if(oSource.PostIt != oO._Temp)
						oSource.PostIt = oO._Temp;
				}
				else if(oO._Temp && oSource.PostIt === oO._Temp &&
				e.type === 'mouseover')
				{
					oO._Deroule(oUl.id, 0, oO.Heights[iI], oO['Interval']);
					oO.PostIt = null;
					clearTimeout(oO._Temp);
				}
				else
				{
					switch(e.type)
					{
						case 'mouseover':
							oO._Deroule(oUl.id, 0, oO.Heights[iI], oO['Interval']);
							break;

						case 'focus':
              oUl.parentNode.firstChild.className = oO['FT'];
							oUl.className = oO['Border'];
							oUl.style.height = oO.Heights[iI] + 'px';
							break;

						case 'blur':
              oUl.parentNode.firstChild.className = oO['BT'];
							oUl.className = oO['NoBorder'];
							oUl.style.height = 0;
							break;
					}
				}

				if(oSource.nodeName.toLowerCase() === oO['A'])
					if(e.type === 'focus' || e.type === 'mouseover')
						oSource.className = (oParentSource.parentNode != oMenus) ?
							oO['FL'] :
							oO['FT'];
					else if(e.type === 'blur' || e.type === 'mouseout')
						oSource.className = (oParentSource.parentNode != oMenus) ?
							oO['BL'] :
							oSource.className;

				oSource = oParentSource;
			}

		return;
	},

	_Deroule: function(id, initHeight, finalHeight, interval)
	{
		var oElem = oO._oId(id);

		if(!oElem)
			return;

		if(oElem.movement)
			clearTimeout(oElem.movement);

		var iDimY = parseInt(oElem.style.height);

		if(iDimY === finalHeight)
			return;

		if(finalHeight != 0)
			oElem.className = oO['Border'];

		if(iDimY < 2)
			oElem.className = oO['NoBorder'];

		if(iDimY < finalHeight)
		{
			var dist = Math.ceil((finalHeight - iDimY)/10);
			iDimY = iDimY + dist;
		}

		if(iDimY > finalHeight)
		{
			var dist = Math.ceil((iDimY - finalHeight)/10);
			iDimY = iDimY - dist;
		}

		oElem.style.height = iDimY + 'px';

		var repeat = function()
		{
			oO._Deroule(id, initHeight, finalHeight, interval);
		};

		oElem.movement = setTimeout(repeat, interval);

		return;
	}
};

if(oO._bTest)
	oO._Connect(window, 'load', oO._Actif, false); // Lancement du script

})();
