/*	Sweet Titles (c) Creative Commons 2005
	http://creativecommons.org/licenses/by-sa/2.5/
	Author: Dustin Diaz | http://www.dustindiaz.com
	Updated: Paul Clarke
*/
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', 'div'],	// @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
	init : function() {
		var d = document;
		if (	d.getElementById && d.createElement && d.getElementsByTagName ) {
			var oldTip = d.getElementById( 'toolTip' );
			try {	d.body.removeChild( oldTip );
			}
			catch ( e ) {
				// there was no old tip
			}
			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.tipOut();
			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].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) {
		var d = document;
		if (	d.captureEvents ) {
			sweetTitles.xCord = e.pageX;
			sweetTitles.yCord = e.pageY;
		}
		else if ( window.event.clientX ) {
			sweetTitles.xCord = e.clientX + ( d.documentElement.scrollLeft || d.body.scrollLeft );
			sweetTitles.yCord = e.clientY + ( d.documentElement.scrollTop || d.body.scrollTop );
		}
	},
	tipOut: 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()",50);
		sweetTitles.updateXY(e);
	},
	tipShow : function() {		
		var scrX = Number(this.xCord);
		var scrY = Number(this.yCord);
		var tp = parseInt(scrY+10);
		var lt = parseInt(scrX+10);
		var anch = this.checkNode();
		// var addy = '';
		// var access = '';
		this.tip.innerHTML = anch.getAttribute('tip');
		// this.tip.innerHTML += "<em>"+access+addy+"</em>";
		var d = document;
		if (	parseInt( d.documentElement.clientWidth + d.documentElement.scrollLeft ) < parseInt( this.tip.offsetWidth + lt )) {
			lt = parseInt(lt-(this.tip.offsetWidth+25));
		}
		this.tip.style.left = lt+'px';
		if (	parseInt(d.documentElement.clientHeight + d.documentElement.scrollTop ) < parseInt( this.tip.offsetHeight + tp )) {
			tp = parseInt(tp-(this.tip.offsetHeight+25));
		}
		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;
				};
			}
		};
	}()
};
function toolTip () { // old tool tip
}
function stm () { // old tool tip
}
function htm () { // old tool tip
}
if (	! window.Text ) {
	Text = []; // old tool tip require array
}
if (	! window.Style ) {
	Style = []; // old tool tip require array
}
Array.prototype.inArray = function( testStr ) {
	/* Returns true if the passed value is found in the array. Returns false if it is not. */
	for ( index = 0; index < this.length; index++ ) {
		if ( this[index] === testStr ) { /* === matches with type checking */
			return true;
		}
	}
	return false;
};
sweetTitles.addEvent( window, 'load', function () { sweetTitles.init() } );
sweetTitles.addEvent( window, 'unload', function () { sweetTitles.EventCache.flush() } );

