var timeouts = {},
    uid = 1,
    parents = {};

function uuid()
{
    return new Date().toString() + uid++;
}

function overState(img)
{
    if(typeof img == 'function') return false;
	url = img.oSrc;
	//console.log(url);
	if(typeof url != 'string') url = img.src;
	//console.log(url);
	if(typeof url != 'string') return '';
	
	if(url != null)
	{
		var aUrl = url.split('.'),
			namePartIndex = aUrl.length - 2,
			suffix = '-over';
			
		if(namePartIndex < 0) return url;
		aUrl[namePartIndex] += suffix;
		return aUrl.join('.').split('-over-over').join('-over');
	}
	return '';
}	

function offState(img)
{
    try
    {
    	return img.src.split('-over').join('');
    }
    catch(e)
    {
        return '';
    }
}	
	
function menuInit(menu, parent, parentImage)
{ 

    menu.inited = true;
    var menuImages = getElementsFromListFlat(menu, 'img'),  
		menuImage,
		aPreload = [],
		i;

	for(i in menuImages)
	{
        menuImage = menuImages[i];
        var ul = getContainingList(menuImage);
        if(menuImage.parentNode && (menuImage.parentNode.nodeName.toLowerCase() == 'a')) 
        {
            if(menuImage.src.indexOf(thisPage) > -1  || (menuImage.oSrc && (menuImage.oSrc.indexOf(thisPage) > -1)))
            {
                if(!menuImage.id) menuImage.id = uuid();
                menuImage.src = overState(menuImage);
                var a = menuImage.parentNode;
                var li = a.parentNode;
                li.removeChild(a);
                li.appendChild(menuImage);
            }
            else
            {
                addEvent(menuImage, 'mouseover', makeHandler(overState(menuImage)));
                if(ul) addEvent(menuImage, 'mouseover', makeCancelHideFunc(ul));
                addEvent(menuImage, 'mouseout', makeHandler(offState(menuImage)));
                if(ul) addEvent(menuImage, 'mouseout', makeDelayedHideFunc(ul, 50, parentImage));
                if(parent) addEvent(menuImage, 'mouseout', makeDelayedHideFunc(parent, 50, parentImage));
                if(parentImage)
                {
                    addEvent(menuImage, 'mouseover', makeHighlightTree(parentImage));
                    addEvent(menuImage, 'mouseout', makeUnHighlightTree(parentImage));
                }
                arrPush(aPreload, overState(menuImage));
            }
            doSubMenu(menuImage, menu);
        }    
	}
    MM_preloadImages(aPreload.join(', '));
}

function makeHighlightTree(parentImage)
{
    return  function() 
    { 
        makeHandler(overState(parentImage)).call(parentImage); 
    }
}

function makeUnHighlightTree(parentImage)
{
    return  function() { 
        makeHandler(offState(parentImage)).call(parentImage); 
    };
}

function getContainingList(elem)
{
    while(elem.parentNode)
    {
        elem = elem.parentNode;
        if(elem.nodeName.toLowerCase() == 'ul') return elem;
    }
    return false;
}

function containerIsSubmenu(elem)
{
    var c = getContainingList(elem);
    if(c.className) return c.className.indexOf('submenu') > -1;
    return false;
}

function getElementsFromListFlat(list, tagName)
{
    var l = list.firstChild,
        r = [];
    while(l)
    {
        if(l.nodeName.toLowerCase() == tagName.toLowerCase())
        {
            arrPush(r,l);
        }
        if(l.nodeName.toLowerCase() != 'ul' && l.childNodes.length > 0) 
        {
            var childs = getElementsFromListFlat(l, tagName);
            for(var i in childs) arrPush(r, childs[i]);
        }
        l = l.nextSibling;
    }
    return r;
}

function doSubMenu(menuImage, parent)
{
    var li;
    if(menuImage.parentNode && (li = menuImage.parentNode.parentNode))
    {
        var exit = false,
            elem = li.firstChild;
        while(!exit && elem)
        {
            if(elem.nodeName.toLowerCase() == 'ul' && !elem.inited)
            {
                elem.parentNode.removeChild(elem);
                document.body.appendChild(elem);

                //set class and grab this submenu
                elem.className = 'submenu';
                elem.id = uuid();
                elem.parentImage = menuImage;
                if(parent) parents[elem.id] = parent;
                // attach submenu show/hide to image...
                var over = makeShowFunc(elem, menuImage, !containerIsSubmenu(menuImage)),
                    out = makeDelayedHideFunc(elem, 50, menuImage);
                addEvent(menuImage, 'mouseover', over);
                addEvent(menuImage, 'mouseout', out);
                menuInit(elem, parent, menuImage);
                exit = true;
            }
            elem = elem.nextSibling;
        }
    }
}

function makeShowFunc(elem, menuImage, firstLevel)
{
    return function()
    {
        hideSubMenus(elem);
        cancelHideUpTree(menuImage.subMenu);
        elem.style.position = 'absolute';
        elem.style.margin = '0';
        elem.style.padding = '0';
        if(firstLevel)
        {
            elem.style.left = (findPosX(menuImage)) + 'px';
            elem.style.top = (findPosY(menuImage) + menuImage.height) + 'px';
        }
        else
        {
            elem.style.left = (findPosX(menuImage) + menuImage.width) + 'px';
            elem.style.top = (findPosY(menuImage)) + 'px';
        }        
        elem.style.visibility = 'visible';
        elem.style.display = 'block'
        //hide other menus AT THIS LEVEL:
        hideMenusAtThisLevel(elem)
        makeDelayedHideFunc(elem, 5000, menuImage)();

    }
}

function hideSubMenus(elem)
{
    var uls = elem.getElementsByTagName('ul');
    for(var i in uls)
    {
        if(uls[i].className && uls[i].className.indexOf('submenu') > -1)
        {
            (makeHideFunc(uls[i]))();
        }
    }
}

function makeHideFunc(elem, parentImage)
{
    return function()
    {
        if(elem.id != 'nav')
        {
            elem.style.top = '-2000px';
            elem.style.left = '-2000px';
            elem.style.visibility = 'hidden';
            //console.log(offState(parentImage));
            if(parentImage) makeHandler(offState(parentImage)).call(parentImage);
        }
    }
}

function makeDelayedHideFunc(elem, delay, parentImage)
{
    return function()
    {
        //cancelHideUpTree(elem);
        clearTimeout(timeouts[elem.id]);
        timeouts[elem.id] = setTimeout( makeHideFunc(elem, parentImage), delay);
    }
}

function makeCancelHideFunc(elem)
{
    return function()
    {
        cancelHideUpTree(elem);
    }
}

function cancelHideUpTree(elem)
{
    while(elem)
    {
        clearTimeout(timeouts[elem.id]);
        elem = parents[elem.id];
    }
}

function parentMenu(elem)
{
    return false;
}

function makeHandler(state)
{
	return function(){ this.src = state; };
}

function hideMenusAtThisLevel(elem)
{
    var li = elem.parentNode.parentNode.firstChild;      //first li?
    while(li)
    {
        var c = li.firstChild;
        while(c)
        {
            if(c.nodeName.toLowerCase() == 'ul')
            {
                if(c.className.indexOf('submenu') !== false)
                {
                    if(c.innerHTML != elem.innerHTML)
                    {
                        //(makeHideFunc(c))();
                    }
                }
            }
            c = c.nextSibling;
        }
        li = li.nextSibling;
    }
}

function MM_preloadImages(imglist)
{
    var im = new Image();
    imglist = imglist.split(', ');
    for(var i in imglist)
    {
        im.src = imglist[i];
    }
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

var notWhitespace = /\S/

function clean_whitespace(node) 
{
	for (var x = 0; x < node.childNodes.length; x++) 
	{
		var childNode = node.childNodes[x];
		if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) 
		{
			// that is, if it's a whitespace text node
			node.removeChild(node.childNodes[x]);
			x--;
		}
		if (childNode.nodeType == 1) 
		{
			// elements can have text child nodes of their own
			clean_whitespace(childNode)
		}
	}
}


if (typeof console == 'undefined') {
// Try to be compatible with other browsers
// Only use firebug logging when available
console = new Object;
console.trace = function() {};
console.log = function() {};
console.debug = function() {};
console.info = function() {};
console.warn = function() {};
console.error = function() {};
console.time = function() {};
console.timeEnd = function() {};
console.count = function() {};
}

function arrPush(arr, item)
{
    if(arr.push)
    {
        arr.push(item);
    }
    else
    {
        arr[arr.length] = item;
    }
}
//http://www.codingforums.com/showthread.php?t=56369
//TOUCHY AS FUCK
//function domReady(){this.n=typeof this.n=='undefined'?0:this.n+1;if(typeof document.getElementsByTagName!='undefined'&&(document.getElementsByTagName('body')[0]!=null||document.body!=null))
//{
//	var n = document.getElementById('nav');
//    clean_whitespace(n);
//    menuInit(n); 
//    n.style.visibility = 'visible';
//}
//else if(this.n<60){setTimeout('domReady()',250);}};domReady();


//LET'S TAKE IT BACK
//****OLD SCHOOL****
//LET'S TAKE IT BACK
//****OLD SCHOOL****
//LET'S TAKE IT BACK
//****OLD SCHOOL****
//LET'S TAKE IT BACK
//TO THE OLD SCHOOL*

addEvent(window, 'load', function() { 
var n = document.getElementById('nav');
    clean_whitespace(n);
    menuInit(n); 
    n.style.visibility = 'visible';
} );

