    
    function isNestedToolbarShowing(buttonId) {
        var isShowing = false;
        var button = document.getElementById(buttonId);
        if (button) {
            var toolbarId = button.getAttribute("toolbar");
            if (toolbarId) {
                var nestedToolbar = document.getElementById(toolbarId);
                
                if (nestedToolbar && nestedToolbar.style.visibility == "visible") {
                    isShowing = true;
                }
            }
        }
        return isShowing;
    }
    
    var visibleNestedToolbarButtonId = "";
    function showNestedToolbar(buttonId) {
        if (isButtonEnabled(buttonId)) {
            hideCurrentNestedToolbar();
            
            var button = document.getElementById(buttonId);
            if (button) {
                var toolbarId = button.getAttribute("toolbar");
                if (toolbarId) {
                    var nestedToolbar = document.getElementById(toolbarId);
                    
                    if (nestedToolbar) {
                        var pos = findObjectPosition(button);        
                        if (pos) {
                            //setDropdownButtonPressed(buttonId);    
                            var mainBodyDiv = document.getElementById("mainBodyDiv");
                            var mainBodyPos;
                            if (mainBodyDiv) {
                                mainBodyPos = findObjectPosition(mainBodyDiv);
                            } else {
                                mainBodyPos = { x : 0, y : 0 };
                            }
                            //try positioning below first 
                            if ((pos.y + button.offsetHeight-1)+nestedToolbar.offsetHeight <= document.documentElement.clientHeight) {       
                                nestedToolbar.style.top = (pos.y + button.offsetHeight-1 - mainBodyPos.y) + "px";
                                nestedToolbar.style.left = (pos.x - mainBodyPos.x) + "px";
                            // else go above
                            } else {
                                nestedToolbar.style.top = (pos.y - nestedToolbar.offsetHeight+1 - mainBodyPos.y) + "px";
                                nestedToolbar.style.left = (pos.x - mainBodyPos.x) + "px";
                            }
                                                        
                            nestedToolbar.style.visibility = "visible";
                            visibleNestedToolbarButtonId = buttonId;
                        }
                    }
                }
            }
        }
    }

    function hideCurrentNestedToolbar() {
        if (visibleNestedToolbarButtonId != "") {
            var prevButtonId = visibleNestedToolbarButtonId;
            hideNestedToolbar(visibleNestedToolbarButtonId);
            synchronizeDropdownButton(prevButtonId, false);            
        }
    }

    function hideNestedToolbar(buttonId) {
        var button = document.getElementById(buttonId);
        if (button) {
            var toolbarId = button.getAttribute("toolbar");
            if (toolbarId) {
                var nestedToolbar = document.getElementById(toolbarId);
                
                if (nestedToolbar) {
                    nestedToolbar.style.visibility = 'hidden';
                    visibleNestedToolbarButtonId = "";
                    
                    // call any & all onDismiss events associated with the buttons on the toolbar that is about to hide
                    var buttonElements = nestedToolbar.getElementsByTagName("table");
                    
                    for (var i=0; i < buttonElements.length; i++) {
                        var nextElement = buttonElements[i];
                        var onDismissAction = nextElement.getAttribute("dismissAction");
                        if (onDismissAction) {
                            eval(onDismissAction);
                        }
                    }
                }
            }
        }        
    }

    function toggleNestedToolbar(buttonId) {
        if (!isNestedToolbarShowing(buttonId)) {
            showNestedToolbar(buttonId);
        } else {
            hideNestedToolbar(buttonId);
        }
    }

    function toggleDropdownButton(buttonId, isPressed, isMouseOver) {
        if (isPressed && !isNestedToolbarShowing(buttonId) && isButtonEnabled(buttonId)) {
            showNestedToolbar(buttonId);
        } else if (!isPressed) {
            hideNestedToolbar(buttonId);
        }

        synchronizeDropdownButton(buttonId, isMouseOver);
    }
    
    function setActionButtonDefault(buttonId) {
        if (isButtonEnabled(buttonId)) {
            if (!isNestedToolbarShowing(buttonId)) {
                var outerButton = document.getElementById(buttonId);
                outerButton.className = 'toolbarOuterButton';
            }
            var innerButton = document.getElementById(buttonId+"Action");
            innerButton.className = 'toolbarActionButton';    
        }
    }

    function setActionButtonLoaded(buttonId) {
        if (isButtonEnabled(buttonId)) {
            if (!isNestedToolbarShowing(buttonId)) {
                var outerButton = document.getElementById(buttonId);
                outerButton.className = 'toolbarOuterButtonLoaded';
            }
            var innerButton = document.getElementById(buttonId+"Action");
            innerButton.className = 'toolbarActionButtonLoaded';    
        } 
    }

    function setActionButtonPressed(buttonId) {
        if (isButtonEnabled(buttonId)) {
            var outerButton = document.getElementById(buttonId);
            outerButton.className = 'toolbarOuterButtonPressed';
            var innerButton = document.getElementById(buttonId+"Action");
            innerButton.className = 'toolbarActionButtonPressed';    
        }
    }

    function setDropdownButtonDefault(buttonId) {
        if (isButtonEnabled(buttonId)) {
            if (!isNestedToolbarShowing(buttonId)) {
                var outerButton = document.getElementById(buttonId);
                outerButton.className = 'toolbarOuterButton';
                var innerButton = document.getElementById(buttonId+"Dropdown");
                innerButton.className = 'toolbarDropdownButton';    
            }
        }
    }

    function synchronizeDropdownButton(buttonId, isMouseOver) {
        var innerButton = document.getElementById(buttonId+"Dropdown");
        if (innerButton) {
            if (!isNestedToolbarShowing(buttonId)) {
                innerButton.className = 'toolbarDropdownButton';    
            } else {
                innerButton.className = 'toolbarDropdownButtonPressed';    
            }
        }
        
        if (!isMouseOver) {
            var outerButton = document.getElementById(buttonId);
            if (outerButton) {
                if (!isNestedToolbarShowing(buttonId)) {
                    outerButton.className = 'toolbarOuterButton';    
                } else {
                    outerButton.className = 'toolbarOuterButtonPressed';    
                }
            }
        }
    }

    function setDropdownButtonLoaded(buttonId) {
        if (isButtonEnabled(buttonId)) {
            if (!isNestedToolbarShowing(buttonId)) {
                var outerButton = document.getElementById(buttonId);
                outerButton.className = 'toolbarOuterButtonLoaded';
                var innerButton = document.getElementById(buttonId+"Dropdown");
                innerButton.className = 'toolbarDropdownButtonLoaded';    
            }
        }
    }

    function setDropdownButtonPressed(buttonId) {
        if (isButtonEnabled(buttonId)) {
            var outerButton = document.getElementById(buttonId);
            outerButton.className = 'toolbarOuterButtonPressed';
            var innerButton = document.getElementById(buttonId+"Dropdown");
            innerButton.className = 'toolbarDropdownButtonPressed';    
        }
    }

    function setButtonBusy(buttonId, isBusy) {
        var busyImage = document.getElementById(buttonId+"DropImage");
        if (!busyImage) {
            busyImage = document.getElementById(buttonId+"BusyImage");
        } 

        if (busyImage) {
            var lastIndex = busyImage.src.lastIndexOf('/')+1;
            var ctxPath = busyImage.src.substr(0, lastIndex);
            if (isBusy && isButtonEnabled(buttonId)) {
                busyImage.src = ctxPath + "buttonbusy.gif";
                busyImage.style.visibility = "visible";
            } else {
                if (busyImage.id == (buttonId+"DropImage")) {
                    busyImage.src = ctxPath + "dropdown.gif";
                } else {
                    busyImage.src = ctxPath + "blank.gif";
                    busyImage.style.visibility = "hidden";
                } 
            }
        }        
    }
    
    function setButtonPressed(buttonId, isPressed) {
        if (isButtonEnabled(buttonId)) {    
            var wasPressed = isButtonPressed(buttonId);
            var actionButton = document.getElementById(buttonId+"Action");
            actionButton.setAttribute("isPressed", isPressed);
            
            if (isPressed) {
                setActionButtonPressed(buttonId);
            } else {
                setActionButtonDefault(buttonId);

                if (wasPressed) {
                    // fire the toggle action
                    var button = document.getElementById(buttonId);
                    var toggleAction = button.getAttribute("toggleAction");
                    if (toggleAction) {
                        eval(toggleAction);
                    }
                }
            }
        }
    }
    
    function isButtonPressed(buttonId) {
        var isPressed = false;
        var actionButton = document.getElementById(buttonId+"Action");
        if (actionButton) {
            isPressed = eval(actionButton.getAttribute("isPressed"));
        }
        
        return isPressed;
    }
    
    function setButtonImage(buttonId, imageSrc) {
        var buttonImg = document.getElementById(buttonId+"Image");
        if (buttonImg) {
            buttonImg.src = imageSrc;
        }
    }
    
    function setButtonLabel(buttonId, labelTxt) {
        var buttonLabel = document.getElementById(buttonId+"Label");
        if (buttonLabel) {
            buttonLabel.innerHTML = labelTxt;
        }
    }

    function setButtonTooltip(buttonId, tooltipTxt) {
        var actionButton = document.getElementById(buttonId+"Action");
        if (actionButton) {
            actionButton.title = tooltipTxt;
        }
    }
    
    function setButtonVisible(buttonId, isVisible) {
        var button = document.getElementById(buttonId);
        if (button) {
            button.style.display   = (isVisible) ? ""  : "none";
            if (!isVisible) setButtonBusy(buttonId, false);
        }
    }    
        
    function setButtonEnabled(buttonId, isEnabled) {
        var button = document.getElementById(buttonId);
        if (button) {
            button.setAttribute("isEnabled", isEnabled);
         
            if (isEnabled) {
                button.style.opacity = "1.0";
                button.style.filter = "Alpha(opacity=100)"; 
            } else {
                button.style.opacity = ".40";
                button.style.filter = "Alpha(opacity=40)";
            }
        }
    }

    function isButtonEnabled(buttonId) {
        var isEnabled = false;
        var button = document.getElementById(buttonId);
        if (button) {
            isEnabled = eval(button.getAttribute("isEnabled"));
        }
        return isEnabled;
    }
    
    function setButtonDialogPosition(buttonId, dialogId) {
        var button = document.getElementById(buttonId);
        var buttonDialog = document.getElementById(dialogId);
        var mainBodyDiv = document.getElementById("mainBodyDiv");
        var mainBodyPos;
        if (mainBodyDiv) {
            mainBodyPos = findObjectPosition(mainBodyDiv);
        } else {
            mainBodyPos = { x : 0, y : 0 };
        }
        
        if (button && buttonDialog) {      
            // center the dialog above its toolbar button, left aligned with the edge of button
            buttonPosition = findObjectPosition(button);
            buttonDialog.style.top = (buttonPosition.y - buttonDialog.offsetHeight - mainBodyPos.y)+"px"
            buttonDialog.style.left = (buttonPosition.x - mainBodyPos.x) +"px"
        }
    }

