function initialiseMenu() {

   // Second tier nav object which was last opened
   lastExpandedObject = null;
   // Third tier nav objects which were last opened
   lastFlyoutObject = null;
   lastFlyoutBridgeObject = null;
   netscapeBrowser = (navigator.appName == "Netscape");
   // Initialise x and y co-ordinate values for user's mouse
   xPosition = 0;
   yPosition = 0;
   if (netscapeBrowser) {
      document.captureEvents(Event.MOUSEMOVE);
   }
   document.onmousemove = getMouseCoordinates;
   if (netscapeBrowser) {
      document.captureEvents(Event.MOUSEDOWN);
   }
   document.onmousedown = listenForMouseClick;
   // If a fly out navigation block is partially off the bottom of the browser window store the difference
   difference = 0;
   thirdTierDisplayed = new Array();
   // Initialise array object used to store whether the IFRAME DIV element has been added to a fly out block
   thirdTierIframeAdded = new Array();
   milliseconds = 1500;
   flyOutNavsDisplayed = 0;
   lastHeight = new Array();
   lastWindowHeight = new Array();
   lastScrolledHeight = new Array();
   // Which second tier block needs to be expanded when the page is loaded
   idStoredInCookie = "";
   if (getCookieValue('siteStoreExpandableState')) {
      idStoredInCookie = getCookieValue('siteStoreExpandableState');
      idStoredInCookie = idStoredInCookie.replace(/_second_tier/g,'')
      idStoredInCookie = idStoredInCookie.replace(/_third_tier/g,'')
   }
}

function getExpandedBlock() {
   if (idStoredInCookie != null && idStoredInCookie != "") {
      if (eval("document.getElementById('"+idStoredInCookie+"')")) {
         eval("showNavs(document.getElementById('"+idStoredInCookie+"'))");
      }
   }
}

function getMouseCoordinates(e) {
   if (netscapeBrowser) {
      xPosition = e.pageX;
      yPosition = e.pageY;
   } else {
      xPosition = event.clientX;
      yPosition = event.clientY;
   }
}

function listenForMouseClick(e)  {
   if (!e) {
      if( window.event ) {
         // DOM
         e = window.event;
      } else {
         // Cannot reference event
         return;
      }
   }
   if (e.target) {
      targetElement = e.target;
   }
   if (e.srcElement) {
      targetElement = e.srcElement;
   }
   if(typeof(e.which) == 'number') {
      // Netscape
      e = e.which;
   } else {
      if(typeof(e.button) == 'number') {
         // DOM
         e = e.button;
      } else {
         // Cannot determine
         return;
      }
   }
   // Check first mouse button is clicked
   if (e == 1) {
      if (xPosition == null && !(isNaN(xPosition))) { xPosition = 152; }
      if (xPosition <= 151) {
         if (targetElement.disabled == false && targetElement.parentNode.className != null && targetElement.parentNode.className.match(/navLeftSecond/g)) {
            writeSessionCookie('siteStoreExpandableState',lastExpandedObject.id);
         } else {
            writeSessionCookie('siteStoreExpandableState','');
         }
      } else {
         if (flyOutNavsDisplayed == 0) {
            //writeSessionCookie('siteStoreExpandableState','');
         } else {
            writeSessionCookie('siteStoreExpandableState',lastExpandedObject.id);
         }
      }
      // Clear the expanded second tier state variable if the user clicks on the footer and header links
      if (targetElement.disabled == false && targetElement.parentNode.className != null && targetElement.parentNode.className != "") {
         if (targetElement.parentNode.className == "topZone" || targetElement.parentNode.className == "topSearch" || targetElement.parentNode.className == "footer") {
            writeSessionCookie('siteStoreExpandableState','');
         }
      }
   }
}

function writeSessionCookie (cookieName, cookieValue) {
  if (testSessionCookie()) {
      document.cookie = escape(cookieName) + "=" + escape(cookieValue) + "; path=/";
      return true;
   } else {
      return false;
   }
}

function getCookieValue (cookieName) {
   var exp = new RegExp (escape(cookieName) + "=([^;]+)");
   if (exp.test (document.cookie + ";")) {
      exp.exec (document.cookie + ";");
      return unescape(RegExp.$1);
   } else {
      return false;
   }
}

function testSessionCookie () {
   document.cookie ="testSessionCookie=Enabled";
   if (getCookieValue("testSessionCookie")=="Enabled") {
      return true;
   } else {
      return false;
   }
}

function showNavs(navObject) {
   var secondTierObject = null;
   var secondTierName = navObject.id + "_second_tier";
   if (document.getElementById(secondTierName)) {
      secondTierObject = document.getElementById(secondTierName);
      var navArrowName = navObject.id + "_arrow";
      var navArrowObject = document.getElementById(navArrowName);
   }
   if (lastExpandedObject != null && secondTierObject != lastExpandedObject) {
      // Collapse previously expanded second tier block if still visible
      lastExpandedObject.style.display = "none";
      var lastExpandedObjectArrowName = lastExpandedObject.id;
      lastExpandedObjectArrowName = lastExpandedObjectArrowName.substr(0,lastExpandedObjectArrowName.length - 12) + "_arrow";
      if (document.getElementById(lastExpandedObjectArrowName)) {
         var lastExpandedObjectArrow = document.getElementById(lastExpandedObjectArrowName);
         lastExpandedObjectArrow.className = "arrowUp";
      }
   }
   if (lastFlyoutObject != null) {
      // Previously opened third tier flyout block must dispappear
      lastFlyoutObject.style.display = "none";
   }
   if (secondTierObject != null) {
      // Determine whether to expand or collapse second tier block
      if (secondTierObject.style.display == "none") {
         secondTierObject.style.display = "block";
         if (navArrowObject) {
            navArrowObject.className = "arrowDown";
         }
      } else {
         secondTierObject.style.display = "none";
         if (navArrowObject) {
            navArrowObject.className = "arrowUp";
         }
      }
      lastExpandedObject = secondTierObject;
   }
}

function flyoutNavs(navObject,displayNavs) {
   var thirdTierObject = null;
   var thirdTierName = navObject.id + "_third_tier";
   var thirdTierBridge = navObject.id + "_bridge";
   thirdTierDisplayed[navObject.id] = displayNavs;
   flyOutNavsDisplayed = displayNavs;
   if (document.getElementById(thirdTierName)) {
      thirdTierObject = document.getElementById(thirdTierName);
      thirdTierBridgeObject = document.getElementById(thirdTierBridge);
   }
   if (thirdTierObject != null) {
      if (displayNavs == 1) {
         if (lastFlyoutObject != null && lastFlyoutObject != thirdTierObject) {
            lastFlyoutObject.style.display = "none";
            lastFlyoutObject.style.marginTop = "-15px";
            if (lastFlyoutBridgeObject != null) {
               lastFlyoutBridgeObject.style.display = "none";
            }
            difference = 0;
         }
         thirdTierObject.style.display = "block";
         thirdTierObject.style.left = "150px";
         thirdTierObject.style.zIndex = "10";
         thirdTierBridgeObject.style.display = "block";
         thirdTierBridgeObject.style.left = "147px";
         thirdTierBridgeObject.style.marginTop = "-18px";
         thirdTierBridgeObject.style.zIndex = "11";

         if (difference == 0 && xPosition <= 150) {
            var browserWindowHeight = getWindowHeight();
            var scrolledHeight = getScrollHeight();
            var numberOfElements = getNumberOfElements(thirdTierObject);
            // Third tier link height is 20 pixels
            var flyOutNavsHeight = eval(numberOfElements * 20);
            if ((thirdTierIframeAdded[navObject.id] == null || !(thirdTierIframeAdded[navObject.id])) && !(netscapeBrowser) && !(isNaN(flyOutNavsHeight))) {
               backgroundWithIframe = '<div style="position: absolute; top: -3px;">'
                                    + '<iframe width="157" height="' + eval(flyOutNavsHeight + 3) + '" SRC="/iframe_blank.html" MARGINWIDTH="0" MARGINHEIGHT="0" HSPACE="0" VSPACE="0" FRAMEBORDER="0" SCROLLING="no"></iframe>'
                                    + '</div>';
               thirdTierObject.innerHTML = backgroundWithIframe + thirdTierObject.innerHTML;
               thirdTierIframeAdded[navObject.id] = true;
            }
            difference = eval(yPosition + flyOutNavsHeight + 5 - browserWindowHeight);
            if (netscapeBrowser) {
               difference -= scrolledHeight;
            }
            // If browser window height and scrolled height values are unchanged then use the previous height difference value
            if (lastWindowHeight[thirdTierName] != null && lastScrolledHeight[thirdTierName] != null) {
               if (lastWindowHeight[thirdTierName] == browserWindowHeight && lastScrolledHeight[thirdTierName] == scrolledHeight) {
                  difference = lastHeight[thirdTierName];
               }
            }
            // Remember the current height difference, browser window height and scrolled height values
            lastHeight[thirdTierName] = difference;
            lastWindowHeight[thirdTierName] = browserWindowHeight;
            lastScrolledHeight[thirdTierName] = scrolledHeight;
            // Only move the third tier fly out block if part of the links are cut off
            if (difference > 0) {
               // Make sure the bridge object locks at the bottom of the fly out block
               var offsetAmount = 0;
               if ((15 + difference) > flyOutNavsHeight) {
                  offsetAmount = eval((15 + difference) - flyOutNavsHeight) ;
               }
               thirdTierObject.style.marginTop = eval(offsetAmount - 15 - difference)+"px";
            } else {
               thirdTierObject.style.marginTop = "-15px";
            }
         }

      } else {
         eval("setTimeout('hideObject(\""+navObject.id+"\")',"+milliseconds+")");
      }
   }
   lastFlyoutObject = thirdTierObject;
   lastFlyoutBridgeObject = thirdTierBridgeObject;
}

function hideObject(navObjectID) {
   var thirdTierName = navObjectID + "_third_tier";
   var thirdTierBridge = navObjectID + "_bridge";
   if (document.getElementById(thirdTierName)) {
      thirdTierObject = document.getElementById(thirdTierName);
      thirdTierBridgeObject = document.getElementById(thirdTierBridge);
      // If cursor is still off third tier block and its parent nav after the delay then make it disappear
      if (thirdTierDisplayed[navObjectID] == 0) {
         thirdTierObject.style.display = "none";
         thirdTierBridgeObject.style.display = "none";
         difference = 0;
      }
   }
}

function getNumberOfElements(nodeObject) {
   var countElements = 0;
   var children = nodeObject.childNodes;
   for(var i=0; i < children.length; i++) {
      if (children[i].className != null && children[i].className == "navLeftThird") {
         countElements++;
      }
      // Recursively call this function
      countElements += getNumberOfElements(children[i]);
   }

   return countElements;
}


function getWindowHeight() {
   var browserWinWidth = 0, browserWinHeight = 0;
   if( typeof( window.innerWidth ) == 'number' ) {
      // Non-IE
      browserWinWidth = window.innerWidth;
      browserWinHeight = window.innerHeight;
   } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
      // IE 6+
      browserWinWidth = document.documentElement.clientWidth;
      browserWinHeight = document.documentElement.clientHeight;
   } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
      // IE 4 
      browserWinWidth = document.body.clientWidth;
      browserWinHeight = document.body.clientHeight;
   }
   return browserWinHeight;
}

function getScrollHeight() {
   var scrolledWidth = 0, scrolledHeight = 0;
   if ( typeof( window.pageYOffset ) == 'number' ) {
      // Netscape
      scrolledHeight = window.pageYOffset;
      scrolledWidth = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
      // DOM
      scrolledHeight = document.body.scrollTop;
      scrolledWidth = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
      // IE6
      scrolledHeight = document.documentElement.scrollTop;
      scrolledWidth = document.documentElement.scrollLeft;
  }
  return scrolledHeight;
}

initialiseMenu();
