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;
      var m = [];
      var v;
      var site;
      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;}
      if(v = t.href.match(/^http:\/\/([^.]+).*[^.]*\.allakhazam\.com\/db\/(item|card).html\?(.*)/i)) {
        var pairs = v[3].split(/[;&]/);
        var tmp;
        var key, value;
        var valid = 1;
        var site;
        m['site'] = v[1];
        for(i=0;i<pairs.length;i++){
          tmp = pairs[i].split('=');
          key = tmp[0];
          value = tmp[1];
          if(value.indexOf('#')>0) valid = 0;
          if(/^wow/.test(m['site']) && key == 'witem') m['id'] = value;
          else if(/^war/.test(m['site']) && key == 'waritem') m['id'] = value;
          else if(/^war/.test(m['site']) && key == 'waritemname') m['name'] = value;
          else if(m['site'] == 'lotro' && key == 'lotritem') m['id'] = value;
          else if(m['site'] == 'everquest' && key == 'item') m['id'] = value;
          else if(/^eq2/.test(m['site']) && key == 'eq2iname') m['name'] = value;
          else if(/^eq2/.test(m['site']) && key == 'eq2item') m['id'] = value;
          else if(m['site'] == 'ffxi' && key == 'fitem') m['id'] = value;
          else if(m['site'] == 'lon' && key == 'loncard') m['id'] = value;
          else if(key == 'locale') m['locale'] = value;
          else if(key == 'source') m['source'] = value;
          else valid = 0;
        }
        m['locale'] = typeof m['locale'] != 'undefined' ? m['locale'] : 'enUS';
        m['source'] = typeof m['source'] != 'undefined' ? m['source'] : 'live';
        m['type'] = typeof m['type'] != 'undefined' ? m['type'] : 'item';
      } else if (v = t.href.match(/^http:\/\/([^.]+).*[^.]*\.allakhazam\.com\/db\/quest.html\?(.*)/i)) {
        var pairs = v[2].split(/[;&]/);
        var tmp
        var key, value
        var valid = 1;
        var site;
        m['site'] = v[1];
        for(i=0;i<pairs.length;i++){
          tmp = pairs[i].split('=');
          key = tmp[0];
          value= tmp[1];
          if(value.indexOf('#')>0) valid = 0;
          if(/^wow/.test(m['site']) && key == 'wquest') {m['id'] = value; m['type'] = 'quest';}
          if(/^war/.test(m['site']) && key == 'warquest') {m['id'] = value; m['type'] = 'quest';}
          else if(key == 'locale') m['locale'] = value;
          else if(key == 'source') m['source'] = value;
          else valid = 0;
        }
         m['locale'] = typeof m['locale'] != 'undefined' ? m['locale'] : 'enUS';
         m['source'] = typeof m['source'] != 'undefined' ? m['source'] : 'live';
      } else if (v = t.href.match(/^http:\/\/([^.]+).*[^.]*\.allakhazam\.com\/db\/mob.html\?(.*)/i)) {
        var pairs = v[2].split(/[;&]/);
        var tmp
        var key, value
        var valid = 1;
        var site;
        m['site'] = v[1];
        for(i=0;i<pairs.length;i++){
          tmp = pairs[i].split('=');
          key = tmp[0];
          value= tmp[1];
          if(value.indexOf('#')>0) valid = 0;
          if(/^wow/.test(m['site']) && key == 'wmob') {m['id'] = value; m['type'] = 'mob';}
          else if(key == 'locale') m['locale'] = value;
          else if(key == 'source') m['source'] = value;
          else valid = 0;
        }
         m['locale'] = typeof m['locale'] != 'undefined' ? m['locale'] : 'enUS';
         m['source'] = typeof m['source'] != 'undefined' ? m['source'] : 'live';
      } else if (v = t.href.match(/^http:\/\/([^.]+).*[^.]*\.allakhazam\.com\/db\/spell.html\?(.*)/i)) {
        var pairs = v[2].split(/[;&]/);
        var tmp
        var key, value
        var valid = 1;
        var site;
        m['site'] = v[1];
        for(i=0;i<pairs.length;i++){
          tmp = pairs[i].split('=');
          key = tmp[0];
          value= tmp[1];
          if(value.indexOf('#')>0) valid = 0;
          if(/^wow/.test(m['site']) && key == 'wspell') {m['id'] = value; m['type'] = 'spell';}
          else if(key == 'locale') m['locale'] = value;
          else if(key == 'source') m['source'] = value;
          else valid = 0;
        }
         m['locale'] = typeof m['locale'] != 'undefined' ? m['locale'] : 'enUS';
         m['source'] = typeof m['source'] != 'undefined' ? m['source'] : 'live';
      } else if (v = t.href.match(/^http:\/\/[^.]+.*[^.]*\.allakhazam\.com\/wiki\/([^\:]+)\:([^\/\?]+)/i)) {
        var valid = 1;
        var cat = v[1];
        if(cat.match(/lon[_ ]card/i)) {
          m['site'] = 'lon';
          var card = v[2]; 
          var w = [];
          w = card.match(/%28(\d\w\d+)%29/);
          m['id'] = w[1];
        } else if (cat.match(/eq2[_ ]item/i)) {
          m['site'] = 'eq2';
          m['name'] = v[2];
        } else if (cat.match(/ffxi[_ ]item/i)) {
          m['site'] = 'ffxi';
          m['name'] = v[2];
          m['type'] = '';
        } else if (cat.match(/wow[_ ]mob/i)) {
          m['site'] = 'wow';
          m['name'] = v[2];
          m['type'] = 'mob';
        } else if (cat.match(/wow[_ ]quest/i)) {
          m['site'] = 'wow';
          m['name'] = v[2];
          m['type'] = 'quest';
        } else if (cat.match(/wow[_ ]item/i)) {
          m['site'] = 'wow';
          m['name'] = v[2];
          m['type'] = 'item';
        } else if (cat.match(/war[_ ]item/i)) {
          m['site'] = 'war';
          m['name'] = v[2];
          m['type'] = 'item';
        } else {
          valid = 0;
        }
        
        if(m['name']) {
          m['name'] = m['name'].replace(/\+/g, '%2B');
        }
        m['locale'] = 'enUS';
        m['source'] = 'live';
      }
      
      if (v && valid == 1) {
        if (v2 = t.href.match(/^http:\/\/([^.]+)(.*[^.]*)\.allakhazam\.com\/.*/i)) m['site'] = m['site'] + v2[2];
        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) {
      if(/^wow/.test(m['site']) && m['type'] == 'item' && m['id']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/itxt.pl?tooltip=1;id="+m['id']+";locale="+m['locale']+";source="+m['source']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'item' && m['name']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/itxt.pl?tooltip=1;name="+m['name']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'quest' && m['id']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/qover.pl?tooltip=1;quest="+m['id']+";locale="+m['locale']+";source="+m['source']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'quest' && m['name']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/qover.pl?tooltip=1;name="+m['name']+";locale="+m['locale']+";source="+m['source']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'mob' && m['id']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/mobprev.pl?id="+m['id']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'mob' && m['name']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/mobprev.pl?name="+m['name']);
      } else if(/^wow/.test(m['site']) && m['type'] == 'spell') {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/spellprev.pl?id="+m['id']);
      } else if(m['site'] == 'lotro') {
        getToolTip("http://lotro.allakhazam.com/cluster/ihtml.pl?tooltip=1;item="+m['id']);
      } else if(m['site'] == 'everquest') {
        getToolTip("http://everquest.allakhazam.com/cluster/ihtml.pl?tooltip=1;item="+m['id']+";source="+m['source']);
      } else if(/^eq2/.test(m['site']) && m['id']) {
        getToolTip("http://eq2.allakhazam.com/cluster/eq2item.pl?tooltip=1;eq2item="+m['id']);
      } else if(/^eq2/.test(m['site']) && m['name']) {
        getToolTip("http://eq2.allakhazam.com/cluster/eq2item.pl?tooltip=1;name="+m['name']);
      } else if(m['site'] == 'ffxi' && m['id']) {
        getToolTip("http://ffxi.allakhazam.com/cluster/fitem.pl?tooltip=1;id="+m['id']);
      } else if(m['site'] == 'ffxi' && m['name']) {
        getToolTip("http://ffxi.allakhazam.com/cluster/fitem.pl?tooltip=1;name="+m['name']);
      } else if(m['site'] == 'lon') {
        getToolTip("http://lon.allakhazam.com/cluster/ihtml.pl?tooltip=1;loncard="+m['id']);
      } else if(/^war/.test(m['site']) && m['type'] == 'item' && m['id']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/iover.pl?id="+m['id']);
      } else if(/^war/.test(m['site']) && m['type'] == 'item' && m['name']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/iover.pl?name="+m['name']);
      } else if(/^war/.test(m['site']) && m['type'] == 'quest' && m['id']) {
        getToolTip("http://"+m['site']+".allakhazam.com/cluster/qover.pl?id="+m['id']);
      }
    }

    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 - 10) && y > 0) {
          y = y - 1;
        }
      }
      obj.style.left = x + 5 +"px";
      obj.style.top = y + 5 +"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.allakhazam.com/shared/tooltip.css",rel:"stylesheet"}));
      addAkzEvent(document,"mouseover",onMouseOver);
      addAkzEvent(window,"pageshow",onPageShow);
    }
    init();
  }
}

