/* @title Sweet Titles (c) Creative Commons 2005
 * @tutorial http://creativecommons.org/licenses/by-sa/2.5/
 * @author Dustin Diaz | http://www.dustindiaz.com
// * @author Paul Clarke
// * @update Paul Clarke, to fix ie offset and kill old tips if called twice
// * @update PC again, 29/08/07 to not conflict with thickbox
// * @update PC again, 23/01/08 to show over select boxes on ie. Roll back to toolTipLib.js.20071829 if there's a problem
// * @update PC again, 20/05/08 trying ie fix again
 */

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','input'],	// @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
	msie : 0,					// @Number: 1 if we're in ie, 0 if we're not
	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.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 ) {
						if ((	! c[j].className ) || ( c[j].className.indexOf('thickbox') == -1 && c[j].className.indexOf('noSweetTitle') == -1 )) {
							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 );
			sweetTitles.msie = navigator.userAgent.toLowerCase().indexOf("msie") < 0 ? 0 : 1;
		}
	},
	debug: function ( v ) {
		window.console && console.log && console.log( v );
	},
	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';
		if (	sweetTitles.msie ) {
			sweetTitles.closeShim();
		}
	},
	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);
		if (	sweetTitles.msie ) {
			this.openShim();
		}
	},
	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)";
		}
	},
	openShim: function() {
		if(this.tip == null) return null;
		var shim = sweetTitles.createShim();
		this.tip.style.zIndex = 100;
		shim.style.width = this.tip.offsetWidth;
		shim.style.height = this.tip.offsetHeight;
		shim.style.top = this.tip.style.top;
		shim.style.left = this.tip.style.left;
		shim.style.zIndex = this.tip.style.zIndex -1;
		shim.style.position = 'absolute';
		shim.style.display = 'block';
	},
	createShim: function() {
		if(this.tip == null) return null;
		var shim = document.createElement("iframe");
		shim.setAttribute('src', 'javascript:false;');
		shim.setAttribute('scrolling', 'no');
		shim.setAttribute('frameborder', '0');
		shim.setAttribute('style.position', 'absolute');
		shim.setAttribute('style.top', '0px');
		shim.setAttribute('style.left', '0px');
		shim.setAttribute('display', 'none');
		shim.name = sweetTitles.getShimId();
		shim.id = sweetTitles.getShimId();
		shim.style.filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
		window.document.body.appendChild(shim);
		return shim;
	},
	closeShim: function() {
		if(this.tip==null) return;
		var shim = sweetTitles.getShim();	
		// sweetTitles.debug( 'removing ' + shim );
		if(shim != null) window.document.body.removeChild(shim);
	},
	getShimId: function() {
		if(this.tip.id == null) return '__shim';
		return '__shim'+this.tip.id;
	},
	getShim: function() {
		return document.getElementById(sweetTitles.getShimId());
	},
	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() } );
