/**
 * $RCSfile: menu.js$
 * $Revision: 1.3 $
 * $Date: 2006/02/06 20:11:09 $
 * Dynamic menu based on ul elements using
 * 
 * @author Yuri Shanoilo, Volodymyr Snigur
 * @copyright  © 2004-2006, Yuri Shanoilo, Volodymyr Snigur. All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * 
 * Terms of using: Script using is possible if you leave all information above (copyright information). 
 */

var language = 'en';

//=====================================Menu Function=============================================
var menuTime;   	  // Timer identifier used to hide submenus
var hideSub = null;   // Menu item, for which submenu should be hidden
var closetype; 		  //If 'all' then all menus must be closed. Else only 1 menu will be closed


/* check if obj is menu item or its contents (oblect if true, null if false) */
function isMenuItem(obj) {
	if (!obj) {
		return false;
	}
	
	//Is needed for Safari - because in Safari text in <a> is also mouse overed but it does not have
	//tagName - therefore this function do not work in some cases
	if (!obj.tagName) {
		obj = (obj.parentElement) ? obj.parentElement : obj.parentNode;
	}
	
    while (obj && (obj != document) && (obj.tagName.toLowerCase() != "ul")) {
        if (obj.tagName.toLowerCase() == "li") return obj;
        obj = (obj.parentElement) ? obj.parentElement : obj.parentNode;
    }
    return false;
}

/* handling multiple styles applied to an element */
function addStyle(obj, class_name) {
    var cn = obj.className;
    var re = new RegExp("(^| )" + class_name + "($| )");
    var re1 = new RegExp("(^| )"  + "*cust" + class_name + "($| )");
    var re2 = new RegExp("cust");
    if (cn.search(re) != -1) return false;
    if (cn.search(re1) != -1) return false;
    if ((cn.search(re2) != -1) && ((class_name == "sub") || (class_name == "sub over"))) {
		cn = cn.replace(re2, "cust" + class_name);
	} else {
	    if (cn != "" && cn.charAt(cn.length - 1) != " ") cn += " ";
	    cn += class_name;
	}
    obj.className = cn;
}
function removeStyle(obj, class_name) {

    if (!obj) return;
    var re = new RegExp(" " + class_name + " ");
    var re1 = new RegExp("(^" + class_name + " )|( " + class_name + "$)|(^"
                           + class_name + "$)");
    var re2 = new RegExp("cust" + class_name + "($| )");
    if ( closetype == 'all' )
    {
	    while (obj && (obj != document) && (obj.className != "menu") && (obj.className != "menu1")) {
        	if (obj.tagName.toLowerCase() == "li")
		{
		    var cn = obj.className;
		    cn = cn.replace(re, " ");
		    cn = cn.replace(re1, "");
		    cn = cn.replace(re2, "cust");
		    obj.className = cn;
		}

	        obj = (obj.parentElement) ? obj.parentElement : obj.parentNode;
	    }
	hideSub = null;
    }
    else
    {
	    var cn = obj.className;
	    cn = cn.replace(re, " ");
	    cn = cn.replace(re1, "");
	    cn = cn.replace(re2, "cust");
	    obj.className = cn;
    }
}

function parentUL(obj) {
	parentul = ((obj.parentElement) ? obj.parentElement : obj.parentNode);
	return parentul;
}

function parentLI(obj) {
	parentul = ((obj.parentElement) ? obj.parentElement : obj.parentNode);
	if ((parentul.className == "menu") || (parentul.className == "menu1")) return null;
	parentli = ((parentul.parentElement) ? parentul.parentElement : parentul.parentNode);
	return parentli;
}

function doubleParentUL(obj) {
	parentul = ((obj.parentElement) ? obj.parentElement : obj.parentNode);
	if ((parentul.className == "menu") || (parentul.className == "menu1")) return null;
	doubleparentul = ((parentul.parentElement) ? parentul.parentElement.parentElement : parentul.parentNode.parentNode);
	return doubleparentul;
}

function handleMouseOver(e) {
    var el = (e) ? e.target : event.srcElement;
    var menuitem = isMenuItem(el);
    if (menuitem) {

    //All needed for future work elements variables
	var vParentUL = null;
	var vParentLI = null;
	var vDoubleParentUL = null;
	var vHideParentUL = null;
	var vHideParentLI = null;
	var vHideDoubleParentUL = null;

	vParentUL = parentUL(menuitem);
	vParentLI = parentLI(menuitem);
	vDoubleParentUL = doubleParentUL(menuitem);

	//hideSub is menu item which was
	if (hideSub != null)
	{
		vHideParentUL = parentUL(hideSub);
		vHideParentLI = parentLI(hideSub);
		vHideDoubleParentUL = doubleParentUL(hideSub);
	}
	//If mouse were moved to the same menu element (so mouse out and mouse over is for same menu element - for example mouse out from a and mouse over to li)
	if (menuitem == hideSub)
	{
		clearTimeout(menuTime);
		addStyle(menuitem, "over");
		hideSub = menuitem;
	}
	//If there were no overed menu
	else if (hideSub == null)
	{
		addStyle(menuitem, "sub over");
	}
	//if Out and Over menu items are childs of the same UL
	else if (vParentUL == vHideParentUL)
	{
		clearTimeout(menuTime);
		closetype = 'current';
		removeStyle(hideSub, "sub");
		addStyle(menuitem, "sub over");
		hideSub = menuitem;
	}
	//If out menu item is parent of over menu item
	else if ((vParentLI != null) && (vParentLI == hideSub))
	{
		clearTimeout(menuTime);
		addStyle(menuitem, "sub over");
		hideSub = menuitem;
	}
	//If mouse out menu item was child of mouse overed menu item
	else if ((vHideParentLI != null) && (vHideParentLI == menuitem))
	{
		clearTimeout(menuTime);
		closetype = 'current';
		removeStyle(hideSub, "sub");
		addStyle(menuitem, "over");
		hideSub = menuitem;
	}
	//If out item is second level item and mouse is moved to some first level item
	else if ((vHideDoubleParentUL != null) && (vHideDoubleParentUL == vParentUL))
	{
		clearTimeout(menuTime);
		closetype = 'current';
		removeStyle(hideSub, "sub");
		removeStyle(vHideParentLI, "sub");
		addStyle(menuitem, "sub over");
		hideSub = menuitem;
	}
	else
	{
		clearTimeout(menuTime);
		closetype = 'all';
		removeStyle(hideSub, "sub");
	}	


    }
}

function handleMouseOut(e) {
    var el = (e) ? e.target : event.srcElement;
    var toel = (e) ? e.relatedTarget : event.toElement;
    var menuitem = isMenuItem(el);
    if (menuitem && (menuitem != isMenuItem(toel))) {
        removeStyle(menuitem, "over");
        hideSub = menuitem;
	closetype = 'all';
        menuTime = setTimeout('removeStyle(hideSub, "sub")', 400);
    }
}

function handleClick(e) {
    var el = (e) ? e.target : event.srcElement;
    var menuitem = isMenuItem(el);
    if (menuitem && el.tagName.toLowerCase() != "a") {
		neededA = menuitem.getElementsByTagName("a");
		if ( neededA.length != 0 ) {
			neededLink = neededA[0].getAttribute('href',2);
			neededLocation = neededA[0].getAttribute('target',2);
			if (neededLocation && neededLocation == "_blank")
			{
				window.open(neededLink,"","");
			} else {
				location.assign(neededLink);
			}
		}
	}
}

function handleLoad() {
   
    
    // This overcomes event-handling bug in menuitems in Mozilla
    if (navigator.appName.indexOf('Netscape') != -1) {
        var re = new RegExp("(^| )menu($| )");
        var re1 = new RegExp("(^| )menu1($| )");
        var menus = document.getElementsByTagName("ul");
        var mozMenuItem;
        
        for (var i = 0; i < menus.length; i++) {
            if ((menus[i].className.search(re) != -1) || (menus[i].className.search(re1) != -1)) {
                var menuItems = document.getElementsByTagName("li");
                for (var k = 0; k < menuItems.length; k++) {
                    mozMenuItem = document.createElement("div");
                    mozMenuItem.className = "moz";
                    menuItems[k].appendChild(mozMenuItem);
                }
            }
        }
    }
}


document.onmouseover = handleMouseOver;
document.onmouseout = handleMouseOut;
document.onclick = handleClick;
window.onload = handleLoad;
//window.onerror=errorTrap;