function findPos(oObj) // Find absolute position of any DOM object.
{
    var curleft = curtop = 0;
    if (oObj.offsetParent)
    {
        do
        {
            curleft += oObj.offsetLeft;
            curtop += oObj.offsetTop;
        } while (oObj = oObj.offsetParent);

        return [curleft,curtop];
    }
    else return false;
}

function addLoadEvent(func) // Add new onLoad event safely without destroying any exisiting event
{
    var oldonload = window.onload;
    if (typeof window.onload != 'function')
    {
        window.onload = func;
    }
    else
    {
        window.onload = function()
        {
            oldonload();
            func();
        }
    }

}

function isArray(obj)  { return (obj.constructor.toString().indexOf("Array") == -1) ? false : true; }

function getElementsByClassName(className, tag, elm)
{
    if (document.getElementsByClassName)
    {
        getElementsByClassName = function (className, tag, elm)
        {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
                nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
                returnElements = [],
                current;
            for(var i=0, il=elements.length; i<il; i+=1)
            {
                current = elements[i];
                if(!nodeName || nodeName.test(current.nodeName))
                {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate)
    {
        getElementsByClassName = function (className, tag, elm)
        {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = "",
                xhtmlNamespace = "http://www.w3.org/1999/xhtml",
                namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
                returnElements = [],
                elements,
                node;
            for(var j=0, jl=classes.length; j<jl; j+=1)
            {
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try
            {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e)
            {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext()))
            {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else
    {
        getElementsByClassName = function (className, tag, elm)
        {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = [],
                elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                current,
                returnElements = [],
                match;
            for(var k=0, kl=classes.length; k<kl; k+=1)
            {
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1)
            {
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1)
                {
                    match = classesToCheck[m].test(current.className);
                    if (!match)
                    {
                        break;
                    }
                }
                if (match)
                {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
};


var maxMenuItems=0;
function initMenu()
{
    var menubar = document.getElementById('menubar');
    if(!menubar) return false;

    var subitemopen = '';

    var direction='horizontal';

    menubar.menudirection = direction;

    menus = getElementsByClassName("menuitem", "div", menubar);
    submenuitems = getElementsByClassName("submenuitem", "div", menubar);
    submenus = getElementsByClassName("submenu", "div", menubar);
    atats = getElementsByClassName("atatitem", "div", menubar);

    for(var i=0; i<submenuitems.length; i++)
    {
        var subitemopen = submenuitems[i].className.indexOf('selected')>-1 ? submenuitems[i].parentNode.id : subitemopen;
    }

    for(var i=0; i<submenus.length; i++)
    {
        var atatitemopen = submenus[i].className.indexOf('selected')>-1 ? submenus[i].parentNode.id : subitemopen;
    }


    for(var i=0; i<atats.length; i++)
    {
        atats[i].owidth=atats[i].offsetWidth;
        atats[i].oheight=atats[i].offsetHeight;

        if(direction=='horizontal')
        {
            if(atats[i].id != atatitemopen) atats[i].style.width='0px';
            else atats[i].style.width=atats[i].offsetWidth+'px';
        }
        else
        {
            if(atats[i].id != atatitemopen) atats[i].style.height='0px';
            else atats[i].style.height=atats[i].offsetHeight+'px';
        }
    }

    for(var i=0; i<submenus.length; i++)
    {
        submenus[i].owidth=submenus[i].offsetWidth;
        submenus[i].oheight=submenus[i].offsetHeight;

        var atatitemopen = submenus[i].className.indexOf('selected')>-1 ? submenus[i].parentNode.id : subitemopen;

        if(direction=='horizontal')
        {
            if(submenus[i].id != subitemopen) submenus[i].style.width='0px';
            else submenus[i].style.width=submenus[i].offsetWidth+'px';
        }
        else
        {
            if(submenus[i].id != subitemopen) submenus[i].style.height='0px';
            else submenus[i].style.height=submenus[i].offsetHeight+'px';

            var arrow = document.createElement('img');
            arrow.setAttribute('src', 'http://midlet-review.com/images/mr/arrow_down.png');
            arrow.setAttribute('alt', '+');

            var pn = document.getElementById('menuitem'+submenus[i].id.substr(7));
            pn.appendChild(arrow);
        }
    }


    for(var i=0; i<menus.length; i++)
    {
        if(document.getElementById('subitem'+menus[i].id.substring(8)))
        {
            menus[i].onclick = function(e) { showMenu(this, e); }
        }
    }

    as = menubar.getElementsByTagName('a');
    for(var i=0; i<as.length; i++)
    {

        if(as[i].href && as[i].href.indexOf('#')) var hash = as[i].href.substring(as[i].href.indexOf('#'));
        else var hash = 'false';

        if(hash.substring(0, 4) == '#@@:')
        {
            as[i].onclick = function(e) { showAtAt(this, e); }
        }
    }

}

function showMenu(that, e)
{
    var menubar = document.getElementById('menubar');
    var j=that.id.substr(8);

    var direction=menubar.menudirection;

    submenus = getElementsByClassName("submenu", "div", menubar);
    for(var i=0; i<submenus.length; i++)
    {
        if(submenus[i].id != 'subitem'+j)
        {
            if(direction=='horizontal') createSlide(submenus[i].id, submenus[i].style.width.substr(0, submenus[i].style.width.length-2), 0);
            else createSlide(submenus[i].id, submenus[i].style.height.substr(0, submenus[i].style.height.length-2), 0);
        }
    }

    atats = getElementsByClassName("atatitem", "div", menubar);
    for(var i=0; i<atats.length; i++)
    {
        if(direction=='horizontal') createSlide(atats[i].id, atats[i].style.width.substr(0, atats[i].style.width.length-2), 0);
        else createSlide(atats[i].id, atats[i].style.height.substr(0, atats[i].style.height.length-2), 0);
    }

    subitem = document.getElementById('subitem'+j);

    if(direction=='horizontal')
    {
        var from = parseFloat(subitem.style.width.substr(0, subitem.style.width.length-2));
        var to = subitem.owidth;
    }
    else
    {
        var from = parseFloat(subitem.style.height.substr(0, subitem.style.height.length-2));
        var to = subitem.oheight + 5;
    }

    if(from>=to) to=0;
    if(from!=to) createSlide(subitem.id, from, to);
}

function showAtAt(that, e)
{
    var menubar = document.getElementById('menubar');
    var j=that.href.substr(that.href.indexOf('#')+4);
    var direction=menubar.menudirection;

    atats = getElementsByClassName("atatitem", "div", menubar);
    for(var i=0; i<atats.length; i++)
    {
        if(direction=='horizontal') createSlide(atats[i].id, atats[i].style.width.substr(0, atats[i].style.width.length-2), 0);
        else createSlide(atats[i].id, atats[i].style.height.substr(0, atats[i].style.height.length-2), 0);
    }

    atatitem = document.getElementById(j);

    if(direction=='horizontal')
    {
        createSlide(j, parseFloat(atatitem.style.width.substr(0, atatitem.style.width.length-2)), atatitem.owidth);
    }
    else
    {
        createSlide(j, parseFloat(atatitem.style.height.substr(0, atatitem.style.height.length-2)), atatitem.oheight);
    }
}

function createSlide(objID, from, to)
{
    var numsteps = 20;
    var timeperstep = 30;

    var distance=to-from;
    var step = distance/numsteps;

    var direction=document.getElementById('menubar').menudirection;

    j=1;
    if(from<to) for(var i=from; i<(to+step); i+=step)
    {
        if(direction=='horizontal') setTimeout("setWidth('"+objID+"', "+i+", "+j+")", timeperstep*j);
        else setTimeout("setHeight('"+objID+"', "+i+", "+j+")", timeperstep*j);
        j++;
    }

    if(from>to)
    {
        if(step<0) step = 0-step;
        for(var i=from; i>(to-step); i-=step)
        {
            if(i<0) var ii=0; else var ii=i;
            if(direction=='horizontal') setTimeout("setWidth('"+objID+"', "+ii+", "+(numsteps-j)+")", timeperstep*j);
            else setTimeout("setHeight('"+objID+"', "+ii+", "+(numsteps-j)+")", timeperstep*j);
            j++;
        }
    }

    //setWidth(objID, to);
}

function setWidth(objID, width, j)
{
    var numsteps = 20;
    var step = 1/numsteps;

    document.getElementById(objID).style.width = width+'px';

    var submenuitems = getElementsByClassName("submenuitem", "div", document.getElementById(objID));
    for(var i=0; i<submenuitems.length; i++)
    {
        var opac = step*j;

        if(opac>1) opac = 1.00;
        if(opac<0) opac = 0;

        submenuitems[i].style.opacity = opac; /* firefox, opera, safari, chrome */
        submenuitems[i].style.filter = 'alpha(opacity='+(opac*100)+')'; /* IE */
    }
}

function setHeight(objID, height, j)
{
    var numsteps = 20;
    var step = 1/numsteps;

    document.getElementById(objID).style.height = height+'px';

    var submenuitems = getElementsByClassName("submenuitem", "div", document.getElementById(objID));
    for(var i=0; i<submenuitems.length; i++)
    {
        var opac = step*j;

        if(opac>1) opac = 1.00;
        if(opac<0) opac = 0;

        submenuitems[i].style.opacity = opac; /* firefox, opera, safari, chrome */
        submenuitems[i].style.filter = 'alpha(opacity='+(opac*100)+')'; /* IE */
    }
}

addLoadEvent(initMenu);

