//Region Global Variables
var dsm_SelectedMenuStyleInfos=new Object();
var dsm_UnselectedMenuStyleInfos=new Object();
var dsm_ActiveMenuStyleInfos=new Object();
var dsm_MenuFadeDelays=new Object();
var dsm_clockValue=0;
var dsm_ticker;
var dsm_highlightTopMenus=new Object();
var dsm_images=new Array();
var dsm_OpenMenuItems = new Array();
var dsm_ActiveItems=new Object();
//EndRegion
//Region Methods to hook up a menu to the global variables
function dsm_registerMenu(menuID, selectedStyleInfo, unselectedStyleInfo, activeStyleInfo, menuFadeDelay, highlightTopMenu){
	dsm_SelectedMenuStyleInfos[menuID]=selectedStyleInfo;
	dsm_UnselectedMenuStyleInfos[menuID]=unselectedStyleInfo;
	dsm_ActiveMenuStyleInfos[menuID]=activeStyleInfo;
	dsm_MenuFadeDelays[menuID]=menuFadeDelay;
	dsm_highlightTopMenus[menuID]=highlightTopMenu;
}
//Region The methods and contructor of the dsm_styleInfo object.
function dsm_applyStyleInfoToElement(element){
	if (this.className!='')
		element.className=this.className;
}
function dsm_styleInfo(className){
	this.className=className;
	this.applyToElement=dsm_applyStyleInfoToElement;
}
function dsm_setActiveItem(menuID, activeItem){
    dsm_ActiveItems[menuID] = activeItem;
}
//Region MouseEventHandlers
function dsm_mousedOverMenu(menuID,elem,parent,displayedVertically,submenuDisplayedVertically,imageSource){
	dsm_stopTick();
	dsm_closeSubMenus(elem);
	var childID=elem.id+"-subMenu";  // Display child menu if needed
	if (document.getElementById(childID)!=null){  // make the child menu visible and specify that its position is specified in absolute coordinates
		document.getElementById(childID).style.display='block';
		document.getElementById(childID).style.position='absolute';
		dsm_OpenMenuItems = dsm_OpenMenuItems.concat(childID);
		if (displayedVertically){ // Set the child menu's left tAand top attributes according to the menu's offsets
			document.getElementById(childID).style.left=dsm_getAscendingLefts(parent)+parent.offsetWidth+'px';
			document.getElementById(childID).style.top=dsm_getAscendingTops(elem)+'px';
			var visibleWidth=parseInt(window.outerWidth?window.outerWidth-9:document.body.clientWidth,10+'px');
			if ((parseInt(document.getElementById(childID).offsetLeft,10+'px')+parseInt(document.getElementById(childID).offsetWidth,10+'px'))>visibleWidth) {
				document.getElementById(childID).style.left=visibleWidth-parseInt(document.getElementById(childID).offsetWidth,10+'px');
			}
		}else{  // Set the child menu's left and top attributes according to the menu's offsets
		    if(submenuDisplayedVertically) {
			    document.getElementById(childID).style.left=dsm_getAscendingLefts(elem)+'px';
			}
			document.getElementById(childID).style.top=dsm_getAscendingTops(parent)+parent.offsetHeight+'px';
			if (document.getElementById(childID).offsetWidth<elem.offsetWidth)
				document.getElementById(childID).style.width='auto';//elem.offsetWidth+'px';
		}
	}
	if (dsm_SelectedMenuStyleInfos[menuID] != null) dsm_SelectedMenuStyleInfos[menuID].applyToElement(elem);
   if (dsm_highlightTopMenus[menuID]){
		var eId=elem.id+'';
		while (eId.indexOf('-subMenu')>=0){
			eId=eId.substring(0, eId.lastIndexOf('-subMenu'));
			dsm_SelectedMenuStyleInfos[menuID].applyToElement(document.getElementById(eId));
		}
	}	
	if (imageSource!=''){
		setimage(elem,imageSource)
	}
}
function dsm_mousedOverClickToOpen(menuID,elem,parent,imageSource){
	dsm_stopTick();
	if (dsm_SelectedMenuStyleInfos[menuID] != null) dsm_SelectedMenuStyleInfos[menuID].applyToElement(elem);
	if (dsm_highlightTopMenus[menuID]){
		var eId=elem.id+'';
		while (eId.indexOf('-subMenu')>=0){
			eId=eId.substring(0, eId.lastIndexOf('-subMenu'));
			dsm_SelectedMenuStyleInfos[menuID].applyToElement(document.getElementById(eId));
		}
	}	
	if (imageSource!=''){
		setimage(elem,imageSource)
	}
}
function dsm_mousedOverSpacer(menuID,elem,parent){
	dsm_stopTick();
}
function dsm_mousedOutMenu(menuID,elem,imageSource){
	dsm_doTick(menuID);
  
    if (dsm_OpenMenuItems == "undefined" || dsm_OpenMenuItems.length == 0) {
        if(dsm_ActiveItems[menuID] == elem.id) {
            if (dsm_ActiveMenuStyleInfos[menuID] != null)
                dsm_ActiveMenuStyleInfos[menuID].applyToElement(elem);
        } else {
            if (dsm_UnselectedMenuStyleInfos[menuID] != null)
                dsm_UnselectedMenuStyleInfos[menuID].applyToElement(elem);
        }

        if (dsm_highlightTopMenus[menuID]){
            var eId=elem.id+'';
            while (eId.indexOf('-subMenu')>=0){
                eId=eId.substring(0, eId.lastIndexOf('-subMenu'));
                if(dsm_ActiveItems[menuID] == eId) {
                    dsm_ActiveMenuStyleInfos[menuID].applyToElement(document.getElementById(eId));
                } else {
                    dsm_UnselectedMenuStyleInfos[menuID].applyToElement(document.getElementById(eId));
                }
            }
        }
    }

    if (imageSource!=''){
		setimage(elem,imageSource)
	}
}
function dsm_mousedOutSpacer(menuID, elem){
	dsm_doTick(menuID);
}

//Region Utility Functions
function dsm_closeSubMenus(parent){
    if (dsm_OpenMenuItems == "undefined") return;
    for (var i=dsm_OpenMenuItems.length-1; i>-1;i--) {
        if (parent.id.indexOf(dsm_OpenMenuItems[i]) != 0) {
            var eId=dsm_OpenMenuItems[i]+'';
            while (eId.indexOf('-subMenu')>=0){
                eId=eId.substring(0, eId.lastIndexOf('-subMenu'));
                var menuId = eId.substring(0, eId.indexOf('-menuItem'));
                if(dsm_ActiveItems[menuId] == eId) {
                    dsm_ActiveMenuStyleInfos[menuId].applyToElement(document.getElementById(eId));
                } else {
                    dsm_UnselectedMenuStyleInfos[menuId].applyToElement(document.getElementById(eId));
                }
            }
            document.getElementById(dsm_OpenMenuItems[i]).style.display = 'none';
            dsm_OpenMenuItems = new Array().concat(dsm_OpenMenuItems.slice(0,i), dsm_OpenMenuItems.slice(i+1));
        } 
    }
}
function dsm_IsSubMenu(id){
	if (dsm_subMenuIDs == "undefined") return false;
	for (var i=0;i<dsm_subMenuIDs.length;i++)
	  if (id==dsm_subMenuIDs[i]) return true;
	return false;
}
function dsm_getAscendingLefts(elem){
	if (elem==null)
		return 0;
	else
	{
		if ((elem.style.position=='absolute' || elem.style.position=='relative') && !dsm_IsSubMenu(elem.id)) return 0;
		return elem.offsetLeft+dsm_getAscendingLefts(elem.offsetParent);
	}
}
function dsm_getAscendingTops(elem){
	if (elem==null)
		return 0;
	else {
		if ((elem.style.position=='absolute' || elem.style.position=='relative') && !dsm_IsSubMenu(elem.id)) return 0;
		return elem.offsetTop+dsm_getAscendingTops(elem.offsetParent);
	}
}
//Region Fade Functions
function dsm_doTick(menuID){
	if (dsm_clockValue>=dsm_MenuFadeDelays[menuID]){
		dsm_stopTick();
		dsm_closeSubMenus(document.getElementById(menuID));
	} else {
		dsm_clockValue++;
		dsm_ticker=setTimeout("dsm_doTick('"+menuID+"');", 500);
	}
}
function dsm_stopTick(){
	dsm_clockValue=0;
	clearTimeout(dsm_ticker);
}
function preloadimages(){
	for (i=0;i<preloadimages.arguments.length;i++){
		dsm_images[i]=new Image();
		dsm_images[i].src=preloadimages.arguments[i];
	}
}
function setimage(elem,imageSource){
	var i=elem.getElementsByTagName("img")[0];
	i.src=imageSource;
}