// --- BoxOver --- v 2.1b [Bush version] 31st May 2006 ---
// 2.0 - Original by Oliver Bryant, Matthew Tagg (http://boxover.swazz.org)
// 2.1 - Modified/optimised/bugfixed (2.1) by Azzer (http://www.bushtarion.com)

var iHidingSelects = 0;

if(window.addEventListener) {
 document.addEventListener('mousemove',moveMouse,false);
} else {
 document.attachEvent('onmousemove',moveMouse);
}

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.className='header tooltips tooltipheadbg';
}

function defBdyStyle() {
 dvBdy.className='lightbackground tooltips tooltipbodybg';
 dvBdy.style.borderTop='0px';
}

function scanBO(curNode) {
 var iValid = 1;
 var sTitle = curNode.title;
 if (!sTitle || typeof(sTitle) != 'string') {
  iValid = 0;
 } else {
  if (sTitle.indexOf('{}') > -1) {
   iValid = 1;
  } else {
   iValid = 0;
  }
 }
 if (iValid) {
  var sVariables = new Array();
  sVariables = sTitle.split('{}');
  curNode.boHDR = sVariables[0];
  curNode.boBDY = sVariables[1];
  curNode.title = '';
  curNode.hasbox = 1;
 } else {
  curNode.hasbox = 2;
 }
}

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 iIsHeaderPresent, iIsBodyPresent;
function applyStyles() {
 if (iIsHeaderPresent)
  oDv.removeChild(dvHdr);
 if (iIsBodyPresent)
  oDv.removeChild(dvBdy);
 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;
 iIsHeaderPresent = false;
 iIsBodyPresent = false;
 if (CBE.boHDR!='') {
  oDv.appendChild(dvHdr);
  iIsHeaderPresent = true;
 }
 if (CBE.boBDY!=''){
  oDv.appendChild(dvBdy);
  iIsBodyPresent = true;
 }
}

var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ;
var ini=false;

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) {
 e?evt=e:evt=event;

 CSE=evt.target?evt.target:evt.srcElement;

 if (!CSE.hasbox) {
  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 (ID!=null)
     clearTimeout(ID);
    COL=1;
    ID=setTimeout("oDv.style.visibility='visible';ID=null;", 500); //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)) {
   if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) {
    CBE=null;
    oDv.style.visibility='hidden';
    //showSelects();
    if (ID!=null)
     clearTimeout(ID);
   }
  }
  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;
   if ((mouseX < boxLeft) || (mouseX >boxRight) || (mouseY < boxTop) || (mouseY > boxBottom))
    CBE=null;
  }
 }

 if (boxMove && CBE) {
  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;
  mouseX < -ox?lockX=-mouseX-ox:lockX=0;
  if (mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)) {
   lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth;
   lockX=(lockX+(mouseX - SHW()[0])) - ox;
  }
  mouseY < -oy?lockY=-mouseY-oy:lockY=0;
  if (mouseY > (SHW()[1]-oDv.offsetHeight-oy)) {
   lockY=(-mouseY+SHW()[1]-oDv.offsetHeight-oy);
   lockY=(lockY+(mouseY - SHW()[1])) - oy;
  }
  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 showSelects() {
 if (iHidingSelects == 1) {
  iHidingSelects = 0;
  var elements = document.getElementsByTagName("select");
  for (i=0;i< elements.length;i++){
   elements[i].style.visibility='visible';
  }
 }
}

function hideSelects() {
 if (iHidingSelects == 0) {
  iHidingSelects = 1;
  var elements = document.getElementsByTagName("select");
  for (i=0;i< elements.length;i++){
   elements[i].style.visibility='hidden';
  }
 }
}

var COL=0;

function isChild(s,d) {
 while(s) {
  if (s==d) {
   return true;
  }
  s=s.parentNode;
 }
 return false;
}
