var ttMouseOffsetX = 13;
var ttMouseOffsetY = 10;
var ttAppearDuration = 0.3;
var ttDelay = 750;
var ttAppearEffect1;
var ttAppearEffect2;
var ttEventPositionBuffer;
var ttBindElementBuffer;
var ttDelayTimoutID = 0;
var ttIsOpen = false;


/* setzt den Inhalt des Tooltips */
function setTooltipContent (content) {
	
	var tt = $('tooltip');
	var ttb = $('ttbackground');
	var ttc = $('ttc');
	
	var lastStyle = tt.style.display;
	var ttLastPosTop = tt.style.top;
	var ttLastPosLeft = tt.style.left;
	var ttbLastPosTop = ttb.style.top;
	var ttbLastPosLeft = ttb.style.left;
	
	tt.setStyle ({visibility:'hidden', display:'block'});
	ttc.innerHTML = content;
	var w = ttc.offsetWidth + 3;
	var h = ttc.offsetHeight + 2;
	var pos = Position.realOffset(tt);
	ttb.setStyle({left:((pos[0]+3)+'px'), top:((pos[1]+3)+'px'), width:(w+'px'), height: (h+'px')});
	
	tt.setStyle ({visibility:'visible', display:lastStyle});
	tt.style.top = ttLastPosTop;
	tt.style.left = ttLastPosLeft;
	ttb.style.top = ttbLastPosTop;
	ttb.style.left = ttbLastPosLeft;
}

/* öffnet das Tooltip */
function openToolTip (e) {
	ttBindElementBuffer = this;
	if (!ttBindElementBuffer.ttText) {
		var el = Event.element(e);
		while (!el.ttText && el != document) {
			el = el.up();
		}
		ttBindElementBuffer = el;
	}
	
	updatePositionBuffer(e);
	startDragTooltip(ttEventPositionBuffer);
}

/* öffnet das Tooltip mit einer Verzögerung */
function openToolTipDelayed (e) {
	ttBindElementBuffer = this;
	if (!ttBindElementBuffer.ttText) {
		var el = Event.element(e);
		while (!el.ttText && el != document) {
			el = el.up();
		}
		ttBindElementBuffer = el;
	}
	
	updatePositionBuffer(e);
	Event.observe(document, 'mousemove', updatePositionBuffer);
	ttDelayTimoutID = window.setTimeout("startDragTooltip(ttEventPositionBuffer)", ttDelay);
}

function startDragTooltip (p) {
	ttIsOpen = ttBindElementBuffer;
	window.clearTimeout(ttDelayTimoutID);
	setTooltipContent(ttBindElementBuffer.ttText); 
	Event.stopObserving(document, 'mousemove', updatePositionBuffer);
	dragToolTip(null,p);
	Event.observe(document, 'mousemove', dragToolTip);
	
	if (!isIE7() && !isIE6()) {
		if (ttAppearEffect1) ttAppearEffect1.cancel();
		if (ttAppearEffect2) ttAppearEffect2.cancel();
		ttAppearEffect1 = new Effect.Appear('tooltip', {duration: ttAppearDuration});
		ttAppearEffect2 = new Effect.Appear('ttbackground', {duration: ttAppearDuration});
	} else {
		$('tooltip').style.display = 'block';
		$('ttbackground').style.display = 'block';
	}
}

function updatePositionBuffer (e) {
	if (e) {
		ttEventPositionBuffer = {
			x: Event.pointerX(e) + ttMouseOffsetX,
			y: Event.pointerY(e) + ttMouseOffsetY
		}
	}
}

/* schließt das Tooltip wieder */
function stopDragTooltip () {
	ttIsOpen = false;
	window.clearTimeout(ttDelayTimoutID);
	Event.stopObserving(document, 'mousemove', dragToolTip);
	Event.stopObserving(document, 'mousemove', updatePositionBuffer);
	if (!isIE7() && !isIE6()) {
		if (ttAppearEffect1) ttAppearEffect1.cancel();
		if (ttAppearEffect2) ttAppearEffect2.cancel();
		ttAppearEffect1 = new Effect.Fade('tooltip', {duration: ttAppearDuration});
		ttAppearEffect2 = new Effect.Fade('ttbackground', {duration: ttAppearDuration});
	} else {
		$('tooltip').style.display = 'none';
		$('ttbackground').style.display = 'none';
		unhideSelectboxes($('tooltip'));
	}
}

/* bewegt das Tooltip mit dem Mauszeiger */
function dragToolTip (e, p) {
	if (p) {
		var x= p.x;
		var y= p.y;
	} else {
		var x = Event.pointerX(e) + ttMouseOffsetX;
		var y = Event.pointerY(e) + ttMouseOffsetY;
	}
	var tt = $('tooltip');
	var ttb = $('ttbackground');
	
	tt.setStyle ({left:x+'px', top:y+'px'});
	ttb.setStyle({left:(x+3)+'px', top:(  y+3)+'px'});

	hideSelectboxes(tt);
}

/**
  * weißt einen HTML-Element ein Tooltip zu. 
  * der erste Parameter muss ein ID-String sein oder eine Referenz auf ein DOM-Element
  */
function assignTooltip (obj, newTtText, delayed) {
	obj = $(obj);
	if (obj) {
		obj.ttText = newTtText;
		Event.observe(obj, 'mouseover', delayed ? openToolTipDelayed : openToolTip);
		Event.observe(obj, 'mouseout' , stopDragTooltip);
	}
}

/**
* Aktualisiert den Text einen Tooltips 
*/
function updateTooltip (obj, newTtText) {
	obj = $(obj);
	if (obj) {
		obj.ttText = newTtText;
		if (ttIsOpen && ttIsOpen == obj) {
			setTooltipContent(newTtText);
		}
	}
}
