/* --- 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="images/info.jpg">&nbsp;&nbsp;'+dvHdr.innerHTML;
	dvHdr.style.fontWeight='bold';
	dvHdr.style.width='245px';
	dvHdr.style.fontFamily='arial';
	dvHdr.style.border='1px solid #0B2200';
	dvHdr.style.padding='3';
	dvHdr.style.fontSize='12';
	dvHdr.style.color='#FFFFFF';
	dvHdr.style.background='#0B2200';
	dvHdr.style.filter='alpha(opacity=95)'; // IE
	dvHdr.style.opacity='0.95'; // Firefox
 } 
  
 function defBdyStyle() { 
     dvBdy.style.borderBottom='1px solid #CCCCCC';
	dvBdy.style.borderLeft='1px solid #CCCCCC';
	dvBdy.style.borderRight='1px solid #CCCCCC';
	dvBdy.style.width='245px';
	dvBdy.style.fontFamily='arial';
	dvBdy.style.fontSize='11';
	dvBdy.style.padding='3';
	dvBdy.style.color='#000000';
	dvBdy.style.background='#FAF9E9';
	dvBdy.style.filter='alpha(opacity=95)'; // IE
	dvBdy.style.opacity='0.95'; // Firefox
 } 
  
 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'; 
    } 
 } 

