if (typeof $AkzToolTip=="undefined") {
  var $AkzToolTip = new function () {
    var head = document.getElementsByTagName("head")[0];
    var body = document.getElementsByTagName("body")[0];
    var tt,currentId;
    var items=[];
    var itemDiv;
    
    function createAkzElement(type,p) {
      // type = html element type (ie: link, a, p)
      // p = array of attributes for type
      var newelement = document.createElement(type);
      if (p) {
        createAkzObject(newelement, p);
      }
      return newelement;
    }
    
    function addAkzElement(p,element) {
      return p.appendChild(element);
    }
    
    function addAkzEvent(z,y,x) {
      if (window.attachEvent) {
        z.attachEvent("on"+y,x);
      } else {
        z.addEventListener(y,x,false);
      }
    }
    
    function createAkzObject(ele,s) {
      for (var p in s) {
        if (typeof s[p]=="object") {
          if (!ele[p]) {
            ele[p] = {};
          }
          createAkzObject(ele[p],s[p]);
        } else {
          ele[p] = s[p];
        }
      }
    }
    
    function $E(e) {
      if (!e) {
        e = event;
      }
      if (!e.button) {
        e._button = e.which ? e.which : e.button;
        e._target = e.target ? e.target : e.srcElement;
      }
      return e;
    }
    
    function onMouseOver(e) {
      e = $E(e);
      var t=e._target;

      if (t.nodeName!="A") {
        if (t.parentNode && t.parentNode.nodeName == "A") {
          t = t.parentNode;
        } else if (t.parentNode.parentNode && t.parentNode.parentNode.nodeName == "A") {
          t = t.parentNode.parentNode;
        } else {
          return;
        }
      }

      if (!t.href.length) {
        return;
      }

      var m = [];
      var site;
      var v;
      var valid = 0;
      var thref = t.href.replace('%3A',':');

      if (v = thref.match(/^http:\/\/(.+)\.(allakhazam\.com|zam\.com)\/(.+)\/([^\?]+)\?(.*)$/i)) {
        m['host'] = v[1];
        m['domain'] = v[2];
        m['path'] = v[3];
        m['file'] = v[4];
        m['qs'] = v[5];
        
        if (m['host'] == 'eq2' && m['file'] == 'item.html') {
          if (z = m['qs'].match(/eq2item=([A-Za-z0-9]{32})/)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'ffxiv' && m['file'] == 'item.html') {
          if (z = m['qs'].match(/ffxivitem=(\d+)/)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'wow' && (m['file'] == 'item.html' || m['file'] == 'mob.html' || m['file'] == 'quest.html' || m['file'] == 'spell.html')) {
          var re = new RegExp('w' + m['file'].replace('.html','') + '=(\\d+)');
          if (z = m['qs'].match(re)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'war' && (m['file'] == 'item.html' || m['file'] == 'quest.html')) {
          var re = new RegExp('war' + m['file'].replace('.html','') + '=(\\d+)');
          if (z = m['qs'].match(re)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'everquest' && m['file'] == 'item.html') {
          if (z = m['qs'].match(/item=(\d+)/)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'ffxi' && m['file'] == 'item.html') {
          if (z = m['qs'].match(/fitem=(\d+)/)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'lotro' && m['file'] == 'item.html') {
          if (z = m['qs'].match(/lotritem=(\d+)/)) {
            m['id'] = z[1];
            valid = 1;
          }
        } else if (m['host'] == 'lon' && m['file'] == 'card.html') {
          if (z = m['qs'].match(/loncard=(\d+\w\d+)/)) {
            m['id'] = z[1];
            valid = 1;
          }
        }
      } else if (v = thref.match(/^http:\/\/(.+)\.(allakhazam\.com|zam\.com)\/wiki\/([^\:]+)\:([^\/\?]+)/i)) {
        m['host'] = v[1];
        m['domain'] = v[2];
        var cat = v[3];
        valid = 1;

        if (cat.match(/lon[_ ]card/i)) {
          m['site'] = 'lon';
          var card = v[4]; 
          var w = [];
          w = card.match(/%28(\d\w\d+)%29/);
          m['id'] = w[1];
          m['file'] = 'card.html';
        } else if (cat.match(/eq2[_ ]item/i)) {
          m['qs'] = 'eq2itemname=' + v[4];
          m['name'] = 'eq2itemname' + v[4]; 
        } else if (cat.match(/ffxi[_ ]item/i)) {
          m['site'] = 'ffxi';
          m['name'] = v[4];
          m['type'] = 'item';
        } else if (cat.match(/wow[_ ]mob/i)) {
          m['site'] = 'wow';
          m['name'] = v[4];
          m['type'] = 'mob';
        } else if (cat.match(/wow[_ ]quest/i)) {
          m['site'] = 'wow';
          m['name'] = v[4];
          m['type'] = 'quest';
        } else if (cat.match(/wow[_ ]item/i)) {
          m['site'] = 'wow';
          m['name'] = v[4];
          m['type'] = 'item';
        } else if (cat.match(/war[_ ]item/i)) {
          m['site'] = 'war';
          m['name'] = v[4];
          m['type'] = 'item';
        } else { 
          valid = 0; 
        }
      }
      
      if (v && valid == 1) {
        t.title = '';  //remove the title attribute from items in the forums
        
        if (!t.onmouseover) {
          t.onmousemove=onMouseMove;
          t.onmouseout=onMouseOut;
        }
        
        displayToolTip(m);
      }
    }
    
    function onMouseMove(e) {
      e=$E(e);
      showAtCursor(e);
    }
    
    function onMouseOut(e) {
      tt = null;
      itemDiv.style.display='none';
    }
    
    function displayToolTip(m) {
      tt = 1;

      if (m['id']) {
        currentId = m['id'];
      } else {
        currentId = decodeURI(m['name']);
      }
      
      var key = m['site'] + currentId + m['locale'] + m['source'] + m['type'];
      
      if (typeof items[key]=="object") { //If it's already in the items array
        showToolTip(items[key].tooltip) ;
      } else {
        if (!items[key]) {
          showLoading();
          requestToolTip(m);
        } else {
            showLoading(); 
        }
      }
    }
    
    function showToolTip(itemstr) {
      itemDiv.style.display="block";
      itemDiv.innerHTML = itemstr;
    }
    
    function requestToolTip(m) {
      var url = '';
      if (m['host']=='wow') {
        if (m['file']=='item.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/itxt.pl?tooltip=1&id=" + m['id'] + "&" + m['qs'];
        } else if (m['file']=='spell.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/spellprev.pl?id=" + m['id'] + "&" + m['qs'];
        } else if (m['file']=='quest.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/qover.pl?tooltip=1&id=" + m['id'] + "&" + m['qs'];
        } else if (m['file']=='mob.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/mobprev.pl?id=" + m['id'] + "&" + m['qs'];
        } else if (m['type']=='item' && m['name']) {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/itxt.pl?tooltip=1&name=" + m['name'];
        } else if (m['type']=='quest' && m['name']) {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/qover.pl?tooltip=1&name=" + m['name'];
        } else if (m['type']=='mob' && m['name']) {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/mobprev.pl?name=" + m['name'];
        }
      } else if (m['host']=='war') {
        if (m['file']=='item.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/iover.pl?id=" + m['id'];
        } else if (m['file']=='quest.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/qover.pl?id=" + m['id'];
        } else if (m['type']=='item' && m['name']) {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/iover.pl?name=" + m['name'];
        }
      } else if (m['host']=='lon') {
        if (m['file']=='card.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/ihtml.pl?tooltip=1&loncard=" + m['id'];
        }
      } else if (m['host']=='lotro') {
        if (m['file']=='item.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/ihtml.pl?tooltip=1&item=" + m['id'];
        }
      } else if (m['host']=='everquest') {
        if (m['file']=='item.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/ihtml.pl?tooltip=1&item=" + m['id'];
        }
      } else if (m['host']=='ffxi') {
        if (m['file']=='item.html') {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/fitem.pl?tooltip=1&id=" + m['id'];
        } else if (m['type']=='item' && m['name']) {
          url = "http://" + m['host'] + "." + m['domain'] + "/cluster/fitem.pl?tooltip=1&name=" + m['name'];
        }
      } else {
        url = "http://" + m['host'] + "." + m['domain'] + "/db/tooltip.html?" + m['qs'];
      }
      getToolTip(url);
    }

    function getToolTip(url) {
      addAkzElement(head,createAkzElement("script",{type:"text/javascript",src:url}));
    }
    
    function showLoading() {
      itemDiv.innerHTML = "";
      itemDiv.style.display = 'block'; 
    }
    
    function showAtCursor(e) {
      var obj = itemDiv;
      var maxX;
      var maxY;
      obj.style.position = "absolute";
      obj.style.display = "block";
      if (document.all && !window.opera) {
        if (document.documentElement && document.documentElement.scrollTop) {
            maxX = document.documentElement.clientWidth + document.documentElement.scrollLeft;
            maxY = document.documentElement.clientHeight + document.documentElement.scrollTop;
            y = event.clientY + document.documentElement.scrollTop;
            x = event.clientX + document.documentElement.scrollLeft;
        } else {
            y = event.clientY + document.body.scrollTop;
            x = event.clientX + document.body.scrollLeft;
        }
      } else {
        if(document.body.scrollTop) {
            maxX = window.innerWidth + document.body.scrollLeft;
            maxY = window.innerHeight + document.body.scrollTop;
        } else {
            maxX = window.innerWidth + document.documentElement.scrollLeft;
            maxY = window.innerHeight + document.documentElement.scrollTop;
        }
        y = e.pageY;
        x = e.pageX;
      }

      var divW = parseInt(obj.offsetWidth);
      var divH = parseInt(obj.offsetHeight);
      divW = divW ? divW : 400;
      divH = divH ? divH : 100;

      if (maxX && maxY) {
        while (x + divW > (maxX - 10) && x > 0) {
          x = x - (divW + 10);
        }
      
        while (y + divH > (maxY - 25) && y > 0) {
          y = y - 1;
        }
      }
      
      obj.style.left = x + 15 +"px";
      obj.style.top = y + 15 +"px";    
    }
    
    this.registerItem=function(obj) {
      var site = obj.site;
      var id;

      if (obj.key) {
        id = obj.key;
      } else if (obj.id) {
        id = obj.id;
      } else {
        id = obj.name;
        id = id.replace(/\+/g,'%2B');
      }

      var locale = typeof obj.locale != 'undefined' ? obj.locale : 'enUS';
      var source = typeof obj.source != 'undefined' ? obj.source : 'live';
      var key = site + id + locale + source;
      items[key] = obj;

      if (tt == 1 && id == currentId) {
        showToolTip(items[key].tooltip);
      }
    }
    
    function onPageShow(e) {
      if (e.persisted) {
        tt = null;
        itemDiv.style.display='none';
      }
    }
    
    function init() {
      if (!document.getElementById('tmpItemFrm')) {
        addAkzElement(body, createAkzElement("div",{id:'tmpItemFrm'}));
        document.getElementById('tmpItemFrm').style.display = 'none';
      }
      
      itemDiv = document.getElementById('tmpItemFrm');
      addAkzElement(head, createAkzElement("link",{type:"text/css",href:"http://common.zam.com/shared/tooltip.css",rel:"stylesheet"}));
      addAkzEvent(document,"mouseover",onMouseOver);
      addAkzEvent(window,"pageshow",onPageShow);
    }
    
    init();
  }
}
