addEvent(window, "load", makeNiceTitles);

var XHTMLNS = "http://www.w3.org/1999/xhtml";
var CURRENT_NICE_TITLE;
var browser = new Browser();

function makeNiceTitles() 
{
    if (!document.createElement || !document.getElementsByTagName) return;
    
    // add namespace methods to HTML DOM; this makes the script work in both
    // HTML and XML contexts.
    if(!document.createElementNS)
    {
        document.createElementNS = function(ns,elt) 
        {
            return document.createElement(elt);
        }
    }

    if( !document.links )
    {
        document.links = document.getElementsByTagName("a");
    }
    for (var ti=0;ti<document.links.length;ti++) 
    {
        var lnk = document.links[ti];
        if (lnk.title) 
        {
            lnk.setAttribute("nicetitle",lnk.title);
            lnk.removeAttribute("title");
            addEvent(lnk,"mouseover",showNiceTitle);
            addEvent(lnk,"mouseout",hideNiceTitle);
            addEvent(lnk,"focus",showNiceTitle);
            addEvent(lnk,"blur",hideNiceTitle);
        }
    }
    var instags = document.getElementsByTagName("ins");
    if (instags) 
    {
    for (var ti=0;ti<instags.length;ti++) 
    {
        var instag = instags[ti];
        if (instag.dateTime) 
        {
            var strDate = instag.dateTime;
            var dtIns = new Date(strDate.substring(0,4),parseInt(strDate.substring(4,6)-1),strDate.substring(6,8),strDate.substring(9,11),strDate.substring(11,13),strDate.substring(13,15));
            instag.setAttribute("nicetitle","Added on "+dtIns.toString());
            addEvent(instag,"mouseover",showNiceTitle);
            addEvent(instag,"mouseout",hideNiceTitle);
            addEvent(instag,"focus",showNiceTitle);
            addEvent(instag,"blur",hideNiceTitle);
        }
    }
    }
}

function findYPosition( oLink ) 
{
  if( oLink.offsetParent ) 
  {
    for( var posX = 0, posY = 0; oLink.offsetParent; oLink = oLink.offsetParent ) 
    {
      posY += oLink.offsetTop;
    }
    return posY;
  } 
  else 
  {
    return oLink.y;
  }
}

function showNiceTitle(e) 
{
    if (CURRENT_NICE_TITLE) hideNiceTitle(CURRENT_NICE_TITLE);
    
    if (!document.getElementsByTagName) return;
    
    if (window.event && window.event.srcElement) 
    {
        lnk = window.event.srcElement
    } 
    else if (e && e.target) 
    {
        lnk = e.target
    }
    if (!lnk) return;
    if (lnk.nodeType == 3) 
    {
        // lnk is a textnode -- ascend parents until we hit a link
        lnk = getParent(lnk,"A");
    }
    if (!lnk) return;
    nicetitle = lnk.getAttribute("nicetitle");
    
    var d = document.createElementNS(XHTMLNS, "div");
    
    d.className = "nicetitle";
    tnt = document.createTextNode(nicetitle);
    pat = document.createElementNS(XHTMLNS, "div");
    pat.className = "glossaryDefinition";
    pat.appendChild(tnt);
    d.appendChild(pat);
    
    if (lnk.innerHTML)
    {
        tnd = document.createTextNode(lnk.innerHTML);
        pad = document.createElementNS(XHTMLNS, "div");
        pad.className = "glossaryTermTitle";
        pad.appendChild(tnd);
        d.insertBefore(pad, pat);
    }
    
    STD_WIDTH = 300;
    if (lnk.href) 
    {
        h = lnk.href.length;
    } 
    else 
    { 
		h = nicetitle.length; 
    }
    if (nicetitle.length) 
    {
      t = nicetitle.length;
    }
    h_pixels = h*6; t_pixels = t*10;
    
    if (h_pixels > STD_WIDTH) 
    {
        w = h_pixels;
    } 
    else if ((STD_WIDTH>t_pixels) && (t_pixels>h_pixels)) 
    {
        w = t_pixels;
    } 
    else if ((STD_WIDTH>t_pixels) && (h_pixels>t_pixels)) 
    {
        w = h_pixels;
    } 
    else 
    {
        w = STD_WIDTH;
    }
        
    d.style.width = '250px';    

    var my = findYPosition(lnk);
    var mx = e.clientX;
    
	var docSize = getViewableDocumentSize();
	var x = docSize[0];
	var y = docSize[1];

    var padY = 35;
    var padX = 10;
    d.style.left = mx + 'px';
    d.style.top = (my+padY) + 'px';
    if((e.clientY + h + padY) > y)
    {
		d.style.top = (my - h) + 'px';
    }
    if((mx + w) > x)
    {
		d.style.left = (x - w - padX) + 'px';
    }
    
    document.getElementsByTagName("body")[0].appendChild(d);
    
    CURRENT_NICE_TITLE = d;
}

function hideNiceTitle(e) 
{
    if (!document.getElementsByTagName) return;
    if (CURRENT_NICE_TITLE) 
    {
		hideIt();
    }
}

//called by a setTimeout to allow a slight delay before hiding.
function hideIt()
{
	document.getElementsByTagName("body")[0].removeChild(CURRENT_NICE_TITLE);
    CURRENT_NICE_TITLE = null;
}

// Add an eventListener to browsers that can do it somehow.
// Originally by the amazing Scott Andrew.
function addEvent(obj, evType, fn)
{
  if (obj.addEventListener)
  {
    obj.addEventListener(evType, fn, true);
    return true;
  } 
  else if (obj.attachEvent)
  {
	var r = obj.attachEvent("on"+evType, fn);
    return r;
  } 
  else 
  {
	return false;
  }
}

function getParent(el, pTagName) 
{
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}

function getViewableDocumentSize()
{
	var x,y;
	if (self.innerHeight) // all except Explorer
	{
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	return[x,y];
}

// Determine browser and version.
function Browser() 
{
	// blah, browser detect, but mouse-position stuff doesn't work any other way
  var ua, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) 
  {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) 
  {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.
  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) 
  {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}