/*
  document-name: linkInfo_v1-2.js
  author: Andreas Deschka
  email: andreas.deschka@sol.at
  sample-url: http://193.170.245.144/~andreasdeschka/linkInfo_sample.html
  Browsers: IE6,Mozilla,Opera
 
  How to use:
  [in your head]
  [important: style definition must be after the javascript !!!]
 <script language="javascript">	tooltip='tip'; </script>
 <script language="javascript" src="linkInfo_v1-2.js"></script>
 <style type="text/css">
	.tip{ font-weight:bold; background-colour:#FFFFFF;}
 </style>
  [in your body]
	This is a <a href="sample_url" tip="Sample Tooltip<br>with a second line">link</a>.
*/
defaultStyle='background-color:#FFFFE1;	border: 1px solid #999999;	font-size:12px; font-family: Arial, Helvetica, sans-serif;	padding:2px;';
// this style resembles the small yellow bubbles, but is a bit bigger
baseStyle='position:absolute;left:0px;top:0px;visibility:hidden;text-align:center;z-index:999;';
xMousePos = 0; // Horizontal position of the mouse on the screen
yMousePos = 0; // Vertical position of the mouse on the screen
xMousePosMax = 0; // Width of the page
yMousePosMax = 0; // Height of the page
xFromMouse=0; // x-distance of the tooltip from the mousepointer, browser-specific
yFromMouse=0; // y-distance 
yUpFromMouse=10;
nav={}; // if browser is ie / ns / op (eg: nav.ie=true )
myTooltips=[]; // array with different tooltip-objects

setupMousePositionCapturer();
begin();

function isString( str ){
	return ( str!=null && str.length>0 );
}
function isObject( obj ){
	return ( obj!=null && obj.toString!=null );
}
function begin(){	
	if( window.tooltip!=null ){
		if( isString( window.tooltip )){
			myTooltips.push( { name:window.tooltip } );
		} else {
			myTooltips.push( window.tooltip );
		}
	} else if ( window.tooltip1==null ){
		var tt={};
		tt.name='info';
		myTooltips.push( tt );
	}
	for( var i=1; window['tooltip'+i]!=null; i++ ){ 
		var wt=window['tooltip'+i];
		if( isString( wt )){
			myTooltips.push( { name:wt } );
		} else {
			myTooltips.push( wt );
		}
	}
	for ( var k=0; k< myTooltips.length; k++ ){		
		writeDivTag(myTooltips[k]);
		installTagListeners( k );		
	}
}
function setupMousePositionCapturer(){	
	captureFunction= function(){};	
	if (document.getElementById && window.innerWidth ) {
		// Netcsape 6 + Mozilla + Opera
		yFromMouse=21;
		xFromMouse=4;
		captureFunction = captureMouse_NS;
		if (navigator.userAgent.indexOf("Opera")>-1){
			nav.op= true;
			yFromMouse= 21+17;				
		} else {
			nav.nn= true;	
		}		
	} else if (document.all) {
		// Internet Explorer
		nav.ie= true;
		yFromMouse=17;
		xFromMouse=2;
		captureFunction = captureMouse_IE_body;
		if ( document.documentElement&& document.documentElement.clientWidth>0 ){
			captureFunction = captureMouse_IE_documentElement;
		}			    	
	}  
	oldOnMouseMove= document.onmousemove;
	document.onmousemove=function(e){
		if( oldOnMouseMove!=null ){		
			oldOnMouseMove(e);
		}
		captureFunction(e);
		//out('y'+yMousePos+'ym'+yMousePosMax+' ');
		moveInfoElement( window.activeInfoDiv );
	}	
}
function captureMouse_IE_documentElement(){	//out('doucument');		
	xMousePos = window.event.x+ document.documentElement.scrollLeft; 
        yMousePos = window.event.y+document.documentElement.scrollTop;
        xMousePosMax = document.documentElement.clientWidth+document.documentElement.scrollLeft;
        yMousePosMax = document.documentElement.clientHeight+document.documentElement.scrollTop-12;   	
}
function captureMouse_IE_body(){ //out('body');
	xMousePos = window.event.x+document.body.scrollLeft;
        yMousePos = window.event.y+document.body.scrollTop;
        xMousePosMax = document.body.clientWidth+document.body.scrollLeft;
        yMousePosMax = document.body.clientHeight+document.body.scrollTop;
}
function captureMouse_NS(e){
	xMousePos = e.pageX;
        yMousePos = e.pageY;
        xMousePosMax = window.innerWidth+window.pageXOffset;
        yMousePosMax = window.innerHeight+window.pageYOffset;
}
function out( string ){
	var outDiv=document.getElementById('out')
	if(outDiv!=null) outDiv.firstChild.nodeValue+=string+"\n";
}
function writeDivTag( obj ){	
	if(obj.id!=null &&obj.id.length>0){
		document.writeln('<style type="text/css">#'+obj.id+'{'+baseStyle+'}</style>');
	} else {
		obj.id= obj.name;
		if( obj.Class==null ){
			obj.Class= obj.name;
		}
		document.writeln('<style type="text/css"><!-- .'+obj.Class+'{'+defaultStyle+baseStyle+'} --></style>');		
		document.writeln('<div class="'+obj.Class+'" id="'+obj.id+'">&nbsp;</div>');
	}	
}
function installTagListeners( tooltip_nr, delayTime ){	
	// wait for info Div to load
	var obj= myTooltips[ tooltip_nr ];
	var divNode= document.getElementById( obj.id );
	if( isObject(divNode) ){		
		if( obj.tags==null ){
			obj.tags= [];
			if( obj.tag==null ){
				obj.tags.push('a');
				obj.tags.push('span');
			} else {
				obj.tags.push( obj.tag );
			}
		}		
		for( var k=0; k<obj.tags.length; k++){		
			var myNodes =document.getElementsByTagName(  obj.tags[k].toUpperCase() );
			for(var i=0; myNodes!=null&&i<myNodes.length; i++){				
				var node= myNodes[i];
				var infoText=node.getAttribute( obj.name ); 
				if( isString(infoText)&& node.infoDivNode_==null ){
						node.infoText_= infoText;
						node.infoDivNode_ = divNode;						
						// the _ is used to avoid name conflicts with the attributes of the user
						node.style.cursor='pointer';
						if( node.onmouseover==null ){
							node.onmouseover= showInfo;					
						} else {
							node.oldOnmouseover= node.onmouseover;
							node.newOnmouseover= showInfo;
							node.onmouseover= function(){
								this.newOnmouseover();
								this.oldOnmouseover();
							}
						}
						if( node.onmouseout==null ){
							node.onmouseout= hideInfo;					
						} else {
							node.oldOnmouseout= node.onmouseout;
							node.newOnmouseout= hideInfo;
							node.onmouseout= function(){
								this.newOnmouseout();
								this.oldOnmouseout();
							}
					   }
				}
			}
		}
	}	
	if( delayTime==null)
		delayTime=0;
	if( delayTime < 2 ){
		delayTime+=0.2;
	}	
	setTimeout('installTagListeners('+tooltip_nr+','+delayTime+');',delayTime*1000); 
}
function moveInfoElement( infoElement, setTurnOver ){	
	// setTurnOver: decide only once if position should be above or beneath mouse to prevent jerking	
	if( infoElement ==null ){
		//out('infoElement=null ');
		//alert('infoElement=null');
		//infoElement=1;
	} else if( infoElement.style.visibility != 'hidden'){		
		var x,y;
		x=xFromMouse+xMousePos;
		//if(infoElement.centered==true){
			x-=0.5*infoElement.offsetWidth;			
		//}		
		if( xMousePosMax>0 && x+ infoElement.offsetWidth> xMousePosMax-20 ){
			x= xMousePosMax-20- infoElement.offsetWidth;			
		}
		if( x<5 ){
			x=5;
		}		
		if( nav.op==true ){
			y= yMousePos - yUpFromMouse - infoElement.offsetHeight;	
			if( setTurnOver==true ){
				infoElement.turnOver= ( y < 5 );
			}
			if( infoElement.turnOver==true ){
				y= yFromMouse+yMousePos;	
			}
		} else {
			y= yFromMouse+yMousePos;		
			if( setTurnOver==true ){
				infoElement.turnOver= (yMousePosMax>0 && y+ infoElement.offsetHeight> yMousePosMax);
			}
			if( infoElement.turnOver==true ){
				y= yMousePos - yUpFromMouse - infoElement.offsetHeight;	
			}
		}		
		infoElement.style.left=x+'px'; 
		infoElement.style.top=y+'px';		
	} 
}
function showInfo(){
	var infoDiv= this.infoDivNode_;
	if( infoDiv==null ) {} else {		
		unsetInfoText( infoDiv );
		infoDiv.left='0px';
		infoDiv.top='0px';
		window.activeInfoDiv= infoDiv;
		setInfoText( infoDiv, this.infoText_ );		
		infoDiv.style.visibility='visible';
		moveInfoElement( infoDiv, true );
	}				
}
function hideInfo(){		
	var infoDiv= this.infoDivNode_;
	if( infoDiv==null ) {} else {		
		infoDiv.style.visibility='hidden';
		unsetInfoText(infoDiv);
	}
}
function setInfoText( infoElement,text ){			
	var subtext='';
	for(var i=0;i<text.length;++i){		
		if(text.substr(i,4)=='<br>'){			
			infoElement.appendChild(document.createTextNode(subtext));
			infoElement.appendChild(document.createElement('br'));
			subtext='';
			i+=3;
		} else {
			subtext=subtext+text.charAt(i)
		}
	}	
	infoElement.appendChild( document.createTextNode(subtext));		
}
function unsetInfoText(infoElement){
	while(infoElement.hasChildNodes()){
		infoElement.removeChild(infoElement.lastChild);
	}	
}


