var Tips = new Class({
 
	getOptions: function(){
		return {
			onShow: function(tip){
				tip.setStyle('visibility', 'visible');
			},
			onHide: function(tip){
				tip.setStyle('visibility', 'hidden');
			},
			maxTitleChars: 30,
			showDelay: 100,
			hideDelay: 100,
			className: 'tool',
			offsets: {'x': 16, 'y': 16},
			fixed: false
		};
	},
 
	initialize: function(elements, options){
		// this checks for IE 5 and 6, then adds an iframe to the document to act as a shim 
		if (/MSIE (5.5|6.)/.test(navigator.userAgent)) { 
			if(!$('DivShim')){ 
				var divShimProperties = {
					'id': "DivShim", 
					'src': "javascript: document.write('');",
					'scrolling': "no",
					'frameborder': 0
				}; 
				var divShimStyles = {
					'position': "absolute",
					'top': "0px",
					'left': "0px",
					'display': "none", 
					'font-size': "6px", 
					'padding': "0px"
				}; 
				var divShim = new Element('iframe').setProperties(divShimProperties).setStyles(divShimStyles);
				divShim.injectInside(document.body); 
			} 
		} 
 
		this.setOptions(this.getOptions(), options);
		this.toolTip = new Element('div').addClass(this.options.className+'-tip').setStyles({
			'position': 'absolute',
			'top': '0',
			'left': '0',
			'visibility': 'hidden'
		}).injectInside(document.body);
		this.wrapper = new Element('div').injectInside(this.toolTip);
		$each(elements, function(el){
			this.build($(el));
		}, this);
		if (this.options.initialize) this.options.initialize.call(this);
	},
 
	build: function(el){
		el.myTitle = el.href ? el.href.replace('http://', '') : (el.rel || false);
		if (el.title){
			var dual = el.title.split('::');
			if (dual.length > 1) {
				el.myTitle = dual[0].trim();
				var text = dual[1].trim();
				textarr = text.split('##');
				if( text.length > 1 ){
					el.myText = textarr.join('<br />');	
				} else {
					el.myText = text;
				}
			} else {
				el.myText = el.title;
			}
			el.removeAttribute('title');
		} else {
			el.myText = false;
		}
		if (el.myTitle && el.myTitle.length > this.options.maxTitleChars) el.myTitle = el.myTitle.substr(0, this.options.maxTitleChars - 1) + "&hellip;";
		el.addEvent('mouseover', function(event){
			this.start(el);
			this.locate(event);
		}.bindWithEvent(this));
		if (!this.options.fixed) el.addEvent('mousemove', this.locate.bindWithEvent(this));
		el.addEvent('mouseout', this.end.bindWithEvent(this));
	},
 
	start: function(el){
		this.wrapper.setHTML('');
		if (el.myTitle){
			new Element('span').injectInside(
				new Element('div').addClass(this.options.className+'-title').injectInside(this.wrapper)
			).setHTML(el.myTitle);
		}
		if (el.myText){
			new Element('span').injectInside(
				new Element('div').addClass(this.options.className+'-text').injectInside(this.wrapper)
			).setHTML(el.myText);
		}
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
	},
 
	end: function(event){
		$clear(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this);
		event.stop();
	},
 
	locate: function(event){
		var win = {'x': window.getWidth(), 'y': window.getHeight()};
		var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
		var tip = {'x': this.toolTip.offsetWidth, 'y': this.toolTip.offsetHeight};
		var prop = {'x': 'left', 'y': 'top'};
		for (var z in prop){
			var pos = event.page[z] + this.options.offsets[z];
			if ((pos + tip[z] - scroll[z]) > win[z]) pos = event.page[z] - this.options.offsets[z] - tip[z];
			this.toolTip.setStyle(prop[z], pos + 'px');
		};
 
		this.toolTip.setStyle('z-index', 1000);
 
		// added the zindex here 
		// make sure the iframe moves with our tooltip
		if (/MSIE (5.5|6.)/.test(navigator.userAgent)) { 
			$('DivShim').setStyle('z-index', 999);
			for (var z in prop) {
				var pos = event.page[z] + this.options.offsets[z];
				if ((pos + tip[z] - scroll[z]) > win[z]) pos = event.page[z] - this.options.offsets[z] - tip[z];
				$('DivShim').setStyle(prop[z], pos + 'px');
			}
		} 
		event.stop();
	},
 
	show: function(){
		if (/MSIE (5.5|6.)/.test(navigator.userAgent)) { 
			var IfrRef = $('DivShim'); 
			var myValues = this.toolTip.getCoordinates();
 
			IfrRef.style.width = myValues['width'] + "px";
			IfrRef.style.height = myValues['height'] + "px";
			IfrRef.style.display = "block";
		} 
		this.fireEvent('onShow', [this.toolTip]);
	},
 
	hide: function(){
		if (/MSIE (5.5|6.)/.test(navigator.userAgent)) { 
			var IfrRef = $('DivShim'); 
			//IfrRef.style.display = "none"; 
		} 
		this.fireEvent('onHide', [this.toolTip]);
	}
 
});
 
Tips.implement(new Events);
Tips.implement(new Options);