var spmmenu_usepopups = true;
var spmmenu_registered = new Array();
var spmmenu_initialized = new Array();
var spmmenu_activemenus = new Array();
var spmmenu_currentactive = false;
var slidetimer = false;
var spmmenu_opensteps = 18;
var spmmenu_doslide = true;
var spmmenu_dofade = false; // can be very slow
var spmmenu_datefields = new Array();

// #############################################################################
// another function to handle the different event models of different browsers
// and prevent event bubbling in a lesser way
function e_by_gum(eventobj)
{
        if (!eventobj || is_ie)
        {
                window.event.cancelBubble = true;
                return window.event;
        }
        else
        {
                if (eventobj.target.type == 'submit')
                {
                        // naughty safari
                        eventobj.target.form.submit();
                }
                eventobj.stopPropagation();
                return eventobj;
        }
}

// #############################################################################
// get left position of elm
function fetch_object_posleft(elm)
{
        var left = elm.offsetLeft;
        while((elm = elm.offsetParent) != null)
        {
                left += elm.offsetLeft;
        }
        return left;
}

// #############################################################################
// get top position of elm
function fetch_object_postop(elm)
{
        var top = elm.offsetTop;
        while((elm = elm.offsetParent) != null)
        {
                top += elm.offsetTop;
        }
        return top;
}

// #############################################################################
function spmmenu_doregister(controlid, nowrite, datefield)
{
        if (document.getElementsByTagName)
        {
                controlobj = fetch_object(controlid);
                if (controlobj)
                {
                        if (datefield)
                        {
                                spmmenu_datefields[controlid] = datefield;
                        }

                        spmmenu_registered[spmmenu_registered.length] = controlid;

                        if (!nowrite)
                        {
                        }
                        return true;
                }
        }

        return false;
}

// #############################################################################
// function to get the menu basename - 'menu.104' returns 'menu', 'x.menu' returns 'x'
function spmmenu_getmenuid(controlid)
{
        dotpos = controlid.indexOf(".");
        if (dotpos != -1)
        {
                return controlid.substr(0, dotpos);
        }
        else
        {
                return controlid;
        }
}

// #############################################################################
// handle menu control mouseover events
function spmmenu_eventhandler_mouseover(e)
{
        e = do_an_e(e);
        spmmenu_hover(this);
}

// #############################################################################
// handle menu control click events
function spmmenu_eventhandler_click(e)
{
        e = do_an_e(e);
        spmmenu_open(this);
}

// #############################################################################
// close all open menus
function spmmenu_close()
{
        if (spmmenu_currentactive)
        {
                for (key in spmmenu_activemenus)
                {
                        fetch_object(spmmenu_getmenuid(key) + "_menu").style.display = "none";
                        spmmenu_activemenus[key] = false;
                }
        }
        spmmenu_currentactive = false;

        if (slidetimer)
        {
                clearTimeout(slidetimer);
                slidetimer = false;
        }

        if (is_ie)
        {
                selects = document.getElementsByTagName("select");
                for (var i = 0; i < selects.length; i++)
                {
                        selects[i].style.visibility = "visible";
                }
        }
}

// #############################################################################
// open menu under pointer if another menu is active
function spmmenu_hover(elm)
{
        for (key in spmmenu_activemenus)
        {
                if (spmmenu_activemenus[key] == true && key != elm.id)
                {
                        spmmenu_open(elm);
                        return;
                }
        }
}

// #############################################################################
// detect if selectobj overlaps m
function spmmenu_overlap(selectobj, m)
{
        s = new Array();
        s['L'] = fetch_object_posleft(selectobj);
        s['T'] = fetch_object_postop(selectobj);
        s['R'] = s['L'] + selectobj.offsetWidth;
        s['B'] = s['T'] + selectobj.offsetHeight;

        if (s['L'] >= m['L'] && s['L'] <= m['R'] && ((s['T'] >= m['T'] && s['T'] <= m['B']) || (s['B'] >= m['T'] && s['B'] <= m['B']))) { return true; }
        else if (s['R'] >= m['L'] && s['R'] <= m['R'] && ((s['T'] >= m['T'] && s['T'] <= m['B']) || (s['B'] >= m['T'] && s['B'] <= m['B']))) { return true; }
        else if (s['B'] >= m['T'] && s['T'] <= m['B'] && ((s['L'] >= m['L'] && s['L'] <= m['R']) || (s['R'] >= m['R'] && s['R'] <= m['R']))) { return true; }
        else if (m['B'] >= s['T'] && m['T'] <= s['B'] && ((m['L'] >= s['L'] && m['L'] <= s['R']) || (m['R'] >= s['R'] && m['R'] <= s['R']))) { return true; }
        else { return false; }
}

// #############################################################################
// open the clicked menu
function spmmenu_open(elm)
{
        openmenu = spmmenu_currentactive;

        spmmenu_close();

        if (openmenu == elm.id)
        {
                // clicked element was the control for the currently open menu - exit
                return false;
        }

        // get the id of the menu to be opened
        menuid = spmmenu_getmenuid(elm.id) + "_menu";
        menuobj = fetch_object(menuid);

        if (spmmenu_datefields[elm.id])
        {
                force_right_slide = true;
                fetch_object(elm.id + "_output").innerHTML = fetch_object(spmmenu_datefields[elm.id]).value;
        }
        else
        {
                force_right_slide = false
        }

        spmmenu_activemenus[elm.id] = true;
        spmmenu_currentactive = elm.id;

        // get menu position
        leftpx = fetch_object_posleft(elm);
        toppx = fetch_object_postop(elm) + elm.offsetHeight;

        // un-hide menu
        menuobj.style.display = "";

        // attempt to keep menu on screen
        if (force_right_slide || (leftpx + menuobj.offsetWidth) >= document.body.clientWidth)
        {
                leftpx = leftpx + elm.offsetWidth - menuobj.offsetWidth;
                slidedir = "right";
        }
        else
        {
                slidedir = "left";
        }


        // shuffle the IE menus a bit
        if (is_ie)
        {
                leftpx += (slidedir == "left") ? -2 : 2;
        }

        // set menu position
        menuobj.style.left = leftpx + "px";
        menuobj.style.top = toppx + "px";

        if (is_ie)
        {
                menuarea = {
                        "L" : leftpx,
                        "T" : toppx,
                        "R" : leftpx + menuobj.offsetWidth,
                        "B" : toppx + menuobj.offsetHeight
                };
                selects = document.getElementsByTagName("select");
                for (var i = 0; i < selects.length; i++)
                {
                        if (spmmenu_overlap(selects[i], menuarea))
                        {
                                selects[i].style.visibility = "hidden";
                        }
                }
        }

        // slide menus open (internet explorer only)
        if (spmmenu_doslide && !is_opera && !is_ie4)
        {
                if (spmmenu_dofade && is_ie)
                {
                        menuobj.filters.item('DXImageTransform.Microsoft.alpha').opacity = 0;
                }

                intervalX = Math.ceil(menuobj.offsetWidth / spmmenu_opensteps);
                intervalY = Math.ceil(menuobj.offsetHeight / spmmenu_opensteps);

                if (slidedir == "left")
                {
                        menuobj.style.clip = "rect(auto, 0px, 0px, auto)";
                        spmmenu_slide_left(menuid, intervalX, intervalY, 0, 0, 0);
                }
                else
                {
                        menuobj.style.clip = "rect(auto, auto, 0px, " + (menuobj.offsetWidth) + "px)";
                        spmmenu_slide_right(menuid, intervalX, intervalY, menuobj.offsetWidth, 0, 0);
                }
        }

        return false;
}

// #############################################################################
// internet explorer slide menu open left
function spmmenu_slide_left(menuid, intervalX, intervalY, clipX, clipY, opacity)
{
        menuobj = fetch_object(menuid);

        if (clipX < menuobj.offsetWidth || clipY < menuobj.offsetHeight)
        {
                if (spmmenu_dofade && is_ie)
                {
                        opacity += 10;
                        menuobj.filters.item('DXImageTransform.Microsoft.alpha').opacity = opacity;
                }
                clipX += intervalX;
                clipY += intervalY;
                menuobj.style.clip = "rect(auto, " + clipX + "px, " + clipY + "px, auto)";
                slidetimer = setTimeout("spmmenu_slide_left('" + menuid + "', " + intervalX + ", " + intervalY + ", " + clipX + ", " + clipY + ", " + opacity + ");", 0);
        }
        else
        {
                clearTimeout(slidetimer);
        }
}

// #############################################################################
// internet explorer slide menu open right
function spmmenu_slide_right(menuid, intervalX, intervalY, clipX, clipY, opacity)
{
        menuobj = fetch_object(menuid);

        if (clipX > 0 || clipY < menuobj.offsetHeight)
        {
                if (spmmenu_dofade && is_ie)
                {
                        opacity += 10;
                        menuobj.filters.item('DXImageTransform.Microsoft.alpha').opacity = opacity;
                }
                clipX -= intervalX;
                clipY += intervalY;
                menuobj.style.clip = "rect(auto, " + menuobj.offsetWidth + "px, " + clipY + "px, " + clipX + "px)";
                slidetimer = setTimeout("spmmenu_slide_right('" + menuid + "', " + intervalX + ", " + intervalY + ", " + clipX + ", " + clipY + ", " + opacity + ");", 0);
        }
        else
        {
                clearTimeout(slidetimer);
        }
}

// #############################################################################
// function to navigate to the href of the first found <a> tag
function spmmenu_navtolink(e)
{
        childLinks = this.getElementsByTagName("a");
        if (childLinks[0])
        {
                if (is_ie)
                {
                        // use this in IE to send HTTP_REFERER
                        childLinks[0].click();
                        window.event.cancelBubble = true;
                }
                else
                {
                        // other browsers can use this
                        if (e.shiftKey)
                        {
                                window.open(childLinks[0].href);
                                e.stopPropagation();
                                e.preventDefault();
                                return false;
                        }
                        else
                        {
                                window.location = childLinks[0].href;
                                e.stopPropagation();
                                e.preventDefault();
                                return false;
                        }
                }
        }
}

// #############################################################################
// function to toggle the background class of a menu option
function spmmenu_switch_option_bg(e)
{
        this.className = (this.className == "spmmenu_option") ? "spmmenu_hilite" : "spmmenu_option";
        spmmenu_hand_pointer(this);
}

// #############################################################################
// function to set the cursor to be pointer/hand
function spmmenu_hand_pointer(obj)
{
        try
        {
                obj.style.cursor = "pointer";
        }
        catch(e)
        {
                obj.style.cursor = "hand";
        }
}

// #############################################################################
// function to initialize a single menu entry
function spmmenu_init(controlid)
{
        menuid = spmmenu_getmenuid(controlid) + "_menu";
        menuobj = fetch_object(menuid);

        if (document.getElementsByTagName && menuobj)
        {
                // do control object
                controlobj = fetch_object(controlid);
                spmmenu_hand_pointer(controlobj);
                controlobj.unselectable = true;
                controlobj.onclick = spmmenu_eventhandler_click;
                controlobj.onmouseover = spmmenu_eventhandler_mouseover;

                // don't initialize the same popup menu twice
                if (spmmenu_initialized[menuid])
                {
                        return;
                }

                // do popup menu object
                popupobj = fetch_object(menuid);
                popupobj.style.display = "none";
                popupobj.style.position = "absolute";
                popupobj.style.left = "0px";
                popupobj.style.top = "0px";
                popupobj.onclick = e_by_gum;

                // reset inner table width
                tables = popupobj.getElementsByTagName("table");
                if (tables.length > 0)
                {
                        tables[0].width = "";
                }

                // init popup filters (ie only)
                if (is_ie)
                {
                        popupobj.style.filter += "progid:DXImageTransform.Microsoft.alpha(enabled=1,opacity=100)";
                        popupobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#606060,strength=3)";
                }

                // do menu options
                tds = popupobj.getElementsByTagName("td");
                for (var i = 0; i < tds.length; i++)
                {
                        if (tds[i].className == "spmmenu_option")
                        {
                                tds[i].style.cursor = "default";
                                if (tds[i].title == "nohilite")
                                {
                                        tds[i].title = "";
                                }
                                else
                                {
                                        tds[i].onmouseover = spmmenu_switch_option_bg;
                                        tds[i].onmouseout = spmmenu_switch_option_bg;
                                        tds[i].onclick = spmmenu_navtolink;

                                       // prevent links from executing twice
                                       /*if (is_moz)
                                        {
                                                try
                                                {
                                                        links = tds[i].getElementsByTagName("a");
                                                        for (var j = 0; j < links.length; j++)
                                                        {
                                                                links[j].onclick = returnfalse;
                                                        }
                                                }
                                                catch(e)
                                                {
                                                        // nuffink
                                                }
                                        }*/
                                        if (!is_saf && !is_kon)
                                        {
                                                try
                                                {
                                                        links = tds[i].getElementsByTagName("a");
                                                        for (var j = 0; j < links.length; j++)
                                                        {
                                                                if (!links[j].onclick)
                                                                {
                                                                        links[j].onclick = e_by_gum;
                                                                }
                                                        }
                                                }
                                                catch(e)
                                                {
                                                        // hmm
                                                }
                                        }
                                }
                        }
                }

                spmmenu_initialized[menuid] = true;
        }
}

function returnfalse()
{
        return false;
}