﻿/******************************************************
Javascript
===========================
copyright 2007 TIMEIMPORT, Michal Mrskoč
*******************************************************/

// enums:
Menu.NoFit = 0;
Menu.FitVertical = 1;
Menu.FitHorizontal = 2;

// consts:
Menu.HoverClass	= "hover";
Menu.StyleTitle	= "dynamicstyles";
Menu.IframeBlankSrc = "/portal/script/MenuBack.htm";

// params:
/*Menu.isIE					= true;
Menu.isIE7					= false;
Menu.enableIFrame			= true;*/

// construtor:
function Menu(_isIE, _isIE7, _enableIFrame)
{
	Menu.isIE			= _isIE;
	Menu.isIE7			= _isIE7;
	Menu.enableIFrame	= _enableIFrame;
}

Menu.prototype.Add = function(id, fitType)
{
	if (!fitType)
		fitType = Menu.NoFit;
		
	var elm = document.getElementById(id);
	if (elm == null)
		return;

	var childElms = elm.getElementsByTagName("LI");
	for (var i=0; i<childElms.length; i++)
	{
		var childLi = childElms[i];
		childLi.fitType = fitType;
		childLi.onmouseover = function(evt) { Menu.FitMenu(evt, this); }
		childLi.onmouseout	= function(evt) { Menu.RefitMenu(evt, this); }
	}
}

/* ***************************************** */

document.write('<link rel="stylesheet" href="/portal/Styles/MenuDynamic.css" type="text\/css" />');

if(document.styleSheets.length>0)
{ 
    for(i=0;i<document.styleSheets.length;i++)
    {
        var style = document.styleSheets[i];
        if (style.title=='dynamicstyles' && style.disabled)
            enableIFrame = false;
    }
}

Menu.prototype.DisableIFrames = function()
{
    enableIFrame = false;
    var iframes =  document.getElementsByTagName("iframe");
    if (iframes)
    {
        for (var i=0; i< iframes.length; i ++)
            iframe = iframes[i];
            iframe.parentNode.removeChild(iframe);
    }
}

Menu.HoverOn = function(el)
{
	if ( el )
		el.className += ' ' + Menu.HoverClass;
}

Menu.HoverOff = function(el) {
	if ( el )
		el.className = el.className.replace( Menu.HoverClass, '' );
}

Menu.HasElementClass = function(el, className)
{
	return new RegExp(("(^|\\s)" + className + "(\\s|$)"), "i").test(el.className);
}

Menu.AddClass = function(el, className)
{
	if (!Menu.HasElementClass(el, className))
		el.className += ' ' + className;
}

Menu.RemoveClass = function(el, className)
{
	if (Menu.HasElementClass(el, className))
		el.className = el.className.replace( className, '' );
}

Menu.ChangeClass = function(el, oldClassName, newClassName)
{
	Menu.RemoveClass(el, oldClassName);
	Menu.AddClass(el, newClassName);
}

Menu.CancelEvent = function(evt)
{
	if (evt)
	{
		if (evt.cancelBubble) evt.cancelBubble = true;
		if (evt.stopPropagation) evt.stopPropagation();
	}
}

Menu.GetParentElementByTagName = function(thisElement, parentTagName)
{
	if (!thisElement || !parentTagName) return null;

	parentTagName = parentTagName.toLowerCase();

	var el = thisElement;
	alert(el.tagName + " " + parentTagName);
	while (el.parentNode)
	{
		el = el.parentNode;
		alert(el.tagName + " " + parentTagName);
		if (el.tagName.toLowerCase() == parentTagName)
			return el;
	}
	return null;
}

Menu.GetElementByTagName = function(element, tagName)
{
		var elements = element.getElementsByTagName(tagName);
		if (elements && elements.length > 0)
			return elements[0];
		
		return null;
}
/*
Menu.prototype.GetElementsByTagName = function(element, tagName) {
	if (element && tagName) {
		if (element.getElementsByTagName) {
			return element.getElementsByTagName(tagName);
		}
		if (element.all && element.all.tags) {
			return element.all.tags(tagName);
		}
	}
	return null;
}*/

Menu.SetElementHeight = function(element, height)
{
	if (element && element.style)
		element.style.height = height + "px";
}

Menu.SetElementWidth = function(element, width)
{
	if (element && element.style)
		element.style.width = width + "px";
}

Menu.SetElementX = function(element, x)
{
	if (element && element.style)
		element.style.left = x + "px";
}

Menu.SetElementY = function(element, y)
{
	if (element && element.style)
		element.style.top = y + "px";
}

Menu.SetPositionAs = function(element, src)
{
	if (element && element.style && src && src.styoe)
	{
		element.style.height = src.style.height;
		element.style.width = src.style.width;
		element.style.left = src.style.left;
		element.style.top = src.style.top;
	}
}

/*
    onmouseout
*/

Menu.RefitMenu = function(evt, srcEl)
{
	if ( Menu.HasElementClass(srcEl, "static") )
		return;

	ul = Menu.GetElementByTagName(srcEl, "ul");
	if (!ul)
		return;

	if ( (srcEl.fitType & Menu.FitVertical) != 0 )
		Menu.SetElementY( ul, 0 );

	if ( (srcEl.fitType & Menu.FitHorizontal) != 0 )
		Menu.SetElementX( ul, 0 );

	if ((srcEl.fitType != 0) && Menu.isIE7 ) 
		Menu.ChangeClass(ul, "visible", "invisible");

	if ( Menu.isIE && !Menu.isIE7 && !window.opera)
	{
		Menu.HoverOff(srcEl);
		var childFrame = srcEl.offsetParent.childFrame;
		if (childFrame)
		{
			Menu.ChangeClass(childFrame, "ieFrame", "invisible");
		}
	}
	
	Menu.CancelEvent(evt);
}

/*
    onmouseover
*/

Menu.FitMenu = function(evt, srcEl)
{
	if (Menu.HasElementClass(srcEl, "static"))
		return;

	var ul = Menu.GetElementByTagName(srcEl, "ul");
	if (!ul)
		return;

	if (Menu.isIE && !Menu.isIE7 && !window.opera)
		Menu.HoverOn(srcEl);

	if ((srcEl.fitType & Menu.FitVertical) != 0)
	{
		if (Menu.isIE7) 
			Menu.ChangeClass(ul, "invisible", "visible");

		var pos = Menu.GetElementPosition(ul);

		var winSize = Menu.GetWindowSize();
		var winScroll = Menu.GetWindowScroll();
		var _top;
		if ((pos.y + pos.height)  > (winScroll[1] + winSize[1]))
		{
			_top = winScroll[1] + winSize[1] - pos.y - pos.height;
			ul.style.top = _top -1 + 'px';
		}
	}

	if ((srcEl.fitType & Menu.FitHorizontal) != 0)
	{
		if (Menu.isIE7)
			Menu.ChangeClass(ul, "invisible", "visible");

		var pos = Menu.GetElementPosition(ul);

		var winSize = Menu.GetWindowSize();
		var winScroll = Menu.GetWindowScroll();

		var _left;

		_left = winScroll[0] + winSize[0] - pos.x;

		if (!Menu.isIE)
			_left -= pos.width;

		//DevAlert(_left);
		
		if (_left < 0)
			ul.style.left = _left - 1 + 'px';
	}

	if (Menu.isIE && !Menu.isIE7 && !window.opera && Menu.enableIFrame)
	{
		var z = 1;
		var parent = srcEl.offsetParent;
		var childFrame = parent.childFrame;
		
		if (!childFrame)
		{
			childFrame = document.createElement("iframe");
			childFrame.src = Menu.IframeBlankSrc;
			childFrame.style.position = "absolute";
			Menu.AddClass(childFrame, "invisible");

			childFrame.scrolling = "no";
			childFrame.frameBorder = "0";
			
			parent.childFrame = childFrame;
			
			if (parent.tagName.toLowerCase() == "html")
				document.body.appendChild(childFrame);
			else
				parent.appendChild(childFrame);
		}

		var pos = Menu.GetElementPosition(ul);
		var parentPos = Menu.GetElementPosition(parent);
		Menu.SetElementX(childFrame, pos.x - parentPos.x);
		Menu.SetElementY(childFrame, pos.y - parentPos.y);
		Menu.SetElementWidth(childFrame, pos.width);
		Menu.SetElementHeight(childFrame, pos.height);

		Menu.ChangeClass(childFrame, "invisible", "ieFrame");

		srcEl.style.zIndex = 1;
	}

	Menu.CancelEvent(evt);
}

Menu.GetElementPosition = function(element)
{
	var result = new Object();
	result.x = 0;
	result.y = 0;
	result.width = 0;
	result.height = 0;
	var str = "";
	
	if (element.offsetParent)
	{
		result.x = element.offsetLeft;
		result.y = element.offsetTop;
		var parent = element.offsetParent;
		while (parent)
		{
			result.x += parent.offsetLeft;
			result.y += parent.offsetTop;
			str += parent.tagName + ": left=" + parent.offsetLeft  + "; ";
			var parentTagName = parent.tagName.toLowerCase();
			
			if (parentTagName != "table" &&
				parentTagName != "body" && 
				parentTagName != "html" && 
				parentTagName != "div" && 
				parent.clientTop && 
				parent.clientLeft) 
			{
				result.x += parent.clientLeft;
				result.y += parent.clientTop;
			}
			parent = parent.offsetParent;
		}
	//alert(str);
	}
	else if (element.left && element.top)
	{
		result.x = element.left;
		result.y = element.top;
	}
	else
	{
		if (element.x)
			result.x = element.x;
		
		if (element.y)
			result.y = element.y;
	}

	if (element.offsetWidth && element.offsetHeight)
	{
		result.width = element.offsetWidth;
		result.height = element.offsetHeight;
	}
	else if (element.style && element.style.pixelWidth && element.style.pixelHeight)
	{
		result.width = element.style.pixelWidth;
		result.height = element.style.pixelHeight;
	}

	return result;
}

Menu.GetWindowSize = function()
{
	var myWidth = 0, myHeight = 0;
	if( typeof( window.innerWidth ) == 'number' )
	{
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	}
	else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	{
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	{
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return [ myWidth , myHeight ];
}

Menu.GetWindowScroll = function() {
	var scrOfX = 0, scrOfY = 0;
	if( typeof( window.pageYOffset ) == 'number' )
	{
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	}
	else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
	{
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	}
	else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
	{
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [ scrOfX, scrOfY ];
}