/*
******************************************************************************
       File: NavigationMenu_Object.js
Description: Contains the common JavaScript code used for inserting the child 
             menus on to the page and creating the Navigation Menu.
  Copyright: Copyright (c) 2007, GMTI. All rights reserved.
******************************************************************************
*/

/*****************************************************************************
 Object Name: objNavigationMenu
 Defines the objNavigationMenu object which is used request the all of the 
 child node for the navigation menu level.                                       
*****************************************************************************/
var objNavigationMenu = {
	
		getMenuNode: function(Index) {
		    if(typeof(MenuArray[Index]) != "undefined")
		        return MenuArray[Index].Menu;
		},
		
		addScript: function(requestUrl){
            // define DOM elements
            var htmlTag = document.getElementsByTagName('head').item(0);
            var scriptTag = document.createElement('script');
              
            // set tag attributes
            scriptTag.setAttribute('language', 'javascript');
            scriptTag.setAttribute('type', 'text/javascript');
            scriptTag.setAttribute('src', requestUrl);
              
            // append tag to DOM
            htmlTag.appendChild(scriptTag);
              
            return false;
        },
        
        removeScript: function(){
            // define DOM elements        
            var htmlTag = document.getElementsByTagName('head').item(0);
            var scriptTag = htmlTag.getElementsByTagName('script');
            
            // removes tag from DOM
            htmlTag.removeChild(scriptTag.item(scriptTag.length-1));
        },
        
		browserCheck: function(req){
		    if (typeof(DOMParser) != "undefined") return 0;
            else if (ActiveXObject) return 1;
		    else return null;
		},
		
		displayMenu: function(menuIdx, divName, renderFunc) {
		    if(typeof(MenuArray[menuIdx]) != "undefined")
                for(var x =0; x <MenuArray[menuIdx].Menu.length; x++)
                    document.getElementById(divName).innerHTML += renderFunc(MenuArray[menuIdx].Menu[x]);
		}
};

/*****************************************************************************
 Object Name: menuLayers
 Defines the menuLayer object which is used to hide, display, and set position
 of a menu level.                                       
*****************************************************************************/
var menuLayers = {
  timer: null,
  stack: new Array(),
  activeMenuID: null,
  attachNode: null,
  
  show: function(id, pos, left, top) {
    var mnu = document.getElementById? document.getElementById(id): null;
    if (!mnu) return;
    mnu.style.display = "";
    mnu.innerHTML = "";
    if(menuLayers.stack.length > 0){
            
        if(menuLayers.stack.length > 0)
            var entry1 = menuLayers.stack.pop();
        if(menuLayers.stack.length > 0)
            var entry2 = menuLayers.stack.pop();
        if(menuLayers.stack.length > 0)
            var entry3 = menuLayers.stack.pop();
        if(entry3)
            menuLayers.stack.push(entry3);
        if(entry2)
            menuLayers.stack.push(entry2);
        menuLayers.stack.push(entry1);
        
        if(entry1 != id && entry2 != id && entry3 != id)
            menuLayers.stack.push(id);
    }
    else
        menuLayers.stack.push(id);
        
    if(mnu.onmouseout == null) mnu.onmouseout = this.mouseoutCheck;
    if(mnu.onmouseover == null) mnu.onmouseover = this.clearTimer;
    if(pos){
        mnu.style.position = "absolute";
        if(top) mnu.style.top = top +'px';
        if(left) mnu.style.left = left+'px';
    }
  },
  
  hide: function(id) {
    if(id){
        var entry1 = menuLayers.stack.pop();
        if(entry1 != id)
            menuLayers.stack.push(entry1);
        var mnu = document.getElementById? document.getElementById(id): null;
        if (!mnu) return;
        mnu.style.display = "none";
        mnu.innerHTML = "";
    }
    else{
        if(menuLayers.stack.length>1){
            this.clearTimer();
            this.timer = setTimeout("menuLayers.hideChild()", 300);
        }
    }
  },
  
  hideChild: function(){
        if(menuLayers.stack.length > 0){
            var entry1 = menuLayers.stack.pop();
            var mnu = document.getElementById? document.getElementById(entry1): null;
            if (!mnu) return;
            mnu.style.display = "none";
            mnu.innerHTML = "";
            ResetNode(menuLayers.stack.length+1);
        }
  },
  
  attach: function(parent, child) {
      var p = document.getElementById(parent);
      var c = document.getElementById(child );
      this.attachNode = p.offsetParent.id;
      var top = 0;
      var left= 0;
	
      for (; p; p = p.offsetParent){
        top  += p.offsetTop;
        left += p.offsetLeft;
      }
      var coord = new Object ();
      coord['x'] = left;
      coord['y'] = top;
      return coord;
  },
  
  getPos: function(inputElement) {
	  var coords =  new Object();
	  coords.x = 0;
	  coords.y = 0;
      try {
	    targetElement = inputElement;
		if(targetElement.x && targetElement.y) {
		    coords.x = targetElement.x;
		    coords.y = targetElement.y;
		} else {
		    if(targetElement.offsetParent) {
			    coords.x += targetElement.offsetLeft;
				coords.y += targetElement.offsetTop;
				while(targetElement = targetElement.offsetParent) {
				    coords.x += targetElement.offsetLeft;
					coords.y += targetElement.offsetTop;
				}
			} else {
					    //alert(\"Could not find any reference for coordinate positioning.\");
			}
		}
	    return coords;
	  } catch(error) {
	    return coords;
	  }
  },
    
  mouseoutCheck: function(e) {
    e = e? e: window.event;
    // is element moused into contained by menu? or is it menu (ul or li or a to menu div)?
    if(menuLayers){
        var entry1 = menuLayers.stack.pop();
        var toEl = e.relatedTarget? e.relatedTarget: e.toElement;
        var mnu = document.getElementById(entry1);
        menuLayers.stack.push(entry1);
        //$("debugTag").innerHTML += "<br />Checking: "+entry1+" ,Status: "+(mnu != toEl && !menuLayers.contained(toEl, mnu));
        if ( mnu != toEl && !menuLayers.contained(toEl, mnu)){menuLayers.hide();}
    }
  },
  
  // returns true of oNode is contained by oCont (container)
  contained: function(oNode, oCont) {
    if (!oNode) return; // in case alt-tab away while hovering (prevent error)
    if ( oNode == oCont ) return true;
    while ( oNode = oNode.parentNode ) 
      if ( oNode == oCont ) return true;
    return false;
  },

  clearTimer: function() {
    if (menuLayers.timer) clearTimeout(menuLayers.timer);
  }
};