// --------------------------------------------------------------------------------
//
//	pptooltip.js
//  (c) 2009 plan p. GmbH
//
// --------------------------------------------------------------------------------


var PPTooltip = Class.create();
PPTooltip.prototype = {
	opacity: 0.75,
	duration_in: 0.50,
	duration_out: 0.25,
	current: undefined,
	effect: undefined,
	
	initialize: function () {
		// insert the elements into the dom
		var objBody = document.getElementsByTagName("body").item(0);
		var objTooltip = document.createElement("div");
		objTooltip.setAttribute('id','pptooltip');
		objTooltip.style.display = 'none';
		objBody.appendChild(objTooltip);
		var objTextDiv = document.createElement("div");
		objTooltip.appendChild(objTextDiv);
		var objSpikeDiv = document.createElement("div");
		objSpikeDiv.setAttribute('class','spike');
		objTooltip.appendChild(objSpikeDiv);		

		document.observe('mousemove', (function(event){
			var target = event.findElement('[class*=pptooltip]');
			if (target) {
				this.show(target, event);
			}
			else
			{
				this.hide();
			}
		}).bind(this));
	},

	show: function (target, event) {
		var ppt_object = $('pptooltip');
		var ppt_txtObj = target.select('span[class=ppttext]');
		if(ppt_object && ppt_txtObj[0]) {
			ppt_object.down().innerHTML = ppt_txtObj[0].innerHTML;
			if(target!=this.current) {
				this.current = target;
				if(this.effect) {
					if(this.effect.effects) {
						var num = 0;
						while(this.effect.effects[num]) {
							this.effect.effects[num].cancel();
							num++;
						}
					} else {
						this.effect.cancel();
					}
				}
				ppt_object.hide();
				if(ppt_object.down().next().hasClassName('top')) { ppt_object.down().next().removeClassName('top'); }
				if(ppt_object.down().next().hasClassName('bottom')) { ppt_object.down().next().removeClassName('bottom'); }
				var ppt_width = ppt_object.getWidth();
				var offsetX = ((target.cumulativeOffset().left+(target.getWidth()/2))-parseInt(ppt_width/2));
				if(offsetX > (document.viewport.getScrollOffsets().left + document.viewport.getWidth() - ppt_width)) {
					if(event.pointerX() > (document.viewport.getScrollOffsets().left + (document.viewport.getWidth()/2)) ) {
						offsetX = document.viewport.getScrollOffsets().left + document.viewport.getWidth() - ppt_width - 10;
					} else {
						offsetX = document.viewport.getScrollOffsets().left + 10;
					}
				} else if(offsetX < 10) {
					offsetX = document.viewport.getScrollOffsets().left + 10;
				}
				var moveYBy = -8;
				var offsetY = (target.cumulativeOffset().top+target.getHeight()+16);
				if(offsetY > (document.viewport.getScrollOffsets().top + (document.viewport.getHeight()/2))) {
					offsetY = ((target.cumulativeOffset().top-ppt_object.getHeight())-16);
					moveYBy = 8;
					ppt_object.down().next().addClassName('bottom');
				} else {
					ppt_object.down().next().addClassName('top');
				}
				ppt_object.setStyle({ top: offsetY+'px' , left: offsetX+'px' });
				this.effect = new Effect.Parallel([
							new Effect.Appear(ppt_object, { from: 0.0, to: this.opacity }), 
							new Effect.Move(ppt_object, { y: moveYBy, mode: 'relative' })
						], 
						{ duration: this.duration_in }
					);
			}
		}
	},
	
	hide: function () {
		var ppt_object = $('pptooltip');
		if(ppt_object && this.current) {
			this.current = undefined;
			if(this.effect) {
				if(this.effect.effects) {
					var num = 0;
					while(this.effect.effects[num]) {
						this.effect.effects[num].cancel();
						num++;
					}
				} else {
					this.effect.cancel();
				}
			}
			this.effect = new Effect.Fade(ppt_object, { duration: this.duration_out, from: this.opacity, to: 0.0 });
		}
	}

}
document.observe('dom:loaded', function () { var myPPTooltip = new PPTooltip(); });
