/*[version]2008-09-15 18:51[/version]*/
/**
Benötigt die Module event.js, geometry.js, Acu.js
tooltipBox muss absolut positioniert sein.
contentBox kann ein in der Tooltip-Box enthaltener Content-Div sein.

Alle DOM-abhängigen Aktionen werden window.onload durchgeführt.
Tooltips,die registriert werden, bevor das Dokument steht, werden
gecached und ebenfalls window.onload geladen.


WICHTIG!
AnemaTooltip.totalWidth auf die totale Breite setzen (=width+paddingLeft+paddingRight+borderLeftWidth+borderRightWidth)!



JavaScript:
var menuTooltip = new AnemaTooltip( 'menu_tooltip', 'menu_tooltip_content', 0, false );	// autoInitialize: false, opacity : 0
menuTooltip.setOffsets( $c_menu_tooltip_offset_x, $c_menu_tooltip_offset_y );
menuTooltip.setTotalWidth( $menu_tooltip_total_width );
menuTooltip.register( 'gal_3', 'zwuck zwuck<br />flupp flupp', AnemaTooltip.FLOMP_RIGHT );



Body-Ende:
<div id="tooltip" style="display:none;"><div id="tooltip_content">Text be here.</div></div>




Styles:
#tooltip{
	width:200px;
	padding:10px;
	padding-top: 8px;
	position:absolute;
	cursor:pointer;
	z-index:20;
	background-color:#000000;
	border: white solid;
	/* Die Randbreite muss extra angegeben werden, weil sie sonst mit JavaScript nicht abgefragt werden kann. * /
	border-width: 1px;
	height: auto;
}
#tooltip_content{
}




*/

function AnemaTooltip( tooltipBox, contentBox/*, opacity=0.95, autoInitializeOnWindowLoad=true*/ ){
	this.tooltipBox = tooltipBox;
	this.contentBox = contentBox;
	this.registeredTargets = new Array();
	this.targetCache = new Array();
	this.visible = false;
	this.initialized = false;
	var autoInitializeOnWindowLoad = (arguments[3]===false) ? false : true;
	this.setOpacity( arguments[2] ? arguments[2] : 0.95 );
	this.totalWidth = 220;
	this.offsets = { left: 3, top : 3 };

	if( document && document.body ){
		// Steht das Dokument, initialisiere es.
		if( autoInitializeOnWindowLoad ) this.init();
	}else{
		// Ansonsten registriere einen Handler,
		// der das window.onload erledigt.
		var self = this;
		var _init = function(){
			if( autoInitializeOnWindowLoad ) self.init();
			Acu.unregisterEvent( window, "load", _init );
		};
		Acu.registerEvent( window, "load", _init );
	}
}

AnemaTooltip.FLOMP_LEFT = 1;
AnemaTooltip.FLOMP_RIGHT = 2;


AnemaTooltip.prototype.init = function(){
	if( !Geometry.loaded ) Geometry.load();
	if( typeof this.tooltipBox == "string" ) this.tooltipBox = document.getElementById( this.tooltipBox );
	if( typeof this.contentBox == "string" ) this.contentBox = document.getElementById( this.contentBox );
	Acu.setOpacity( this.tooltipBox, this.opacity );

	// Falls Tooltips im Cache liegen, registriere sie jetzt.
	for( var i=0; i<this.targetCache.length; i++ ){
		var t = this.targetCache[i];
		this._register( t.target, t.content, t.flomping );
	}
	this.targetCache.length = 0;

	this.initialized = true;
};

AnemaTooltip.prototype.register = function( target, content/*, flomping=AnemaTooltip.FLOMP_RIGHT */ ){
	var flomping = arguments[2] ? arguments[2] : AnemaTooltip.FLOMP_RIGHT;
	if( this.initialized ){
		this._register( target, content, flomping );
	}else{
		this.targetCache.push( { target : target, content : content, flomping : flomping } );
	}
};

AnemaTooltip.prototype._register = function( target, content/*, flomping=AnemaTooltip.FLOMP_RIGHT */ ){
	if( typeof target == "string" ) target = document.getElementById( target );
	if( !target ) throw "[AnemaTooltip] _register: missing target";
	var flomping = arguments[2] ? arguments[2] : AnemaTooltip.FLOMP_RIGHT;
	target.content = content;
	target.flomping = flomping;
	var tooltip = this;
	var self = target;
	var handlers = {};
	var handler = function( e ){
		if( !e ) e = window.event;
		if( !Geometry.loaded ) Geometry.load();
		var x = Geometry.getHorizontalScroll() + e.clientX;
		var y = Geometry.getVerticalScroll() + e.clientY;
		tooltip.display( self.content, x, y, self.flomping );
	};
	Acu.registerEvent( target, "mouseover", handler );
	handlers.mouseover = handler;
	//target.onmouseover = handler;

	handler = function( e ){
		if( !e ) e = window.event;
		if( !Geometry.loaded ) Geometry.load();
		var x = Geometry.getHorizontalScroll() + e.clientX;
		var y = Geometry.getVerticalScroll() + e.clientY;
		tooltip.moveTo( x, y, self.flomping );
	};
	Acu.registerEvent( target, "mousemove", handler );
	handlers.mousemove = handler;

	handler = function( e ){
		if( !e ) e = window.event;
		if( !Geometry.loaded ) Geometry.load();
		tooltip.hide();
	};
	Acu.registerEvent( target, "mouseout", handler );
	handlers.mouseout = handler;

	target.handlers = handlers;
	this.registeredTargets.push( target );
};

/**
 * Entfernt die gesetzten Event-Handler und Attribute wieder.
 * Entfernt das Objekt außerdem aus dem registeredTarget-Array.
 */
AnemaTooltip.prototype.unregister = function( obj ){
	if( typeof obj == "string" ) obj = document.getElementById( obj );
	if( obj.handlers ){
		for( var p in obj.handlers ){
			Acu.unregisterEvent( obj, p, obj.handlers[p] );
		}
		try{ delete obj.handlers; }catch(e){}
	}
	try{
		if( obj.content ) delete obj.content;
		if( obj.flomping ) delete obj.flomping;
	}catch(e){}

	for( var i=0; i<this.registeredTargets.length; i++ ){
		if( obj === this.registeredTargets[i] ) this.registeredTargets.splice( i, 1 );
	}
};

AnemaTooltip.prototype.unregisterAllTooltips = function(){
	// Da das unregistering des Tooltips den Array ändert,
	// müssen wir ihn vorher kopieren.
	var temp = new Array( this.registeredTargets.length );
	for( var i=0; i<this.registeredTargets.length; i++ ){
		temp[i] = this.registeredTargets[i];
	}
	for( var i=0; i<temp.length; i++ ){
		this.unregister( temp[i] );
	}
};

AnemaTooltip.prototype.display = function( content, x, y/*, flomping=AnemaTooltip.FLOMP_RIGHT */ ){
	var flomping = arguments[3] ? arguments[3] : AnemaTooltip.FLOMP_RIGHT;
	this.setContent( content );
	this.moveTo( x, y );
	this.show();
};

AnemaTooltip.prototype.show = function(){
	if( this.tooltipBox ) this.tooltipBox.style.display = '';
	this.visible = true;
};

AnemaTooltip.prototype.hide = function(){
	if( this.tooltipBox ) this.tooltipBox.style.display = 'none';
	this.visible = false;
};

AnemaTooltip.prototype.moveTo = function( x, y/*, flomping=AnemaTooltip.FLOMP_RIGHT */ ){
	var flomping = arguments[2] ? arguments[2] : AnemaTooltip.FLOMP_RIGHT;
	if( this.tooltipBox ){
		x += this.offsets.left;
		y += this.offsets.top;
		if( flomping == AnemaTooltip.FLOMP_LEFT ){
			// Wir sollen nach links aufklappen.
			x -= this.totalWidth;
		}
		this.tooltipBox.style.left = x + "px";
		this.tooltipBox.style.top = y + "px";
	}
};

AnemaTooltip.prototype.setContent = function( content ){
	if( this.contentBox ) this.contentBox.innerHTML = content;
};

// value ist ein Wert zwischen 0.0 und 0.99
AnemaTooltip.prototype.setOpacity = function( value ){
	if( value >= 0 && value <= 1 ){
		this.opacity = value;
	}else{
		throw "[AnemaTooltip] setOpacity: illegal value " + value;
	}
};
AnemaTooltip.prototype.getOpacity = function(){
	return this.opacity;
};

// value ist ein Wert >= 0
AnemaTooltip.prototype.setTotalWidth = function( value ){
	if( value >= 0 ){
		this.totalWidth = value;
	}else{
		throw "[AnemaTooltip] setTotalWidth: illegal value " + value;
	}
};
AnemaTooltip.prototype.getTotalWidth = function(){
	return this.totalWidth;
};

// Die Werte müssen >= 1 sein
AnemaTooltip.prototype.setOffsets = function( x, y ){
	if( x > 0 ){
		this.offsets.left = x;
	}else{
		throw "[AnemaTooltip] setOffsets: illegal left value " + x;
	}
	if( y > 0 ){
		this.offsets.top = y;
	}else{
		throw "[AnemaTooltip] setOffsets: illegal top value " + y;
	}
};

