/*	Sweet Titles (c) Creative Commons 2005
	http://creativecommons.org/licenses/by-sa/2.5/
	Author: Dustin Diaz | http://www.dustindiaz.com
*/
var sweetTitles = { 
	xCord : 0,						// @Number: x pixel value of current cursor position
	yCord : 0,						// @Number: y pixel value of current cursor position
	tipElements : ['a','abbr','acronym'],			// @Array: Allowable elements that can have the toolTip
	obj : Object,						// @Element: That of which you're hovering over
	tip : Object,						// @Element: The actual toolTip itself
	overAnchor : false,					// @Number: 0: Not Active || 1: Active
	overHover : false,					// @Number: 0: Not Active || 1: Active
	baseDomain : window.baseDomain || location.hostname,	// @String: domain name, internal or external link
	init : function() {
		var d = document;
		if (	d.getElementById && d.createElement && d.getElementsByTagName ) {
			this.tip = d.createElement('div');
			this.tip.id = 'toolTip';
			d.getElementsByTagName('body')[0].appendChild( this.tip );
			this.tip.style.top = '0';
			this.tip.style.position = 'absolute';
			this.tip.style.visibility = 'hidden';
			this.addEvent( this.tip, 'mouseover', this.hoverOver, false );
			this.addEvent( this.tip, 'mouseout', this.hoverOut, false );
			for (	var i = 0; i < this.tipElements.length; i ++ ) {
				var c = d.getElementsByTagName( this.tipElements[i] );
				var curLen = c.length;
				for (	var j = 0; j < curLen; j ++ ) {
					if (    c[j].href && c[j].href.toString().indexOf( this.baseDomain ) != -1 ) {
						c[j].setAttribute('iox','internal');
					}
					if (    c[j].title ) {
						this.addEvent(c[j],'mouseover',this.tipOver,false);
						this.addEvent(c[j],'mouseout',this.tipOut,false);
						this.addEvent(c[j],'click',this.tipOut,false);
						c[j].setAttribute('tip',c[j].title);
						c[j].removeAttribute('title');
						c[j].className = c[j].className + ' sweetTitle'; 
					}
				}
			}
			this.addEvent( d, 'mousemove', this.updateXY, false );
		}
	},
	updateXY : function(e) {
		if (	document.captureEvents ) {
			sweetTitles.xCord = e.pageX;
			sweetTitles.yCord = e.pageY;
		}
		else if ( window.event.clientX ) {
			sweetTitles.xCord = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft );
			sweetTitles.yCord = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop );
		}
	},
	inBounds: function( title ) {
		var border = 1;
		var left = parseInt( this.tip.style.left ) + border;
		var top = parseInt( this.tip.style.top ) + border;
		var bottom = parseInt( this.tip.style.top ) + parseInt( this.tip.offsetHeight ) - border;
		var right = parseInt( this.tip.style.left ) + parseInt( this.tip.offsetWidth ) - border;
		var x = this.xCord;
		var y = this.yCord;
		var report = title + ' ';
		// report += '(' + x + ',' + y + ') / (' + left + ', ' + top + '), (' + right + ', ' + bottom + ') ';
		// var test = sweetTitles.overAnchor + ' || ' + sweetTitles.overHover + ' || (' + ( x >= left ) + ' && ' + ( x <= right ) + ' && ' + ( y >= top ) + ' && ' + ( y <= bottom ) + ')';
		var test = this.overAnchor + ' || ' + this.overHover + ' || ((' + x + ' >= ' + left + ') && (' + x + ' < ' + right + ') && (' + y + ' >= ' + top + ') && (' + y + ' < ' + bottom + '))';
		// report += test;
		var result = eval( test );
		// report += ' result is ' + result;
		// d( report );
		return result;
	},
	tipOut: function() {
		// if (	window.tID ) {
		// 	clearTimeout(tID);
		// }
		// if (	window.opacityID ) {
		// 	clearTimeout(opacityID);
		// }
		this.overAnchor = false;
		if (	! sweetTitles.inBounds( 'tipOut' )) {
			sweetTitles.tipHide( );
		}
	},
	tipHide: function() {
		if (	window.tID ) {
			clearTimeout(tID);
		}
		if (	window.opacityID ) {
			clearTimeout(opacityID);
		}
		sweetTitles.tip.style.visibility = 'hidden';
	},
	checkNode : function() {
		var trueObj = this.obj;
		if (	this.tipElements.inArray( trueObj.nodeName.toLowerCase( ))) {
			return trueObj;
		}
		else {	return trueObj.parentNode;
		}
	},
	tipOver : function( e ) {
		sweetTitles.obj = this;
		tID = window.setTimeout("sweetTitles.tipShow()",150);
		sweetTitles.updateXY(e);
		this.overAnchor = true;
		// this.overHover = true;
		// d( 'tipOver, ' );
	},
	hoverOver : function( e ) {
		// d( 'hoverOver, ' );
		this.overHover = true;
	},
	hoverOut : function( e ) {
		this.overHover = false;
		if (	! sweetTitles.inBounds( 'hoverOut' )) {
			sweetTitles.tipHide( );
		}
	},
	tipShow : function() {		
		var scrX = Number(this.xCord);
		var scrY = Number(this.yCord);
		var tp = parseInt(scrY+2);
		var lt = parseInt(scrX+2);
		var anch = this.checkNode();
		var a = '';
		var access = ( anch.accessKey ? ' <span>['+anch.accessKey+']</span> ' : '' );
		if (	anch.nodeName.toLowerCase() == 'a' ) {
			var h = anch.href.toString();
			a = ( h.indexOf('http://') == 0 ? h.substring( 7, h.length ) : h );
			a = ( a.indexOf('www.') == 0 ? a.substring( 4, a.length ) : a );
			a = ( a.length > 50 ? a.toString().substring(0,50)+"..." : a );
			a = '<' + 'a href="' + h + '">' + a + '<' + '/a>';
		}
		this.tip.innerHTML = anch.getAttribute('tip');
		// this.tip.innerHTML += "<em>"+access+a+"</em>";
		if (	parseInt(document.documentElement.clientWidth+document.documentElement.scrollLeft) < parseInt(this.tip.offsetWidth+lt) ) {
			this.tip.style.left = parseInt(lt-(this.tip.offsetWidth+25))+'px';
		}
		else {	this.tip.style.left = lt+'px';
		}
		if (	parseInt(document.documentElement.clientHeight+document.documentElement.scrollTop) < parseInt(this.tip.offsetHeight+tp) ) {
			this.tip.style.top = parseInt(tp-(this.tip.offsetHeight+25))+'px';
		}
		else {	this.tip.style.top = tp+'px';
		}
		this.tip.style.visibility = 'visible';
		this.tip.style.opacity = '.1';
		this.tipFade(10);
	},
	tipFade: function( opac ) {
		var passed = parseInt(opac);
		var newOpac = parseInt(passed+10);
		if (	newOpac < 80 ) {
			this.tip.style.opacity = '.'+newOpac;
			this.tip.style.filter = "alpha(opacity:"+newOpac+")";
			opacityID = window.setTimeout("sweetTitles.tipFade('"+newOpac+"')",20);
		}
		else {	this.tip.style.opacity = '.80';
			this.tip.style.filter = "alpha(opacity:80)";
		}
	},
	addEvent: function( obj, type, fn ) { /* may be in an external library, just trying to keep this self contained */
		if (	obj.addEventListener ) {
			obj.addEventListener( type, fn, false );
			this.EventCache.add(obj, type, fn);
		}
		else if ( obj.attachEvent ) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
			this.EventCache.add(obj, type, fn);
		}
		else {	obj["on"+type] = obj["e"+type+fn];
		}
	},
	EventCache:  function() { /* may be in an external library, just trying to keep this self contained */
		var listEvents = [];
		return {
			listEvents : listEvents,
			add : function( node, sEventName, fHandler ){
				listEvents.push( arguments );
			},
			flush : function(){
				for (	var i = listEvents.length - 1; i >= 0; i = i - 1 ){
					var item = listEvents[i];
					if (	item[0].removeEventListener ){
						item[0].removeEventListener(item[1], item[2], item[3]);
					}
					if (	item[1].substring(0, 2) != "on" ){
						item[1] = "on" + item[1];
					}
					if (	item[0].detachEvent ){
						item[0].detachEvent( item[1], item[2] );
					}
					item[0][item[1]] = null;
				};
			}
		};
	}()
};
sweetTitles.addEvent( window, 'load', function () { sweetTitles.init() } );
sweetTitles.addEvent( window, 'unload', function () { sweetTitles.EventCache.flush() } );

