/*
  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:199;';
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=17;
        xFromMouse=4;
        captureFunction = captureMouse_NS;
        if (navigator.userAgent.indexOf("Opera")>-1){
            nav.op= true;
            yFromMouse= 17+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);
    }
}

