  function ImageTracker(targetNode) {
    this.targetNode = targetNode ;
    this.errorOccurred = false ;
  }
  
  ImageTracker.prototype.imageLoaded = function(imageSource) {
    if (!this.errorOccurred) {
      this.targetNode.onmouseover = swap ;
      this.targetNode.onmouseout = swap ;
    }
    if (images != null && imageIndex++ < images.length) {
      load() ;
    }
    
  }
  
  ImageTracker.prototype.imageError = function(imageSource) {
    this.errorOccurred = true ;
    if (images != null && imageIndex++ < images.length) {
      load() ;
    }    
  }

  function swap() {
    var originalImg = this.src ;
    var newImg = getSwapImage(originalImg) ;
    this.src = newImg ;
    if (newImg.length > originalImg.length) {
      // mouse over
      var desc = this.getAttribute("longdesc") ;

      if (desc == null) {
        desc = getAnchorTitle(this) ;
      }
      if (desc) {
        statusBarElement.innerHTML = desc ;
      }
    } else {
      // mouse out
      statusBarElement.innerHTML = "" ;
    }
  }
  
  function getAnchorTitle(node) {
    if (node == null) {
      return "" ;
    } else if (node.tagName != null && node.tagName.toLowerCase() == "a") {
      var title = node.getAttribute("title") ;
      if (title) {
        return title ;        
      } else {
        return "" ;
      }
    } else {
      return getAnchorTitle(node.parentNode) ;
    }
      
  }
  
  function getSwapImage (imgSource) {
    var newImage = imgSource ;
    var dotIndex = imgSource.lastIndexOf(".") ;
    var ext = imgSource.substring(dotIndex) ;
    var rolloverName = "_on" ;
    var rollOverIndex = imgSource.lastIndexOf(rolloverName + ext) ; 
    if ( rollOverIndex == -1 || rollOverIndex != (imgSource.length - ext.length - rolloverName.length) ) {
      // get rollover image...
      newImage = imgSource.substring(0, dotIndex) + "_on" + ext ;
    } else {
      // get non-rollover image...
      newImage = imgSource.substring(0, rollOverIndex) + ext ;
    }
    return newImage ;
  }

  var statusBarElement = null ;
  var images = null ;
  var imageIndex = -1 ;
  
  function addRolloverCode() {
    var preloadImages = [
                          "../images/menu/bullet_about.gif",
                          "../images/menu/bullet_about_on.gif",
                          "../images/menu/bullet_products.gif",
                          "../images/menu/bullet_products_on.gif",
                          "../images/menu/bullet_services.gif",
                          "../images/menu/bullet_services_on.gif",
                          "../images/menu/bullet_info.gif",
                          "../images/menu/bullet_info_on.gif"
                        ] ;
    for (var i = 0; i < preloadImages.length; i++) {
      new Image().src = preloadImages[i] ;
    }
    
    statusBarElement = document.getElementById("statusBarLeft") ;
    images = document.body.getElementsByTagName("img") ;
    load() ;
  }
  
  /**
   * Cannot merely iterate through the images array as IE does this somewhat concurrently
   * and bizarrely. Therefore, we only load the next image after the previous has loaded/ failed to load.
   */
  function load() {

    if (images != null && imageIndex++ < images.length) {
  
    var imgElement = images[imageIndex] ;
   
      if (imgElement != null) { 
        var imgSource = imgElement.src ;

        if (imgSource != null && "" != imgSource) {
          // preload swap image...
          var preload = new Image() ;
          preload.imageTracker = new ImageTracker(images[imageIndex]) ;
          preload.onerror = function() { this.imageTracker.imageError(this.src) } ;
          preload.onload = function() { this.imageTracker.imageLoaded(this.src) } ;
  
          preload.src = getSwapImage(imgSource) ;
        } else {
          alert("img element contains no src attribute.") ;
        }
      }
    }
  }
  
  function swapBullet(listItem, imgName) {
    listItem.style.listStyleImage = "url(../images/menu/bullet_" + imgName + ".gif)" ;
    
    
    
    var onIndex = imgName.lastIndexOf("_on") ;
    
    if ( onIndex == imgName.length - 3) {
      // mouse over
      var linkElements = listItem.getElementsByTagName("a") ;
      if (linkElements.length > 0 ) {
        var desc = linkElements[0].title ;
        if (desc != null) {
          statusBarElement.innerHTML = desc ;
        }
      }
    } else {
      // mouse out
      statusBarElement.innerHTML = "" ;
    }    
    
  }
  
  
  
