//
// GR_ToolTip v0.3
// 
//

/*
   CHANGELOG
   v0.3:
   - onderstuening voor textarea`s
   v0.2: 
   - titels kunnen nu dmv [title] worden toegevoegd
   - markuptext toegevoegd voor tooltips
   - bugfix, onmouseout werkte niet altijd.
   - mogelijkheid tot toevoegen en verwijderen van tooltips
*/

var myGR_Tooltip;

var GR_Tooltip = function() {
	return this._init();
};

GR_Tooltip.prototype = {
	_init : function() {
		// Initialiseren...
		this.lastTooltip;
		this.toolTip;
		
		// We moeten even vaststellen of het om ie of ff gaat...
		this.isIE = document.all||navigator.userAgent.indexOf('MSIE')>=0;
		this._setup();
	},
	
	_setup : function() {
		var elements = document.getElementsByTagName("*");
		
		for(var i=0,l=elements.length;i<l;++i) {
			var curElement = elements[ i ];
			
			if( !curElement.getAttribute( "rel" ) )
				continue;
				
			if( curElement.tagName.toLowerCase() == "input" )
				continue;
				
			if( curElement.tagName.toLowerCase() == "textarea" )
				continue;
		
			// Formulieren skippen bitte...
			if( curElement.parentNode.id ) {
				if( curElement.parentNode.parentNode.id == "smartform" )
					continue;
			}

			curElement.onmouseover = function() { myGR_Tooltip.toggle( this ) };
			curElement.onmouseout =  function( e ) { myGR_Tooltip.hide(e) };
		}
	},
	
	// SmartForm
	addElement : function( id ) {
		var obj = document.getElementById( id );
		
		if( !obj||obj==null||typeof obj != "object" )
			return;
			
		obj.onmouseover = function() { myGR_Tooltip.toggle( this ) };
		obj.onmouseout =  function( e ) { myGR_Tooltip.hide(e) };
	},
	
	rmElement : function( id ) {
		var obj = document.getElementById( id );
		
		if( !obj||obj==null||typeof obj != 'object' )
			return;
			
		obj.onmouseover = "";
		obj.onmouseout = "";
	},
	
	// De markup
	markupText : function( str ) {
		// even checken of de str wel gevuld is.
		if( !str||str==null||str=="" )
			return "";

		var content = '<div class="tooltipmain">'+str+'</div>';
		
		// 14-04-2010 - Toevoeging class bij een header+main
		this.toolTip.className = "gr_tooltip";

		if( !str.match(/[\[][\w\s,\*.()\-\/]+[\]]/i) ) return content;
			
		content = str.replace( /[\[]([\w\s,\*.()\-\/]+)[\]]/i, "<div class=\"tooltipheader\">$1</div><div class=\"tooltipmain\">" )+"</div>";
		
		this.toolTip.className = "gr_tooltip advanced";
		//if( str.indexOf( "[" ) == -1 ) return content;
		
		// Is er een titel aanwezig?
		/*if( ( pos = str.indexOf( "]" ) ) !== -1 ) {
			header = str.substr( str.indexOf( "[" )+1, pos-1 );
			main = str.substr( pos+1, str.length );
			content = '<div class="tooltipheader">'+header+'</div><div class="tooltipmain">'+main+'</div>';
		}*/
		
		return content;
	},
	
	toggle : function( obj ) {
		if( !obj.getAttribute( "rel" ) ) 
			return;
			
		if( !this.toolTip ) {
			this.toolTip = document.createElement("div");
			this.toolTip.style.position = 'absolute';
			this.toolTip.className = "gr_tooltip";
			document.body.appendChild( this.toolTip );
			//return; // Quickfix 30-03-2010 wrong positioning
		}
	
		this.toolTip.innerHTML = this.markupText( obj.getAttribute( "rel" ) );

		// De tooltip positioneren
		this._posTooltip( obj );
		
		// Standaard onclick op block ;)
		this.toolTip.style.display = "block";
	},
	
	hide : function( e ) {
		if( !this.toolTip )
			return;
			
		this.toolTip.style.display = "none";
	},
	
	getSrcElement : function( e ) {
    	var el;
		if( e.target ) el = e.target;
		else if (e.srcElement) el = e.srcElement;
		
		if( el.nodeType == 3 ) // defeat Safari bug
			el = el.parentNode;
		return el;	
    },	
	
	_posTooltip : function( inputObj ) {
		// Man.. we need some space?
		var toolTipOffset = -20;
		
		// Collision Detection, hier berekenen we de nieuwe x en y waardes bij een collision.
		var  newPosX = ( this.getLeftPos( inputObj) + inputObj.offsetWidth + toolTipOffset );
		var  newPosY = this.getTopPos( inputObj ) + 20;

		if( newPosX+this.toolTip.offsetWidth > document.body.offsetWidth-200 ) {
			newPosX -= this.toolTip.offsetWidth+200;
		}
			
		// Y-as berekenen is nu niet zo boeiend nog...
		//if( newPosY+this.toolTip.offsetHeight > document.body.offsetHeight )

		this.toolTip.style.left = newPosX +  'px';
		this.toolTip.style.top = newPosY + 'px';			
	},
	
	getTopPos : function( obj ) {		
		var tPos = obj.offsetTop;
	  
		while( ( obj = obj.offsetParent ) != null ) {
			if( obj.tagName!='HTML' ) {
				tPos += obj.offsetTop;
				if( this.isIE ) tPos += obj.clientTop;
			}
		} 
		return tPos;
	},
	
	getLeftPos : function( obj ) {	  
		var lPos = obj.offsetLeft;
	  
		while( ( obj = obj.offsetParent ) != null ) {
			if( obj.tagName!='HTML' ) {
				lPos += obj.offsetLeft;
				if( this.isIE ) lPos += obj.clientLeft;
			}
		}
		return lPos;
	}
};

var GR_TooltipInit = function() { myGR_Tooltip = new GR_Tooltip();  };

if( window.addEventListener ) {
	window.addEventListener( "load", GR_TooltipInit, false );
} else if( window.attachEvent ) {
	window.attachEvent( "onload", GR_TooltipInit );
} else {
	window.onload = function() { GR_TooltipInit(); }
}
