/* --- 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 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(dvBdy);
	

		/*
		Script Name: Full Featured Javascript Browser/OS detection
		Authors: Harald Hope, Tapio Markula, Websites: http://techpatterns.com/
		http://www.nic.fi/~tapio1/Teaching/index1.php3
		Script Source URI: http://techpatterns.com/downloads/javascript_browser_detection.php
		Version 4.2.4
		Copyright (C) 29 June 2007
		
		This program is free software; you can redistribute it and/or modify it under 
		the terms of the GNU General Public License as published by the Free Software
		Foundation; either version 3 of the License, or (at your option) any later version.
		
		This program is distributed in the hope that it will be useful, but WITHOUT 
		ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
		FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
		
		Get the full text of the GPL here: http://www.gnu.org/licenses/gpl.txt
		
		Coding conventions:
		http://cvs.sourceforge.net/viewcvs.py/phpbb/phpBB2/docs/codingstandards.htm?rev=1.3
		*/
		
		/*************************************************************
		Full version, use it if you are pushing css to its functional limits, and/or are using 
		specialized javascript.
		
		Remember, always use method or object testing as your first choice, for example, if ( dom ) { statement; };
		
		This browser detection includes all possibilities I think for most browsers.
		Let me know if you find an error or a failure to properly detect, or if there
		is a relevant browser that has special needs for detection at our tech forum:
		http://techpatterns.com/forums/forum-11.html
		The main script is separated from the initial netscape 4 detection due to certain bugs in
		netscape 4 when it comes to unknown things like d.getElementById. The variable declarations
		of course are made first to make sure that all the variables are global through the page, 
		otherwise a javascript error will occur because you are trying to use an undeclared variable.
		
		We test for both browser type (ie, op, or moz/netscape > 6) and version number, then place 
		the version number into a variable which can be tested for < or > values, such as 
		if (moz && nu> 1.1){....statement....;}
		This seems quite reliable, especially for Opera and Mozilla, where there is no other
		easy way to get the actual version number.
		
		For more in depth discussion of css and browser issues go to:
		http://www.nic.fi/~tapio1/Teaching/DynamicMenusb.php#detections
		http://www.nic.fi/~tapio1/Teaching/FAQ.php3
		
		***************************************************************/
		//initialization, browser, os detection
		var d, dom, nu='', brow='', ie, ie4, ie5, ie5x, ie6, ie7;
		var ns4, moz, moz_rv_sub, release_date='', moz_brow, moz_brow_nu='', moz_brow_nu_sub='', rv_full=''; 
		var mac, win, old, lin, ie5mac, ie5xwin, konq, saf, op, op4, op5, op6, op7;
		
		d=document;
		n=navigator;
		nav=n.appVersion;
		nan=n.appName;
		nua=n.userAgent;
		old=(nav.substring(0,1)<4);
		mac=(nav.indexOf('Mac')!=-1);
		win=( ( (nav.indexOf('Win')!=-1) || (nav.indexOf('NT')!=-1) ) && !mac)?true:false;
		lin=(nua.indexOf('Linux')!=-1);
		// begin primary dom/ns4 test
		// this is the most important test on the page
		if ( !document.layers )
		{
			dom = ( d.getElementById ) ? d.getElementById : false;
		}
		else { 
			dom = false; 
			ns4 = true;// only netscape 4 supports document layers
		}
		// end main dom/ns4 test
		
		op=(nua.indexOf('Opera')!=-1);
		saf=(nua.indexOf('Safari')!=-1);
		konq=(!saf && (nua.indexOf('Konqueror')!=-1) ) ? true : false;
		moz=( (!saf && !konq ) && ( nua.indexOf('Gecko')!=-1 ) ) ? true : false;
		ie=((nua.indexOf('MSIE')!=-1)&&!op);
		if (op)
		{
			str_pos=nua.indexOf('Opera');
			nu=nua.substr((str_pos+6),4);
			brow = 'Opera';
		}
		else if (saf)
		{
			str_pos=nua.indexOf('Safari');
			nu=nua.substr((str_pos+7),5);
			brow = 'Safari';
		}
		else if (konq)
		{
			str_pos=nua.indexOf('Konqueror');
			nu=nua.substr((str_pos+10),3);
			brow = 'Konqueror';
		}
		// this part is complicated a bit, don't mess with it unless you understand regular expressions
		// note, for most comparisons that are practical, compare the 3 digit rv nubmer, that is the output
		// placed into 'nu'.
		else if (moz)
		{
			// regular expression pattern that will be used to extract main version/rv numbers
			pattern = /[(); \n]/;
			// moz type array, add to this if you need to
			moz_types = new Array( 'Firebird', 'Phoenix', 'Firefox', 'Iceweasel', 'Galeon', 'K-Meleon', 'Camino', 'Epiphany', 'Netscape6', 'Netscape', 'MultiZilla', 'Gecko Debian', 'rv' );
			rv_pos = nua.indexOf( 'rv' );// find 'rv' position in nua string
			rv_full = nua.substr( rv_pos + 3, 6 );// cut out maximum size it can be, eg: 1.8a2, 1.0.0 etc
			// search for occurance of any of characters in pattern, if found get position of that character
			rv_slice = ( rv_full.search( pattern ) != -1 ) ? rv_full.search( pattern ) : '';
			//check to make sure there was a result, if not do  nothing
			// otherwise slice out the part that you want if there is a slice position
			( rv_slice ) ? rv_full = rv_full.substr( 0, rv_slice ) : '';
			// this is the working id number, 3 digits, you'd use this for 
			// number comparison, like if nu >= 1.3 do something
			nu = rv_full.substr( 0, 3 );
			for (i=0; i < moz_types.length; i++)
			{
				if ( nua.indexOf( moz_types[i]) !=-1 )
				{
					moz_brow = moz_types[i];
					break;
				}
			}
			if ( moz_brow )// if it was found in the array
			{
				str_pos=nua.indexOf(moz_brow);// extract string position
				moz_brow_nu = nua.substr( (str_pos + moz_brow.length + 1 ) ,3);// slice out working number, 3 digit
				// if you got it, use it, else use nu
				moz_brow_nu = ( isNaN( moz_brow_nu ) ) ? moz_brow_nu = nu: moz_brow_nu;
				moz_brow_nu_sub = nua.substr( (str_pos + moz_brow.length + 1 ), 8);
				// this makes sure that it's only the id number
				sub_nu_slice = ( moz_brow_nu_sub.search( pattern ) != -1 ) ? moz_brow_nu_sub.search( pattern ) : '';
				//check to make sure there was a result, if not do  nothing
				( sub_nu_slice ) ? moz_brow_nu_sub = moz_brow_nu_sub.substr( 0, sub_nu_slice ) : '';
			}
			if ( moz_brow == 'Netscape6' )
			{
				moz_brow = 'Netscape';
			}
			else if ( moz_brow == 'rv' || moz_brow == '' )// default value if no other gecko name fit
			{
				moz_brow = 'Mozilla';
			} 
			if ( !moz_brow_nu )// use rv number if nothing else is available
			{
				moz_brow_nu = nu;
				moz_brow_nu_sub = nu;
			}
			if (n.productSub)
			{
				release_date = n.productSub;
			}
		}
		else if (ie)
		{
			str_pos=nua.indexOf('MSIE');
			nu=nua.substr((str_pos+5),3);
			brow = 'Microsoft Internet Explorer';
		}
		// default to navigator app name
		else 
		{
			brow = nan;
		}
		op5=(op&&(nu.substring(0,1)==5));
		op6=(op&&(nu.substring(0,1)==6));
		op7=(op&&(nu.substring(0,1)==7));
		op8=(op&&(nu.substring(0,1)==8));
		op9=(op&&(nu.substring(0,1)==9));
		ie4=(ie&&!dom);
		ie5=(ie&&(nu.substring(0,1)==5));
		ie6=(ie&&(nu.substring(0,1)==6));
		ie7=(ie&&(nu.substring(0,1)==7));
		// default to get number from navigator app version.
		if(!nu) 
		{
			nu = nav.substring(0,1);
		}
		/*ie5x tests only for functionavlity. dom or ie5x would be default settings. 
		Opera will register true in this test if set to identify as IE 5*/
		ie5x=(d.all&&dom);
		ie5mac=(mac&&ie5);
		ie5xwin=(win&&ie5x);
		
		/********************************************************
		here is a sample use of the browser detector, it would load a browser specific stylesheet
		for certain unsupported or improperly supported mac ie 5 css styles. The depth variable
		is used so that the javascript library file can be used from anywhere in the website, you simply
		insert the depth of the file like this, 
		...
		 <head>
		 <title>Browser information Page</title>
		
		 <meta http-equiv = "Content-Type" content = "text/html; charset = iso-8859-1" />
		 <link rel = "stylesheet" type = "text/css" href = "css/main.css" />
		 <script type = "text/javascript" src = "/js/browser_detection.js"> </script>
		 <script type = "text/javascript>browser_css( ); </script>
		 </head>
		
		in the head of the web page after the js file is loaded.
		Or if you are always referring your site to the root, you wouldn't need that
		 and could delete the depth variable and just use the absolute path to the root.
		
		function browser_css( ) {
			d = document;
			if ( ie5mac ) {
				d.write('<link rel = "stylesheet" type = "text\/css" href = "/css/ie5mac.css" />');
			}
			else if ( document.layers ){
				d.write('<link rel = "stylesheet" type = "text\/css" href = "/css/ns4x.css" />');
			}
			else if ( ie4 ){
				d.write('<link rel = "stylesheet" type = "text\/css" href = "/css/ie4.css" />');
			}
			else if ( moz && ( nu < 1 ) ){
				d.write('<link rel = "stylesheet" type = "text\/css" href = "/css/moz_pre1-0.css" />');
			}
			else {
				d.write('<link rel = "stylesheet" type = "text\/css" href = "/css/moz5.css" />');
			}
		}
		********************************************************/
		if ( ie6 ) {
			oDv.style.position="absolute";
		}
		else {
			oDv.style.position="fixed";
		}


	oDv.style.visibility='hidden';
	document.body.appendChild(oDv);	
}

function defBdyStyle() {
	dvBdy.style.borderBottom='1px solid #A5CFE9';
	dvBdy.style.borderLeft='1px solid #A5CFE9';
	dvBdy.style.borderRight='1px solid #A5CFE9';
	dvBdy.style.border='1px solid #1E5C33';
	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.filter='alpha(opacity=100)'; // IE
	dvBdy.style.opacity='0.85'; // FF
	dvBdy.style.opacity='1'; // 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.boBDY=getParam('body',curNode.title);
			curNode.boCSSBDY=getParam('cssbody',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);
	dvBdy=document.createElement("div");
	CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle();
	dvBdy.innerHTML=CBE.boBDY;
	ab=false;
	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,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,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';
   }
}