var tt = {

	/*
	 * Set the offsetX and offsetY to the distance the tooltip
	 * should appear from the pointer (in pixels). The delay is
	 * the number of milliseconds before the tooltip disappears
	 * after mousing off of the tooltip trigger.
	 */
	'settings': {
		'offsetX': 15,
		'offsetY': 15,
		'delay': 250
	},

	'environment': {
		'isOpera': window.opera,
		'isSafari': !window.opera && navigator.userAgent.indexOf('Safari') != -1
	},

	/*
	 * This function installs the listeners and adds a tooltip div
	 */
	init: function() {
	  if (!document.getElementById || !document.getElementsByTagName || !document.createTextNode || !document.createElement) {
		return;
	  }
	  

         
	/*
	 * DC: This will allow for mulitple dynamiclly created tooltips of the same type.
	 *     The first loop grabs all the tooptips defined in tooltipSet so we can grab the element(s) that are defined on the page
	 *     with the same name attribute and put the element(s) into an array to loop through. The second loop goes through each element adding
	 *     adding it to the event handlers.
	 */
	 
	  for (var i in tooltipSet) {
	    
		var elementArray = document.getElementsByName(i);
		for(i=0; i < elementArray.length; i++){		
		   tt.addEvent(elementArray[i], 'mouseover', tt.handleMouseover, false);
		   tt.addEvent(elementArray[i], 'mouseout', tt.handleMouseout, false);
		}
	  }
        
          
          
	  var tooltip = document.createElement('div');
	  tooltip.id = 'tooltip';

	  var body = document.getElementsByTagName('body').item(0);
	  body.appendChild(tooltip);

	},


	/*
	 * This function causes the tooltip to appear
	 * DC: Modified for the use of a custom SPAN tag "name", this will allow for mulitple tooltip of the same type
	 *
	 */
	handleMouseover: function(e) {

	  // Cross-browser way to find element from event object
	  var el;
	  
	  if (window.event && window.event.srcElement) {
		el = window.event.srcElement;
	  }
	  if (e && e.target) {
		el = e.target;
	  }
	  if (!el) {
		return;
	  }
	  while (el.nodeName.toLowerCase() != 'a' && el.nodeName.toLowerCase() != 'img' && el.nodeName.toLowerCase() != 'body') {
		el = el.parentNode;
	  }

	  var tooltip = document.getElementById('tooltip');
	  if (tooltip.style.visibility == 'visible') {
		clearTimeout(TT_TIMEOUT);
	  }
	  
	  tooltip.innerHTML = tooltipSet[el.name]['contents']; // DC //

	  var posX = e.clientX;
	  if (tt['environment']['isOpera']) {
	  	posX += document.documentElement.scrollLeft;
	  } else {
	  	posX += document.documentElement.scrollLeft + document.body.scrollLeft;
	  }
	  posX += tt['settings']['offsetX'];
	  if (posX + tooltip.offsetWidth > document.body.offsetWidth) {
		posX = e.clientX - tt['settings']['offsetX'] - tooltip.offsetWidth;
		posX = posX < 0 ? 0 : posX;
	  }
	  tooltip.style.left = posX + 'px';

	  var posY = e.clientY
	  if (tt['environment']['isOpera']) {
	  	posY += document.documentElement.scrollTop;
	  } else {
	  	posY += document.documentElement.scrollTop + document.body.scrollTop;
	  }
	  posY += tt['settings']['offsetY'];
	  if (posY + tooltip.offsetHeight > document.body.offsetHeight) {
		posY = posY - tt['settings']['offsetY'] - tooltip.offsetHeight;
		posY = posY < 0 ? 0 : posY;
	  }
	  tooltip.style.top = posY + 'px';

	  tooltip.style.visibility = 'visible';

	  // Code to prevent the propagation of events up the DOM
	  if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	  }
	  if (e && e.stopPropagation && e.preventDefault) {
		e.stopPropagation();
		e.preventDefault();
	  }
	},


	/*
	 * This function causes the tooltip to disappear
	 */
	handleMouseout: function(e) {

	  var tooltip = document.getElementById('tooltip');
	  function hideTooltip() {
		tooltip.style.visibility = 'hidden';
	  }

	  TT_TIMEOUT = setTimeout(hideTooltip, tt['settings']['delay']);

	  // Code to prevent the propagation of events up the DOM
	  if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	  }
	  if (e && e.stopPropagation && e.preventDefault) {
		e.stopPropagation();
		e.preventDefault();
	  }
	},

	/*
	 * This is a supporting function used to install event listeners
	 * Added a Try catch to stop a JS error on dynamic pages when states do not require one
	 *
	 * DC: Added try catch as tooltipSet may be defined but not used, preventing elm has no object JS error
	 */
	addEvent: function(elm, evType, fn, useCapture) {
	  // cross-browser event handling for IE5+, NS6 and Mozilla
	  // By Scott Andrew
	  try{ 
	  if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	  } else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	  } else {
		elm['on' + evType] = fn;
	  }
	  }catch(e) {
	  alert(e);
	  
	  }
	}
}; /* close tt object literal */

tt.addEvent(window, 'load', tt.init, false);