/* --- BoxOver --- --- v 2.1 17th June 2006 By Oliver Bryant with help of Matthew Tagg http://boxover.swazz.org */
var ah, ab;
var CSE, iterElem, LSE, CBE, LBE, totalScrollLeft, totalScrollTop, width, height ;
var ini = false;
var oMainDv = document.createElement("div");
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;

var ifrm;
ifrm = document.createElement('iframe');
ifrm.src = 'about:blank';
// width & height will be determined later (from the dimensions of box-over)...
ifrm.style.cssText = 'z-index: -1; position: absolute; background-color: Transparent; filter: Alpha(opacity=0); -moz-opacity: 0.0;';
ifrm.frameBorder = 0;

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);
}

function init() {
  oDv.appendChild(dvHdr);
	oDv.appendChild(dvBdy);
  oDv.appendChild(ifrm);
	oDv.style.position = "absolute";
	oDv.style.visibility = 'hidden';
	document.body.appendChild(oDv);
}

function reloadBox(e) {
  scanBO(e);
  applyStyles();
}

function defHdrStyle() {
	dvHdr.innerHTML = '<img  style="vertical-align:middle" src="info.gif">&nbsp;&nbsp;'+dvHdr.innerHTML;
	dvHdr.style.fontWeight = 'bold';
	dvHdr.style.width = '150px';
	dvHdr.style.fontFamily = 'arial';
	dvHdr.style.border = '1px solid #A5CFE9';
	dvHdr.style.padding = '3';
	dvHdr.style.fontSize = '11';
	dvHdr.style.color = '#4B7A98';
	dvHdr.style.background = '#D5EBF9';
	dvHdr.style.filter = 'alpha(opacity=85)'; // IE
	dvHdr.style.opacity = '0.85'; // FF
}

function defBdyStyle() {
	dvBdy.style.borderBottom = '1px solid #A5CFE9';
	dvBdy.style.borderLeft = '1px solid #A5CFE9';
	dvBdy.style.borderRight = '1px solid #A5CFE9';
	dvBdy.style.width = '150px';
	dvBdy.style.fontFamily = 'arial';
	dvBdy.style.fontSize = '11';
	dvBdy.style.padding = '3';
	dvBdy.style.color = '#1B4966';
	dvBdy.style.background = '#FFFFFF';
	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;
}


function applyStyles() {
  if(CBE==null)return;
	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;
	}
  ifrm.style.width = (dvHdr.clientWidth + 3) + 'px';
  ifrm.style.height = (dvHdr.clientHeight + dvBdy.clientHeight + 3) + 'px';
}

// 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';
  }
}