//This is the master JavaScript file for www.SpatialProjects.com.au. -----------------------------

/* These functions (doSection, noSection) are used to make sidebars appear and disappear.
*/
function winOpen(docname)
{
var mysample=window.open(docname);
}

function doSection (secNum)
{
	//display the section if it's not displayed; hide it if it is displayed
	if (secNum.style.display=="none"){secNum.style.display=""}
	else{secNum.style.display="none"}
}

function noSection (secNum){
	//remove the section when user clicks in the opened DIV
	if (secNum.style.display==""){secNum.style.display="none"}
}

function doExpand(paraNum,arrowNum){
	//expand the paragraph and rotate the arrow; collapse and rotate it back
	//window.alert(paraNum);
	//alert ("doexp " + paraNum);
	if (paraNum.style.display=="none"){paraNum.style.display="";arrowNum.src="siteimages/arrowdn.gif"}
	else{paraNum.style.display="none";arrowNum.src="siteimages/arrowrt.gif"}
}

function doExpandMult(paraNum,arrowNum){
	//expand the paragraph and rotate the arrow; collapse and rotate it back
	//window.alert(paraNum);
	//alert ("doexp1 " + paraNum);
	var ielem = 0;
	var oElem;
    var svalue = paraNum.toString();
    while (1) {
        ielem++;
        svalue = paraNum.toString() + "." ;      //.toString();
        svalue = svalue + ielem.toString();
    	//alert ("sv " + svalue);
    	oElem = document.getElementById(svalue);
		if (oElem != null) {			//foudn a row to toggle
		    //alert ("got elem ");
	        if (oElem.style.display=="none"){
	            oElem.style.display="";
	            if (ielem == 1) arrowNum.src="siteimages/arrowdn.gif"
	        }
	        else {
	            oElem.style.display="none";
	            if (ielem == 1) arrowNum.src="siteimages/arrowrt.gif"
	        }
		}
		else return;
    }
 }

//These functions control the behavior of the homepage go arrows.
function liteGo(spNo){
	spNo.style.background="#00cc33";
	spNo.style.color="#FFFFFF";
}

function liteOff(spNo){
	spNo.style.background="transparent";
	spNo.style.color="#000000";
}

//Insert new functions here. Please use unique identifiers and comment liberally.

function flipImage(url)
{
    if (window.event.srcElement.tagName == "IMG" ) {
        window.event.srcElement.src = url;
    }
}

function showElementWithID(vitem) {
//	window.alert("showel");
/*	window.alert("?? " + valueOf(vitem).tostring);
	//doExpand(vitem,'a'+vitem)
	return; 
	for (i=0; i < document.all.length;i++) {
		if (document.all(i).id == vitem) window.alert (document.all(i).id);
	}
*/
}

// pjw - Show requested element (scroll & expand)
//fnInit();
//addEvent(window, 'onload', new Function('fnInit()'));
//addEvent(window, 'load', new Function('fnInit()'));						//pjw 20Sep05 - must be at end

function fnInit(){
	//alert("fn1 ");
   var sLocation=  location.href;
   var sData = sLocation.substring(sLocation.indexOf("?") + 1,sLocation.length);
	// ?expTag=fred -- expands fred and positions  
   var aData=new Array();
   aData = sData.split("&");
   for(var i = 0;i < aData.length;i++){
      var sName = aData[i].substring(0,aData[i].indexOf("="));
      var sValue = aData[i].substring(aData[i].indexOf("=")+1,aData[i].length);
      //alert(sName + ' = ' + unescape(sValue));
      if (sName == 'exptag') {		//expand this DIV!
		var oVDiv=document.getElementById(sValue);
		if (oVDiv != null) {			//15Jan07 - ovdiv case fix
			oVDiv.style.display="";
			oVDiv.scrollIntoView(true);
		}
      }
   }
	// if # only on line, expand and display
   var bData=new Array();
   bData = sLocation.split("#");			//first check for single # as redirect <tr id=fred>
	if (bData.length == 2) {
		if (bData[1] != 'nowhere') {
			var oVDiv=document.getElementById(bData[1]);
			if (oVDiv != null) {			//15jan07 - reenable null chk
				//alert("fnIn " + bData[1]);
				oVDiv.style.display="";
				oVDiv.scrollIntoView(true);
				return;
			}
		}
	}


}


//-----------------------------------------------------------------------------------
/*
FREESTYLE MENUS v1.0 RC (c) 2001-2005 Angus Turnbull, http://www.twinhelix.com
Altering this notice or redistributing this file is prohibited.
*/

var isDOM=document.getElementById?1:0,
	isIE=document.all?1:0,
	isNS4=navigator.appName=='Netscape'&&!isDOM?1:0,
	isOp=self.opera?1:0,
	isDyn=isDOM||isIE||isNS4;
function getRef(i,p){
	p=!p?document:p.navigator?p.document:p;
	return isIE?p.all[i]:isDOM?(p.getElementById?p:p.ownerDocument).getElementById(i):isNS4?p.layers[i]:null
	};
function getSty(i,p){
	var r=getRef(i,p);
	return r?isNS4?r:r.style:null
};
if(!self.LayerObj)var LayerObj=new Function('i','p',
						'this.ref=getRef(i,p);this.sty=getSty(i,p);return this');

function getLyr(i,p){return new LayerObj(i,p)};

function LyrFn(n,f){
	LayerObj.prototype[n]=new Function(
				'var a=arguments,p=a[0],px=isNS4||isOp?0:"px";with(this){'+f+'}')
};

	LyrFn('x','if(!isNaN(p))sty.left=p+px;else return parseInt(sty.left)');
	LyrFn('y','if(!isNaN(p))sty.top=p+px;else return parseInt(sty.top)');
	var aeOL=[];

function addEvent(o,n,f,l){
	var a='addEventListener',
		h='on'+n,
		b='',
		s='';
	if(o[a]&&!l)return o[a](n,f,false);
	o._c|=0;
	if(o[h]){
		b='_f'+o._c++;
		o[b]=o[h]}
	s='_f'+o._c++;
	o[s]=f;
	o[h]=function(e){
		e=e||window.event;
		var r=true;
		if(b)r=o[b](e)!=false&&r;
		//r=o[s](e)!=false&&r;
		//if(s) r=o[s](e)!=false&&r;			//pjw 21nov05	//15Jan07 - disable
		if(s && o[s]) r=o[s](e)!=false&&r;			//pjw 21nov05	//15Jan07 - disable
		return r;
};

aeOL[aeOL.length]={o:o,h:h}
};

addEvent(window,'unload',function(){for(var i=0;i<aeOL.length;i++)with(aeOL[i]){o[h]=null;for(var c=0;o['_f'+c];c++)o['_f'+c]=null}});

function FSMenu(myName,nested,cssProp,cssVis,cssHid){
	this.myName=myName;
	this.nested=nested;
	this.cssProp=cssProp;
	this.cssVis=cssVis;
	this.cssHid=cssHid;
	this.cssLitClass='';
	this.menus={root:new FSMenuNode('root',true,this)};
	this.menuToShow=[];
	this.mtsTimer=null;
	this.showDelay=0;
	this.switchDelay=125;
	this.hideDelay=500;
	this.showOnClick=0;
	this.animations=[];
	this.animSpeed=100;
	if(isIE&&!isOp)addEvent(window,'unload',new Function(myName+'=null'))
};

FSMenu.prototype.show=function(mN){with(this){menuToShow.length=arguments.length;for(var i=0;i<arguments.length;i++)menuToShow[i]=arguments[i];clearTimeout(mtsTimer);if(!nested)mtsTimer=setTimeout(myName+'.menus.root.over()',10)}};FSMenu.prototype.hide=function(mN){with(this){clearTimeout(mtsTimer);if(menus[mN])menus[mN].out()}};

function FSMenuNode(id,isRoot,obj){
	this.id=id;
	this.isRoot=isRoot;
	this.obj=obj;
	this.lyr=this.child=this.par=this.timer=this.visible=null;
	this.args=[];
	var node=this;
	this.over=function(evt){
		with(node)with(obj){
			if(isNS4&&evt&&lyr.ref)lyr.ref.routeEvent(evt);
			clearTimeout(timer);
			clearTimeout(mtsTimer);
			if(!isRoot&&!visible)node.show();
			if(menuToShow.length){
				var a=menuToShow,m=a[0];
				if(!menus[m]||!menus[m].lyr.ref) menus[m]=new FSMenuNode(m,false,obj);
				var c=menus[m];
				if(c==node){
					menuToShow.length=0;
					return}
				clearTimeout(c.timer);
				if(c!=child&&c.lyr.ref){
					c.args.length=a.length;
					for(var i=0;i<a.length;i++) c.args[i]=a[i];
					var delay=child?switchDelay:showDelay;
					c.timer=setTimeout('with('+myName+'){menus["'+c.id+'"].par=menus["'+node.id+'"];menus["'+c.id+'"].show()}',delay?delay:1)
					}
				menuToShow.length=0
			}
			if(!nested&&par)par.over()
		}
	};
	this.out=function(evt){
		with(node)with(obj){
			if(isNS4&&evt&&lyr&&lyr.ref) lyr.ref.routeEvent(evt);
			clearTimeout(timer);
			if(!isRoot){
				timer=setTimeout(myName+'.menus["'+id+'"].hide()',hideDelay);
				if(!nested&&par)par.out()
			}
		}
	};
	if(this.id!='root')
		with(this) with(lyr=getLyr(id)) if(ref){
			if(isNS4) ref.captureEvents(Event.MOUSEOVER|Event.MOUSEOUT);
			addEvent(ref,'mouseover',this.over);
			addEvent(ref,'mouseout',this.out);
			if(obj.nested){
				addEvent(ref,'focus',this.over);
				addEvent(ref,'click',this.over);
				addEvent(ref,'blur',this.out)
			}
		}
	};
	FSMenuNode.prototype.show=function(){
		with(this)with(obj){
			if(!lyr||!lyr.ref)return;
			if(par){
				if(par.child&&par.child!=this)par.child.hide();
				par.child=this
			}
			var offR=args[1],offX=args[2],offY=args[3],
				lX=0,lY=0,
				doX=''+offX!='undefined',
				doY=''+offY!='undefined';
			if(self.page&&offR&&(doX||doY)) {
				with(page.elmPos(offR,par.lyr?par.lyr.ref:0)) lX=x,lY=y;
				if(doX)lyr.x(lX+eval(offX));
				if(doY)lyr.y(lY+eval(offY))
			}
			if(offR)lightParent(offR,1);
			visible=1;
			if(obj.onshow)obj.onshow(id);
			setVis(1)
		}
	};
	FSMenuNode.prototype.hide=function(){
		with(this)with(obj){
			if(!lyr||!lyr.ref)return;
			if(isNS4&&self.isMouseIn&&isMouseIn(lyr.ref))return show();
			if(args[1])lightParent(args[1],0);
			if(child)child.hide();
			if(par&&par.child==this)par.child=null;
			if(lyr){
				visible=0;
				if(obj.onhide)obj.onhide(id);
				setVis(0)
			}
		}
	};
	FSMenuNode.prototype.lightParent=function(elm,lit){
		with(this)with(obj){
			if(!cssLitClass||isNS4)return;
			if(lit)elm.className+=(elm.className?' ':'')+cssLitClass;
			else elm.className=elm.className.replace(new RegExp('(\\s*'+cssLitClass+')+$'),'')
		}
	};
	FSMenuNode.prototype.setVis=function(sh){
		with(this)with(obj){
			lyr.timer|=0;
			lyr.counter|=0;
			with(lyr){
				clearTimeout(timer);
				if(sh&&!counter)sty[cssProp]=cssVis;
				if(isDOM&&animSpeed<100) for(var a=0;a<animations.length;a++)animations[a](ref,counter);
				counter+=animSpeed*(sh?1:-1);
				if(counter>100){counter=100}
				else if(counter<=0){
					counter=0;
					sty[cssProp]=cssHid
				}
				else if(isDOM) timer=setTimeout(myName+'.menus["'+id+'"].setVis('+sh+')',50)
			}
		}
	};
	FSMenu.prototype.activateMenu=function(id,subInd){
		with(this){
			if(!isDOM||!document.documentElement)return;
			var a,ul,li,parUL,mRoot=getRef(id),nodes,count=1;
			if (mRoot == null) return;                          //24Mar08 - fix
			if(isIE){
				var aNodes=mRoot.getElementsByTagName('a');
				for(var i=0;i<aNodes.length;i++){
					addEvent(aNodes[i],'focus',new Function('e','var node=this.parentNode;while(node){if(node.onfocus)setTimeout(node.onfocus,1,e);node=node.parentNode}'));
					addEvent(aNodes[i],'blur',new Function('e','var node=this.parentNode;while(node){if(node.onblur)node.onblur(e);node=node.parentNode}'))
				}
			}
			var lists=mRoot.getElementsByTagName('ul');
			for(var i=0;i<lists.length;i++){
				li=ul=lists[i];
				while(li){
					if(li.nodeName.toLowerCase()=='li')break;
					li=li.parentNode
				}
				if(!li)continue;
				parUL=li;
				while(parUL){
					if(parUL.nodeName.toLowerCase()=='ul')break;
					parUL=parUL.parentNode
				}
				a=null;
				for(var j=0;j<li.childNodes.length;j++)if(li.childNodes[j].nodeName.toLowerCase()=='a')a=li.childNodes[j];
				if(!a)continue;
				var menuID=myName+'-id-'+count++;
				if(ul.id)menuID=ul.id;
				else ul.setAttribute('id',menuID);
				var sOC=(showOnClick==1&&li.parentNode==mRoot)||(showOnClick==2);
				var eShow=new Function('with('+myName+'){var m=menus["'+menuID+'"],pM=menus["'+parUL.id+'"];'+(sOC?'if((pM&&pM.child)||(m&&m.visible))':'')+' show("'+menuID+'",this)}');
				var eHide=new Function(myName+'.hide("'+menuID+'")');
				addEvent(a,'mouseover',eShow);
				addEvent(a,'focus',eShow);
				addEvent(a,'mouseout',eHide);
				addEvent(a,'blur',eHide);
				if(sOC)addEvent(a,'click',new Function('e',myName+'.show("'+menuID+'",this);if(e.cancelable&&e.preventDefault)e.preventDefault();e.returnValue=false;return false'));
				if(subInd)a.insertBefore(subInd.cloneNode(true),a.firstChild)
			}
			menus[id]=new FSMenuNode(id,true,this)
		}
	};
	if(!self.page)var page={win:self,minW:0,minH:0,MS:isIE&&!isOp};
	page.elmPos=function(e,p){
		var x=0,y=0,w=p?p:this.win;
		e=e?(e.substr?(isNS4?w.document.anchors[e]:getRef(e,w)):e):p;
		if(isNS4){
			if(e&&(e!=p)){
				x=e.x;y=e.y
			};
			if(p){
				x+=p.pageX;
				y+=p.pageY
			}
		}
		if(e&&this.MS&&navigator.platform.indexOf('Mac')>-1&&e.tagName=='A'){
			e.onfocus=new Function('with(event){self.tmpX=clientX-offsetX;self.tmpY=clientY-offsetY}');
			e.focus();
			x=tmpX;
			y=tmpY;
			e.blur()
		}
		else while(e){
				x+=e.offsetLeft;
				y+=e.offsetTop;
				e=e.offsetParent
		}
		return{x:x,y:y}
	};
	if(isNS4){
		var fsmMouseX,fsmMouseY,fsmOR=self.onresize,nsWinW=innerWidth,nsWinH=innerHeight;
		document.fsmMM=document.onmousemove;
		self.onresize=function(){
			if(fsmOR)fsmOR();
			if(nsWinW!=innerWidth||nsWinH!=innerHeight)location.reload()
		};
		document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove=function(e){
			fsmMouseX=e.pageX;
			fsmMouseY=e.pageY;
			return document.fsmMM?document.fsmMM(e):document.routeEvent(e)
		};
	function isMouseIn(sty){
		with(sty) return((fsmMouseX>left)&&(fsmMouseX<left+clip.width)&&(fsmMouseY>top)&&(fsmMouseY<top+clip.height))
	}
}
		
// End of main fsmenu.js ...
// append other stuff		

//<![CDATA[

// For each menu you create, you must create a matching "FSMenu" JavaScript object to represent
// it and manage its behaviour. You don't have to edit this script at all if you don't want to;
// these comments are just here for completeness. Also, feel free to paste this script into the
// external .JS file to make including it in your pages easier!

// Here's a menu object to control the above list of menu data:
var listMenu = new FSMenu('listMenu', true, 'visibility', 'visible', 'hidden');

// The parameters of the FSMenu object are:
//  1) Its own name in quotes.
//  2) Whether this is a nested list menu or not (in this case, true means yes).
//  3) The CSS property name to change when menus are shown and hidden.
//  4) The visible value of that CSS property.
//  5) The hidden value of that CSS property.
//
// Next, here's some optional settings for delays and highlighting:
//  * showDelay is the time (in milliseconds) to display a new child menu.
//  * switchDelay is the time to switch from one child menu to another child menu.
//    Set this higher and point at 2 neighbouring items to see what it does.
//  * hideDelay is the time it takes for a menu to hide after mouseout.
//  * cssLitClass is the CSS classname applied to parent items of active menus.
//  * showOnClick will, suprisingly, set the menus to show on click. Pick one of 3 values:
//    0 = all mouseover, 1 = first level click, sublevels mouseover, 2 = all click.

//listMenu.showDelay = 0;
//listMenu.switchDelay = 125;
//listMenu.hideDelay = 500;
listMenu.cssLitClass = 'highlighted';
//listMenu.showOnClick = 1;

// Now the fun part... animation! This script supports animation plugins you can add to each
// menu object you create. Here's two to get you started. To enable animation, add one or
// more functions to the menuObject.animations array, and set menuObject.animSpeed to the
// desired percentage of animation to be completed per frame.
// Animation functions are called with a reference to the menu element being animated,
// and a counter variable that changes from 0 to 100 depending on the animation progress.

function animClipDown(ref, counter)
{
 var cP = Math.pow(Math.sin(Math.PI*counter/200),0.75);
 ref.style.clip = (counter==100 ?
  ((window.opera || navigator.userAgent.indexOf('KHTML') > -1) ? '':
   'rect(auto, auto, auto, auto)') :
    'rect(0, ' + ref.offsetWidth + 'px, '+(ref.offsetHeight*cP)+'px, 0)');
};

function animFade(ref, counter)
{
 var f = ref.filters, done = (counter==100);
 if (f)
 {
  if (!done && ref.style.filter.indexOf("alpha") == -1)
   ref.style.filter += ' alpha(opacity=' + counter + ')';
  else if (f.length && f.alpha) with (f.alpha)
  {
   if (done) enabled = false;
   else { opacity = counter; enabled=true }
  }
 }
 else ref.style.opacity = ref.style.MozOpacity = counter/100.1;
};

// I'm applying them both to this menu and setting the speed to 20%. Delete this to disable.
listMenu.animations[listMenu.animations.length] = animFade;
listMenu.animations[listMenu.animations.length] = animClipDown;
listMenu.animSpeed = 20;


// Finally, on page load you have to activate the menu by calling its 'activateMenu()' method.
// I've provided an "addEvent" method that lets you easily run page events across browsers.
// You pass the activateMenu() function two parameters:
//  (1) The ID of the outermost <ul> list tag containing your menu data.
//  (2) A node containing your submenu popout arrow indicator.
// If none of that made sense, just cut and paste this next bit for each menu you create.

var arrow = null;
if (document.createElement && document.documentElement)
{
 arrow = document.createElement('span');
 arrow.appendChild(document.createTextNode('>'));
 // Feel free to replace the above two lines with these for a small arrow image...
 arrow = document.createElement('img');
 arrow.src = 'rarrow1.gif';
 arrow.align = 'bottom';
 arrow.style.borderWidth = '0';

 arrow.className = 'subind';
}

addEvent(window, 'load', new Function('listMenu.activateMenu("listMenuRoot", arrow)'));
//addEvent(window, 'load', new Function('fnInit()'));						//pjw 20Sep05

// MENU FLOATING: This will scroll a menu with the page.
// To activate:
//  1) Wrap each menu with a tag like this: <div id="abcdef"> <MENU DATA GOES HERE> </div>
//     That should either be in a column by itself, or have POSITION:ABSOLUTE set in its CSS.
//  2) Add the ID of the DIVs wrapping each menu to the fsmScrollHandler() function below.
//  3) Paste the script below at the end of fsmenu.js

// If you have good CSS knowledge, consider implementing a position:fixed solution in supported
// browsers. This is a general, JS-only floating function designed to work with most layouts.

function fsmScrollHandler()
{
 floatElement('spMenus');
 // ADD OTHER PAGE ELEMENTS CONTAINING MENUS HERE.
};

function floatElement(containerID)
{
 var container = getRef(containerID);
 var topmargin = 110;
 if (!container) return;
/* 
 container.style.paddingTop = (typeof window.pageYOffset == 'number' ? window.pageYOffset :
  (document.body ? document.body.scrollTop || document.documentElement.scrollTop : 0)) + 'px';
*/  

//pw extension to allow for top page offset
if (typeof window.pageYOffset == 'number') {
	//container.style.paddingTop = max(window.pageYOffset - topmargin, 0) + 'px';
	container.style.paddingTop = (window.pageYOffset - topmargin).ToString + 'px';
	if (window.pageYOffset - topmargin < 0) container.style.paddingTop = '0px';
	//window.alert( "in num " + str(window.pageYOffset));
}
else if (document.body) {
	container.style.paddingTop = document.body.scrollTop || document.documentElement.scrollTop;
	var npt, npt1, pt ;
	pt = container.style.paddingTop;
	npt = parseInt(pt.replace("px",""));
	if (npt > topmargin) npt1 = npt - topmargin;
	else npt1 = 0;
	container.style.paddingTop = npt1.toString() + 'px';
	//window.alert( "in num " + npt + " " + npt1 + " " + container.style.paddingTop);

}
else container.style.paddingTop = 0 + 'px';
  
  
 window.status = container.style.paddingTop;
};
if (''+window.onscroll=='undefined') setInterval('fsmScrollHandler()', 500);
else addEvent(window, 'scroll', fsmScrollHandler);

//--------------------------------------------------------------------------------------------
// Following is circular button script ...

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

//------------ Document Zoom
/*
var zoomVal=0;
function zoom(val){
if(!document.body||!document.body.style)return;
zoomVal=(val?zoomVal+val:0);
document.body.style.fontSize=(80+zoomVal*10)+'%'};

//----------------

var pZoom=document.createElement('div');
pZoom.setAttribute('id','pagezoom');
var zControls=[['+X'.substring(0,1),'Zoom In','zoom(1)'],['0','Restore Original Zoom','zoom(0)'],['-','Zoom Out','zoom(-1)']];

for(var c in zControls){
	var tmp=document.createElement('span');
	tmp.appendChild(document.createTextNode(zControls[c][0]));
	tmp.setAttribute('title',zControls[c][1]);
	addEvent(tmp,'click',new Function(zControls[c][2]));
	addEvent(tmp,'mouseover',new Function('this.className="zoomHover"'));
	addEvent(tmp,'mouseout',new Function('this.className=""'));
	pZoom.appendChild(tmp)
	document.write(tmp);

}
getRef('header').appendChild(pZoom);
*/
addEvent(window, 'load', new Function('fnInit()'));						//pjw 20Sep05

