﻿/* --- BoxOver ---

/* --- v 2.1 17th June 2006

By Oliver Bryant with help of Matthew Tagg

http://boxover.swazz.org */

 

if (typeof document.attachEvent!='undefined') {

   window.attachEvent('onload',init);

   document.attachEvent('onmousemove',moveMouse);

   document.attachEvent('onclick',checkMove); }

else {

   window.addEventListener('load',init,false);

   document.addEventListener('mousemove',moveMouse,false);

   document.addEventListener('click',checkMove,false);

}

 

var oDv=document.createElement("div");

var dvHdr=document.createElement("div");

var dvBdy=document.createElement("div");

var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,boxOpen,totalScrollTop,totalScrollLeft;

boxOpen=false;

ox=10;

oy=10;

lockX=0;

lockY=0;

 

function init() {

      oDv.appendChild(dvHdr);

      oDv.appendChild(dvBdy);

      oDv.style.position="absolute";

      oDv.style.visibility='hidden';

      document.body.appendChild(oDv);     

}

 

function defHdrStyle() {

      dvHdr.innerHTML='<img  style="vertical-align:middle"  src="info.gif">&nbsp;&nbsp;'+dvHdr.innerHTML;

      dvHdr.style.fontWeight='normal';

      dvHdr.style.width='160px';

      dvHdr.style.fontFamily='arial';

      dvHdr.style.borderTop='1px solid #000';
      
      dvHdr.style.borderRight='1px solid #000';
      
      dvHdr.style.borderLeft='1px solid #000';

      dvHdr.style.padding='5px';

      dvHdr.style.fontSize='11px';

      dvHdr.style.color='#3b3b3b';

      dvHdr.style.background='#fff';

      dvHdr.style.filter='alpha(opacity=85)'; // IE

      dvHdr.style.opacity='0.85'; // FF

}

 

function defBdyStyle() {
      dvBdy.style.fontWeight='bold';

      dvBdy.style.borderBottom='1px solid #000';

      dvBdy.style.borderLeft='1px solid #000';

      dvBdy.style.borderRight='1px solid #000';

      dvBdy.style.width='160px';

      dvBdy.style.fontFamily='arial';

      dvBdy.style.fontSize='11px';

      dvBdy.style.padding='0px 2px 5px 8px';

      dvBdy.style.color='#ca1113';

      dvBdy.style.background='#fff';

      dvBdy.style.filter='alpha(opacity=85)'; // IE

      dvBdy.style.opacity='0.85'; // FF

}

 

function checkElemBO(txt) {

if (!txt || typeof(txt) != 'string') return false;

if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1)) 

   return true;

else

   return false;

}

 

function scanBO(curNode) {

        if (checkElemBO(curNode.title)) {

         curNode.boHDR=getParam('header',curNode.title);

         curNode.boBDY=getParam('body',curNode.title);

                  curNode.boCSSBDY=getParam('cssbody',curNode.title);               

                  curNode.boCSSHDR=getParam('cssheader',curNode.title);

                  curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false;

                  curNode.fixX=parseInt(getParam('fixedrelx',curNode.title));

                  curNode.fixY=parseInt(getParam('fixedrely',curNode.title));

                  curNode.absX=parseInt(getParam('fixedabsx',curNode.title));

                  curNode.absY=parseInt(getParam('fixedabsy',curNode.title));

                  curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):10;

                  curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10;

                  curNode.fade=(getParam('fade',curNode.title)=='on')?true:false;

                  curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04;

                  curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0;

                  if (getParam('requireclick',curNode.title)=='on') {

                        curNode.requireclick=true;

                        document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false);

                        document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false);

                  }

                  else {// Note : if requireclick is on the stop clicks are ignored                   

                  if (getParam('doubleclickstop',curNode.title)!='off') {

                        document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false);

                  }     

                  if (getParam('singleclickstop',curNode.title)=='on') {

                        document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false);

                  }

            }

                  curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true;

                  curNode.title='';

                  curNode.hasbox=1;

         }

         else

            curNode.hasbox=2;   

}

 

 

function getParam(param,list) {

      var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]');

      var res = reg.exec(list);

      var returnvar;

      if(res)

            return res[2].replace('[[','[').replace(']]',']');

      else

            return '';

}

 

function Left(elem){    

      var x=0;

      if (elem.calcLeft)

            return elem.calcLeft;

      var oElem=elem;

      while(elem){

             if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0))

                  x+=parseInt(elem.currentStyle.borderLeftWidth);

             x+=elem.offsetLeft;

             elem=elem.offsetParent;

        } 

      oElem.calcLeft=x;

      return x;

      }

 

function Top(elem){

       var x=0;

       if (elem.calcTop)

            return elem.calcTop;

       var oElem=elem;

       while(elem){           

             if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0))

                  x+=parseInt(elem.currentStyle.borderTopWidth); 

             x+=elem.offsetTop;

               elem=elem.offsetParent;

       } 

       oElem.calcTop=x;

       return x;

       

}

 

var ah,ab;

function applyStyles() {

      if(ab)

            oDv.removeChild(dvBdy);

      if (ah)

            oDv.removeChild(dvHdr);

      dvHdr=document.createElement("div");

      dvBdy=document.createElement("div");

      CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle();

      CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle();

      dvHdr.innerHTML=CBE.boHDR;

      dvBdy.innerHTML=CBE.boBDY;

      ah=false;

      ab=false;

      if (CBE.boHDR!='') {          

            oDv.appendChild(dvHdr);

            ah=true;

      }     

      if (CBE.boBDY!=''){

            oDv.appendChild(dvBdy);

            ab=true;

      }     

}

 

var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ;

var ini=false;

 

// Customised function for inner window dimension

function SHW() {

   if (document.body && (document.body.clientWidth !=0)) {

      width=document.body.clientWidth;

      height=document.body.clientHeight;

   }

   if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) {

      width=document.documentElement.clientWidth;   

      height=document.documentElement.clientHeight;   

   }   

   return [width,height];

}

 

 

var ID=null;

function moveMouse(e) {

   //boxMove=true;

      e?evt=e:evt=event;

      

      CSE=evt.target?evt.target:evt.srcElement;

      

      if (!CSE.hasbox) {

         // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement

         iElem=CSE;

         while ((iElem.parentNode) && (!iElem.hasbox)) {

            scanBO(iElem);

            iElem=iElem.parentNode;

         }     

      }

      

      if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){          

         if (!CSE.boxItem) {

                  iterElem=CSE;

                  while ((iterElem.hasbox==2)&&(iterElem.parentNode))

                              iterElem=iterElem.parentNode; 

                  CSE.boxItem=iterElem;

                  }

            iterElem=CSE.boxItem;

            if (CSE.boxItem&&(CSE.boxItem.hasbox==1))  {

                  LBE=CBE;

                  CBE=iterElem;

                  if (CBE!=LBE) {

                        applyStyles();

                        if (!CBE.requireclick)

                              if (CBE.fade) {

                                    if (ID!=null)

                                          clearTimeout(ID);

                                    ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay);

                              }

                              else {

                                    if (ID!=null)

                                          clearTimeout(ID);

                                    COL=1;

                                    ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay);                                   

                              }

                        if (CBE.IEbugfix) {hideSelects();} 

                        fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX;

                        fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY;              

                        lockX=0;

                        lockY=0;

                        boxMove=true;

                        ox=CBE.offX?CBE.offX:10;

                        oy=CBE.offY?CBE.offY:10;

                  }

            }

            else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove)) {

                  // The conditional here fixes flickering between tables cells.

                  if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) {                    

                  CBE=null;

                  if (ID!=null)

                              clearTimeout(ID);

                  fadeOut();

                  showSelects();

                  }

            }

            LSE=CSE;

      }

      else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) {

            totalScrollLeft=0;

            totalScrollTop=0;

            

            iterElem=CSE;

            while(iterElem) {

                  if(!isNaN(parseInt(iterElem.scrollTop)))

                        totalScrollTop+=parseInt(iterElem.scrollTop);

                  if(!isNaN(parseInt(iterElem.scrollLeft)))

                        totalScrollLeft+=parseInt(iterElem.scrollLeft);

                  iterElem=iterElem.parentNode;             

            }

            if (CBE!=null) {

                  boxLeft=Left(CBE)-totalScrollLeft;

                  boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft;

                  boxTop=Top(CBE)-totalScrollTop;

                  boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop;

                  doCheck();

            }

      }

      

      if (boxMove&&CBE) {

            // This added to alleviate bug in IE6 w.r.t DOCTYPE

            bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;

            bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft;

            mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft;

            mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop;

            if ((CBE)&&(CBE.windowLock)) {

                  mouseY < -oy?lockY=-mouseY-oy:lockY=0;

                  mouseX < -ox?lockX=-mouseX-ox:lockX=0;

                  mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY;

                  mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX;                  

            }

            oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px";

            oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px";       

            

      }

}

 

function doCheck() {    

      if (   (mouseX < boxLeft)    ||     (mouseX >boxRight)     || (mouseY < boxTop) || (mouseY > boxBottom)) {

            if (!CBE.requireclick)

                  fadeOut();

            if (CBE.IEbugfix) {showSelects();}

            CBE=null;

      }

}

 

function pauseBox(e) {

   e?evt=e:evt=event;

      boxMove=false;

      evt.cancelBubble=true;

}

 

function showHideBox(e) {

      oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden';

}

 

function hideBox(e) {

      oDv.style.visibility='hidden';

}

 

var COL=0;

var stopfade=false;

function fadeIn(fs) {

            ID=null;

            COL=0;

            oDv.style.visibility='visible';

            fadeIn2(fs);

}

 

function fadeIn2(fs) {

            COL=COL+fs;

            COL=(COL>1)?1:COL;

            oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')';

            oDv.style.opacity=COL;

            if (COL<1)

             setTimeout("fadeIn2("+fs+")",20);        

}

 

 

function fadeOut() {

      oDv.style.visibility='hidden';

      

}

 

function isChild(s,d) {

      while(s) {

            if (s==d) 

                  return true;

            s=s.parentNode;

      }

      return false;

}

 

var cSrc;

function checkMove(e) {

      e?evt=e:evt=event;

      cSrc=evt.target?evt.target:evt.srcElement;

      if ((!boxMove)&&(!isChild(cSrc,oDv))) {

            fadeOut();

            if (CBE&&CBE.IEbugfix) {showSelects();}

            boxMove=true;

            CBE=null;

      }

}

 

function showSelects(){

   var elements = document.getElementsByTagName("select");

   for (i=0;i< elements.length;i++){

      elements[i].style.visibility='visible';

   }

}

 

function hideSelects(){

   var elements = document.getElementsByTagName("select");

   for (i=0;i< elements.length;i++){

   elements[i].style.visibility='hidden';

   }

}

 

function scanBO(curNode) {

  var btext = curNode.getAttribute('hoverbox');

  if (checkElemBO(btext)) {

    curNode.boHDR=getParam('header',btext);

    curNode.boBDY=getParam('body',btext);

    curNode.boCSSBDY=getParam('cssbody',btext);      

    curNode.boCSSHDR=getParam('cssheader',btext);

    curNode.IEbugfix=(getParam('hideselects',btext)=='on')?true:false;

    curNode.fixX=parseInt(getParam('fixedrelx',btext));

    curNode.fixY=parseInt(getParam('fixedrely',btext));

    curNode.absX=parseInt(getParam('fixedabsx',btext));

    curNode.absY=parseInt(getParam('fixedabsy',btext));

    curNode.offY=(getParam('offsety',btext)!='')?parseInt(getParam('offsety',btext)):10;

    curNode.offX=(getParam('offsetx',btext)!='')?parseInt(getParam('offsetx',btext)):10;

    curNode.fade=(getParam('fade',btext)=='on')?true:false;

    curNode.fadespeed=(getParam('fadespeed',btext)!='')?getParam('fadespeed',btext):0.04;

    curNode.delay=(getParam('delay',btext)!='')?parseInt(getParam('delay',btext)):0;

    if (getParam('requireclick',btext)=='on') {

      curNode.requireclick=true;

      document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false);

      document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false);

    }

    else {// Note : if requireclick is on the stop clicks are ignored         

      if (getParam('doubleclickstop',btext)!='off') {

        document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false);

      }  

      if (getParam('singleclickstop',btext)=='on') {

        document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false);

      }

    }

    curNode.windowLock=getParam('windowlock',btext).toLowerCase()=='off'?false:true;

    btext='';

    curNode.hasbox=1;

   }

   else

      curNode.hasbox=2;

}
