﻿/* Slide menu */
/* Copyright (c) 2010 FoXSE Ltd */

var MENU_MODE_HIDDEN = 0;
var MENU_MODE_VISIBLE = 1;

var SLIDE_PANEL_GLOBAL_ZINDEX = 1000;
var SLIDE_PANEL_GLOBAL_OPEN = new Array();

var SLIDE_MENU_HIDE_NORMAL = 1000;
var SLIDE_MENU_HIDE_NORMAL_IPHONE = 3000;

var SLIDE_MENU_HIDE_CLEANUP = 2000;
var SLIDE_MENU_HIDE_CLEANUP_IPHONE = 4000;

var SLIDE_MENU_ROLL_AMOUNT_PX = 10;

var IPHONE_WIDTH_ADJUST = 5;

function menuTitleMouseIn(panelId, menuPanelHeight) {
    try {
        var panelObj = document.getElementById(panelId);
        var mo = panelObj.menu;
        
        if (!mo) {
            mo = new menuObj();
            mo.panelId = panelId;
            mo.mode = MENU_MODE_HIDDEN;
            mo.takesInput = true;
            mo.mouseIn = true;
            mo.menuPanelHeight = menuPanelHeight;
            
            panelObj.menu = mo;
        }
        
        if (mo.takesInput && mo.mode == MENU_MODE_HIDDEN) {
            mo.takesInput = false;
            panelObj.menu = mo;
            
            /*
             * Set panel width.
             */
            var panelClientWidth;
            
            if (is_ie6) {
                //fixed width hack for IE6
                panelClientWidth = 100;
                
            } else if (is_iphone_mode) {
                //fixed and full width for iPhone
                panelClientWidth = getCurrentIphoneWidth() - IPHONE_WIDTH_ADJUST;
                panelObj.style.left = 0;
                
            } else {
                /*
                 * Explicitly set width to clientwidth, before we
                 * remove the panel's contents (or it will collapse
                 * to 0).
                 */
                panelClientWidth = panelObj.clientWidth;
            }
             
            if (panelClientWidth && panelClientWidth > 0) {
                panelObj.style.width = panelClientWidth + "px";
            }
            
            if (!mo.tempInnerHTML) {
                mo.tempInnerHTML = panelObj.innerHTML;
            }
            panelObj.innerHTML = "";
            
            //set z-index
            try {
                SLIDE_PANEL_GLOBAL_ZINDEX++;
                panelObj.style.zIndex = SLIDE_PANEL_GLOBAL_ZINDEX;
                
            } catch (exZindex) {
                wrapEx("error setting z-index for panelId: " + panelId, exZindex);
            }
            
            //hide open menus
            try {
                if (SLIDE_PANEL_GLOBAL_OPEN && SLIDE_PANEL_GLOBAL_OPEN.length > 0) {
                    for (i = SLIDE_PANEL_GLOBAL_OPEN.length - 1; i >= 0; i--) {
                        //take and pop last element of array
                        var openObj = SLIDE_PANEL_GLOBAL_OPEN[i];
                        
                        hideMenuNormal(openObj.id);
                    }
                    SLIDE_PANEL_GLOBAL_OPEN = new Array();
                }
                
            } catch (exHideExisting) {
                wrapEx("error hiding existing menus for panelId: " + panelId, exHideExisting);
            }
            
            //add to global list
            SLIDE_PANEL_GLOBAL_OPEN.push(panelObj);
            
            panelObj.style.visibility = "visible";
            rollObject(panelObj, 0, mo.menuPanelHeight, "menuShowDone(\"" + panelId + "\")", "+", SLIDE_MENU_ROLL_AMOUNT_PX);
            
            // start cleanup timer
            if (mo.cleanupTimer) {
                clearTimeout(mo.cleanupTimer);
            }
            mo.cleanupTimer = setTimeout("hideMenuCleanup(\"" + panelObj.id + "\")", getSlideMenuHideCleanup());
        }
        
    } catch (ex) {
        wrapEx("error in menuTitleMouseIn, panelId:" + panelId + ", menuPanelHeight:" + menuPanelHeight, ex);
    }
}

function menuTitleMouseOut(panelId) {
    try {
        var panelObj = document.getElementById(panelId);
        
        var mo = panelObj.menu;
        
        if (mo) {
            mo.mouseIn = false;
            panelObj.menu = mo;
        }
        
    } catch (ex) {
        wrapEx("error in menuTitleMouseOut, panelId:" + panelId, ex);
    }
}

function hideMenuNormal(panelId) {
    try {
        var panelObj = document.getElementById(panelId);
        var mo = panelObj.menu;
        
        if (mo && !mo.mouseIn) {
            hideMenu(panelId);
        }
    
    } catch (ex) {
        wrapEx("error in hideMenuNormal, panelId:" + panelId, ex);
    }
}

function hideMenuCleanup(panelId) {
    try {
        hideMenu(panelId);
    
    } catch (ex) {
        wrapEx("error in hideMenuCleanup, panelId:" + panelId, ex);
    }
}

function hideMenu(panelId) {
    try {
        var panelObj = document.getElementById(panelId);
        var mo = panelObj.menu;
        
        if (mo && mo.takesInput && mo.mode == MENU_MODE_VISIBLE) {
            if (!mo.tempInnerHTML) {
                mo.tempInnerHTML = panelObj.innerHTML;
            }
            panelObj.innerHTML = "";
            
            mo.takesInput = false;
            panelObj.menu = mo;
            
            rollObject(panelObj, mo.menuPanelHeight, 0, "menuHideDone(\"" + panelId + "\")", "-", SLIDE_MENU_ROLL_AMOUNT_PX);
       }
       
    } catch (ex) {
        wrapEx("error in hideMenu, panelId:" + panelId, ex);
    }
}

function menuShowDone(panelId) {
    try {
        var panelObj = document.getElementById(panelId);
        var mo = panelObj.menu;
        
        if (!panelObj.innerHTML) {
            panelObj.innerHTML = mo.tempInnerHTML;
        }
        mo.tempInnerHTML = null;
        
        mo.mode = MENU_MODE_VISIBLE;
        mo.takesInput = true;
        
        panelObj.menu = mo;
        
    } catch (ex) {
        wrapEx("error in menuShowDone, panelId:" + panelId, ex);
    }
}

function menuHideDone(panelId) {
    try {
        var panelObj = document.getElementById(panelId);
        var mo = panelObj.menu;
        
        mo.mode = MENU_MODE_HIDDEN;
        mo.takesInput = true;
        panelObj.menu = mo;

        panelObj.style.visibility = "hidden";

        if (is_iphone_mode) {
            //resize to prevent hidden div from expanding page width in landscape mode
            panelObj.style.width = (IPHONE_PORTRAIT_WIDTH - IPHONE_WIDTH_ADJUST) + "px";
        }
    
    } catch (ex) {
        wrapEx("error in menuHideDone, panelId:" + panelId, ex);
    }
}

function menuBodyMouseIn(panelObj) {
    try {
        var mo = panelObj.menu;
        
        if (mo && mo.mode == MENU_MODE_VISIBLE) {
            mo.mouseIn = true;
            
            if (mo.hideTimer) {
                clearTimeout(mo.hideTimer);
            }
            mo.hideTimer = setTimeout("hideMenuNormal(\"" + panelObj.id + "\")", getSlideMenuHideNormal);
            
            if (mo.cleanupTimer) {
                clearTimeout(mo.cleanupTimer);
            }
            mo.cleanupTimer = setTimeout("hideMenuCleanup(\"" + panelObj.id + "\")", getSlideMenuHideCleanup());
            
            panelObj.menu = mo;
        }
    
    } catch (ex) {
        wrapEx("error in menuBodyMouseIn, panelObj:" + panelObj, ex);
    }
}

function getSlideMenuHideNormal() {
    if (is_iphone_mode) {
        return SLIDE_MENU_HIDE_NORMAL_IPHONE;
    } else {
        return SLIDE_MENU_HIDE_NORMAL;
    }
}

function getSlideMenuHideCleanup() {
    if (is_iphone_mode) {
        return SLIDE_MENU_HIDE_CLEANUP_IPHONE;
    } else {
        return SLIDE_MENU_HIDE_CLEANUP;
    }
}

function menuBodyMouseOut(panelObj) {
    try {
        var mo = panelObj.menu;
        
        if (mo) {
            mo.mouseIn = false;
            panelObj.menu = mo;
        }
    
    } catch (ex) {
        wrapEx("error in menuBodyMouseOut, panelObj:" + panelObj, ex);
    }
}

function menuObj() {
    var panelId = null;
    var takesInput = null;
    var mode = null;
    var hideTimer = null;
    var cleanupTimer = null;
    var mouseIn = null;
    var tempInnerHTML = null;
    var menuPanelHeight = null;
}