// General UI functionality
/*global  Event  $ $$*/

//var dbgCount = 1;
function dbg(msg) {
  //$("debug").value += dbgCount + ": " + msg + "\n";
  //dbgCount += 1;
}

var tjm = {
  // Settings
  absImageUrl: "/media/tjm/netinsurance01/images/tjm/",
  
  // Methods 
  ie6PngFixStyleSheetInjected: false,
  fixIE6PngAlphaBlending: function () {
    var d;
    // Fix IE5.5 and 6 problem with PNG alpha blending
    if (navigator.platform === "Win32" && navigator.appName === "Microsoft Internet Explorer" && window.attachEvent && navigator.userAgent.indexOf("Opera") === -1) {
      d = document;
      d.writeln("<style type=\"text/css\">img { visibility: hidden; }</style>");
      tjm.ie6PngFixStyleSheetInjected = true;
      Event.observe(window, "load", function () {
        var rslt, itsAllGood, i, src, img;
        rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, "");
        itsAllGood = (rslt !== null && Number(rslt[1]) >= 5.5);
        for (i = document.images.length - 1, img = null; (img = document.images[i]); i -= 1) {
          img.galleryimg = "no";
          if (itsAllGood && img.src.match(/\.png$/i) !== null) {
            src = img.src;
            img.style.width = img.width + "px";
            img.style.height = img.height + "px";
            img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')";
            img.src = tjm.absImageUrl + "1px.gif";
          }
          img.style.visibility = "visible";
        }
      });
    }
  },
  
  getCssValue: function (selector, attribute) {
    // Find specified CSS rule and return the style sheet value for an attribute
    var stylesheet, rules, selectors, value, i, j, m, n, p;
    selector = selector.toLowerCase();
    stylesheet = document.styleSheets[tjm.ie6PngFixStyleSheetInjected ? 1 : 0];
    if (typeof stylesheet.rules !== "undefined") {
      rules = stylesheet.rules;
    }
    else {
      rules = stylesheet.cssRules;
    }
    n = rules.length;
    for (i = 0; i < n; i += 1)
    {
      selectors = rules[i].selectorText.toLowerCase().split(",");
      m = selectors.length;
      for (j = 0; j < m; j += 1)
      {
        if (selectors[j] === selector)
        {
          if (typeof rules[i].style.getPropertyValue !== "undefined") {
            value = rules[i].style.getPropertyValue(attribute);
          }
          else {
            // lowerCamelCase the attribute string and remove dashes
            do {
              p = attribute.indexOf("-");
              if (p > 0) {
                attribute = attribute.substring(0, p) + attribute.substring(p + 1, p + 2).toUpperCase() + attribute.substring(p + 2, attribute.length);
              }
            }
            while (p > 0);
            value = rules[i].style.getAttribute(attribute);
          }
          if (value !== "")
          {
            return value;
          }
        }
      }
    }
    return null;
  },

  uiFuncs: {
    displayMessage: function() {
      
      if($('bodymessage')) {
        // Fix IE5.5 and 6 problem with PNG alpha blending
          if (navigator.platform === "Win32" && navigator.appName === "Microsoft Internet Explorer" && window.attachEvent && navigator.userAgent.indexOf("Opera") === -1) {
          //Set up by stylesheet
        }
        else {
          $('bodymessage').style.backgroundImage = "url('/netinsurance01/images/tjm/TJM_errorbox.png')";
        }
        // Howe was here
			  //$('bodymessage').grow();
			  $('bodymessage').show();
			 Event.observe($('bodymessage'), 'click', function() {
			  //$('bodymessage').dropOut();
			  $('bodymessage').hide();
			});
      }
    },
  
    // Collection of UI specific methods
    findPosition: function (elem) {
      // Return positional information for a DOM element or ID
      var curleft, curtop, topElem;
      curleft = 0;
      curtop = 0;
      elem = $(elem);
      topElem = elem;
      if (typeof elem !== "undefined" && elem !== null) {
        curtop = elem.offsetHeight;
        while (elem.offsetParent) {
          curleft += elem.offsetLeft;
          curtop += elem.offsetTop;
          if (typeof elem.scrollTop === 'number') {
            curtop -= elem.scrollTop;
          }
          elem = elem.offsetParent;
        }
      }
      return {
        "top": curtop,
        "left": curleft,
        "width": topElem.clientWidth,
        "height": topElem.clientHeight
      };
    },
    setPositionByOffsetElem: function (elem, offsetElem, offsetLeft, offsetTop) {
      // Set position for a DOM element to be relative to an offset element and offset coordinate
      var p;
      p = tjm.uiFuncs.findPosition($(offsetElem));
      $(elem).style.position = "absolute";
      $(elem).style.left = p.left + offsetLeft + "px"; 
      $(elem).style.top = p.top + offsetTop + "px";
    },
    imgStamps: {
      // Methods for handling positioning of image stamps
      stamps: [],
      place: function (elemId, imgId, offsetX, offsetY) {
        // Place a stamp at specified absolute position
        var img, elem, pos, self;
        self = tjm.uiFuncs.imgStamps;
        elem = $(elemId);
        img = $(imgId);
        if (typeof elem !== "undefined" && elem !== null && typeof img !== "undefined" && img !== null) {
          pos = tjm.uiFuncs.findPosition(elem);
          img.style.position = "absolute";
          img.style.left = pos.left + offsetX + "px";
          img.style.top = pos.top + offsetY + "px";
          self.stamps.push([ elem, img, offsetX, offsetY ]);
        }
      },
      update: function () {
        // Update event that fires on document resize to automatically re-position all stamps added
        var i, pos, self;
        self = tjm.uiFuncs.imgStamps;
        for (i = 0; i < self.stamps.length; i += 1) {
          try {
            pos = tjm.uiFuncs.findPosition(self.stamps[i][0]);
            self.stamps[i][1].style.left = pos.left + self.stamps[i][2] + "px";
            self.stamps[i][1].style.top = pos.top + self.stamps[i][3] + "px";
          }
          catch (ex) {
            // Ignore update errors
          }
        }
      }
    }
  },
  
  menuSystem: {
    // Menu system methods
    init: function () {
      // Menu initialization method. Runs on document.onload event.
      var subMenus, i, self;
      self = tjm.menuSystem;
      self.menuItemBgColor = tjm.getCssValue("#menuItem", "background-color");
      self.menuItemColor = tjm.getCssValue("#menuItem", "color");
      self.menuItemActiveBgColor = tjm.getCssValue("#menuItemActive", "background-color");
      self.menuItemActiveColor = tjm.getCssValue("#menuItemActive", "color");
      self.menuHeaderItemColor = tjm.getCssValue("#menuHeaderItem", "color");
      self.menuHeaderItemActiveColor = tjm.getCssValue("#menuHeaderItemActive", "color");
      subMenus = $$(".submenu");
      if (typeof subMenus !== "undefined" && subMenus !== null) {
        for (i = 0; i < subMenus.length; i += 1) {
          if (typeof subMenus[i] !== "undefined" && subMenus[i] !== null) {
            self.initSubMenu(subMenus[i]);
          }
        }
      }
      // Push event handlers to global scope for smaller HTML footprint
      window.mover = tjm.menuSystem.menuHeaderMouseover;
      window.mout = tjm.menuSystem.menuHeaderMouseout;
      window.miover = tjm.menuSystem.menuItemMouseover;
      window.miout = tjm.menuSystem.menuItemMouseout;
      window.smover = tjm.menuSystem.subMenuTriggerItemMouseover;
      window.smout = tjm.menuSystem.subMenuTriggerItemMouseout;
      window.smiover = tjm.menuSystem.subMenuItemMouseover;
      window.smiout = tjm.menuSystem.subMenuItemMouseout;
    },
    initSubMenu: function (subMenu) {
      // Initialization of all submenus. Runs on document.onload event.
      var id, mId;
      id  = $(subMenu).id.split("_")[0];
      mId = id.split("-");
      mId = mId[0] + "-" + mId[1];
      tjm.menuSystem.menuHeaderMouseover($(mId + "_mm"));
      tjm.uiFuncs.setPositionByOffsetElem($(subMenu), $(id + "_item"), $(mId + "_items").clientWidth - 14, -18);
      tjm.menuSystem.menuHeaderMouseout($(mId + "_mm"));
    },
    
    activeMenuElem: null,
    activeMenuItemElem: null,
    activeSubMenuElem: null,
    lastSubMenuId: null,
    subMenuTimer: null,
    menuHeaderMouseover: function (elem) {
      // Menu header  mouseover event handler
      var id, self;
      self = tjm.menuSystem;
      if (self.activeMenuElem === elem) {
        return;
      }
      self.activeMenuElem = elem;
      id = elem.id.split("_")[0];
      dbg("Menu: " + id + " over");
      $(id + "_itl").src = tjm.absImageUrl + "tjm_c_tl.gif";
      $(id + "_itr").src = tjm.absImageUrl + "tjm_c_tr.gif";
      $(id + "_tm").style.backgroundColor = self.menuItemActiveBgColor;
      $(id + "_ml").style.backgroundColor = self.menuItemActiveBgColor;
      $(id + "_mm").style.backgroundColor = self.menuItemActiveBgColor;
      $(id + "_mm").style.color = self.menuItemActiveColor;
      $(id + "_mr").style.backgroundColor = self.menuItemActiveBgColor;
      $(id + "_header").style.color = self.menuHeaderItemActiveColor;
      $(id + "_items").style.display = "";
      tjm.shim.showShim("PopUpShim1", $(id + "_items"));
      tjm.uiFuncs.setPositionByOffsetElem($(id + "_items"), elem, -5, 0);
      tjm.uiFuncs.setPositionByOffsetElem($("menuLeftCorner"), elem, -10, 5);
      tjm.uiFuncs.setPositionByOffsetElem($("menuRightCorner"), elem, $(id + "_items").clientWidth - 5, 5);
      $("menuLeftCorner").style.display = "";
      $("menuRightCorner").style.display = "";
      return false;
    },
    menuHeaderMouseout: function (elem) {
      // Menu header mouseout event handler
      var id, self;
      self = tjm.menuSystem;
      id  = elem.id.split("_")[0];
      dbg("Menu: " + id + " out");
      $(id + "_itl").src = tjm.absImageUrl + "1px.gif";
      $(id + "_itl").style.width = "5px";
      $(id + "_itl").style.height = "5px";
      $(id + "_itr").src = tjm.absImageUrl + "1px.gif";
      $(id + "_itr").style.width = "5px";
      $(id + "_itr").style.height = "5px";
      $(id + "_tm").style.backgroundColor = self.menuItemBgColor;
      $(id + "_ml").style.backgroundColor = self.menuItemBgColor;
      $(id + "_mm").style.backgroundColor = self.menuItemBgColor;
      $(id + "_mm").style.color = self.menuItemColor;
      $(id + "_mr").style.backgroundColor = self.menuItemBgColor;
      $(id + "_header").style.color = self.menuHeaderItemColor;
      $(id + "_items").style.display = "none";
      tjm.shim.hideShim("PopUpShim1");
      $("menuLeftCorner").style.display = "none";
      $("menuRightCorner").style.display = "none";
      self.activeMenuElem = null;
      return false;
    },
    menuItemMouseover: function (elem) {
      // Menu items mouseover event handler
      var id, mId, self;
      self = tjm.menuSystem;
      if (self.activeMenuItemElem === elem) {
        return;
      }
      self.activeMenuItemElem = elem;
      id  = elem.id.split("_")[0];
      dbg("Menu item: " + id + " over");
      mId = id + "_mm";
      self.menuHeaderMouseover($(mId));
      return false;
    },
    menuItemMouseout: function (elem) {
      // Menu items mouseout event handler
      var id, mId, self;
      self = tjm.menuSystem;
      id  = elem.id.split("_")[0];
      dbg("Menu item: " + id + " out");
      mId = id + "_mm";
      self.menuHeaderMouseout($(mId));
      self.activeMenuItemElem = null;
      return false;
    },
    subMenuTriggerItemMouseover: function (elem) {
      // Sub menu mouseover event handler
      var id, mId, self;
      self = tjm.menuSystem;
      if (self.activeSubMenuElem === elem) {
        return;
      }
      self.activeSubMenuElem = elem;
      id  = elem.id.split("_")[0];
      mId = id.split("-");
      mId = mId[0] + "-" + mId[1];
      if (self.subMenuTimer !== null) {
        if (id + "_submenu" !== self.lastSubMenuId) {
          self.hideSubMenu();
        }
        clearTimeout(self.subMenuTimer);
        self.subMenuTimer = null;
        dbg("smover cleared submenu hide timer");
      }
      self.lastSubMenuId = id + "_submenu";
      $(self.lastSubMenuId).style.display = "";
      tjm.shim.showShim("PopUpShim2", $(self.lastSubMenuId));
      self.menuHeaderMouseover($(mId + "_mm"));
      return false;
    },
    subMenuTriggerItemMouseout: function (elem) {
      // Sub menu mouseout event handler
      var id, mId, self;
      self = tjm.menuSystem;
      id  = elem.id.split("_")[0];
      dbg("Sub menu: " + id + " out");
      mId = id.split("-");
      mId = mId[0] + "-" + mId[1];
      self.activeSubMenuElem = null;
      self.menuHeaderMouseout($(mId + "_mm"));
      self.lastSubMenuId = id + "_submenu";
      self.subMenuTimer = setTimeout(tjm.menuSystem.hideSubMenu, 250);
      dbg("smout started submenu hide timer");
      return false;
    },
    subMenuItemMouseover: function (elem) {
      // Sub menu items mouseover event handler
      var id, mId, self;
      self = tjm.menuSystem;
      clearTimeout(self.subMenuTimer);
      self.subMenuTimer = null;
      dbg("smiover cleared submenu hide timer");
      id  = elem.id.split("_")[0];
      
      //Select menuItem referencing submenu
      $(id+"_item").className = "menuItemActiveStyle";
      
      mId = id.split("-");
      mId = mId[0] + "-" + mId[1];
      self.menuHeaderMouseover($(mId + "_mm"));
      return false;
    },
    subMenuItemMouseout: function (elem) {
      // Sub menu items mouseout event handler
      var id, mId, self;
      self = tjm.menuSystem;
      self.subMenuTimer = setTimeout(tjm.menuSystem.hideSubMenu, 100);
      dbg("smiout started submenu hide timer");
      id  = elem.id.split("_")[0];
      mId = id.split("-");
      mId = mId[0] + "-" + mId[1];
      self.menuHeaderMouseout($(mId + "_mm"));
      return false;
    },
    hideSubMenu: function () {
      // Method for hiding the currently displayed submenu
      var self;
      self = tjm.menuSystem;
      $(self.lastSubMenuId).style.display = "none";
      tjm.shim.hideShim("PopUpShim2");
      
      //Deselect menuItem referencing submenu
      var id = self.lastSubMenuId.split("_")[0];
      $(id+"_item").className = "menuItemStyle";
      
      clearTimeout(self.subMenuTimer);
      self.subMenuTimer = null;
    }
  },
  
  shim: {
    shimHideHandler: null,
    useAnim: true,

    private_setShim: function (shimId, shimVisible, x, y, w, h, z) {
      var e, shimLayer;
      shimLayer = $(shimId);
      if (!shimLayer) {
        return;
      }
      if (shimVisible) {
        shimLayer.style.left    = x;
        shimLayer.style.top     = y;
        shimLayer.style.width   = w;
        shimLayer.style.height  = h;
        shimLayer.style.zIndex  = z;
      }
      shimLayer.style.backgroundColor = "";
      shimLayer.style.filter = "alpha(opacity=1)";
      shimLayer.style.visibility = shimVisible ? "visible" : "hidden";
    },

    hideShim: function (shimId) {
      this.private_setShim(shimId, false);
    },

    // zIndex parameter can be omitted
    showShim: function (shimId, layerAbove) {
      var shimLayer, higher, x, y, w, h, p;
      if (layerAbove) {
        shimLayer = $(shimId);
        if (!shimLayer) {
          return;
        }
        p = tjm.uiFuncs.findPosition(layerAbove);
        x = p.left + "px";
        y = layerAbove.style.top; // already px
        w = layerAbove.offsetWidth + "px";
        h = layerAbove.offsetHeight + "px";
        layerAbove.style.zIndex = 101;
        this.private_setShim(shimId, true, x, y, w, h, 100);
      }
    }
  }
};

tjm.fixIE6PngAlphaBlending(); // Must run when script is loading, and not on document.onload, to properly inject the style sheet fix with document.write.

// Attach event handlers
Event.observe(window, "load", tjm.menuSystem.init);
Event.observe(window, "load", tjm.uiFuncs.displayMessage);
Event.observe(window, "resize", tjm.uiFuncs.imgStamps.update);
