
/* Suckerfish menu system */
sfHover = function() {
var ieULs = document.getElementById('nav').getElementsByTagName('ul');
/** IE script to cover <select> elements with <iframe>s **/
for (j=0; j<ieULs.length; j++) {
ieULs[j].innerHTML = ('<iframe src="about:blank" scrolling="no" frameborder="0"></iframe>' + ieULs[j].innerHTML);
/*ieULs[j].innerHTML = ('<iframe id="iePad' + j + '" src="about:blank" scrolling="no" frameborder="0" style=""></iframe>' + ieULs[j].innerHTML);
 var ieMat = document.getElementById('iePad' + j + '');*/
// var ieMat = ieULs[j].childNodes[0];  alert(ieMat.nodeName); // also works...
 var ieMat = ieULs[j].firstChild;
  ieMat.style.width=ieULs[j].offsetWidth+"px";
  ieMat.style.height=ieULs[j].offsetHeight+"px"; 
  ieULs[j].style.zIndex="99";
}
/** IE script to change class on mouseover **/
 var ieLIs = document.getElementById('nav').getElementsByTagName('li');
 for (var i=0; i<ieLIs.length; i++) if (ieLIs[i]) {
  ieLIs[i].onmouseover=function() {this.className+=" sfhover";}
  ieLIs[i].onmouseout=function() {this.className=this.className.replace(' sfhover', '');}
 }}
if (window.attachEvent) window.attachEvent('onload', sfHover);


/* DOM Collapse */

function load_dc()
{
	domcollapse('makeunique'); 	
	//  enables domcollapse all three links and allows several expanded elements
	// domcollapse('makeunique'); 	
	//  enables domcollapse and allows only one expanded element
	// domcollapse('nounique'); 
	//  enables domcollapse offers no make one element unique link
}
/*
	DomCollapse 
	Turns elements of a page into triggers to collapse and expand other elements
	written by Christian Heilmann
	For all enquiries check the homepage: http://www.onlinetools.org/tools/domcollapse/
*/
function domcollapse(cmd)
{
	if(!document.getElementById || !document.createTextNode){return;}
/* Variables */
	// Class Names
	var normalTriggerClass='readmore';
	var expandedTriggerClass='readmoreexpanded';
	var hoverTriggerClass='readmorehover';
	var normalElementClass='elementnormal';
	var collapsedElementClass='elementcollapsed'
	// Images
	// the %section% will be replaced by the text content of the trigger element
	var expandMessage='Expand section: %section%';
	var expandImage='plus.gif';
	var collapseMessage='Collapse section: %section%';
	var collapseImage='minus.gif';
	// Messages
	var collapseAllMessage='collapse all';
	var expandAllMessage='expand all';
	var triggerUniqueMessage='Only allow one expanded element';
	var triggerNonUniqueMessage='Allow multiple expanded elements';
	// element to add collapse/expand all links to
	var collapseAllElement='domcollapseall';
	// id that triggers the 'show only one element' functionality
	// this gets set automatically
	var enableAlternateElement='domcollapsealternate';

	var triggers=document.getElementsByTagName('*'); // Change as applicable!

	switch(cmd)
	{
/* collapse all */
		case 0:
			for(var i=0;i<triggers.length;i++)
			{
				if(!cssjs('check',triggers[i],normalTriggerClass) && !cssjs('check',triggers[i],expandedTriggerClass)){continue;}
				cssjs('remove',triggers[i],expandedTriggerClass);
				cssjs('add',triggers[i],normalTriggerClass);
				cssjs('remove',triggers[i].hideElement,normalElementClass)
				cssjs('add',triggers[i].hideElement,collapsedElementClass)
				//addimage(triggers[i],false);
			}
		break;
/* expand all */
		case 1:
			for(var i=0;i<triggers.length;i++)
			{
				if(!cssjs('check',triggers[i],normalTriggerClass) && !cssjs('check',triggers[i],expandedTriggerClass)){continue;}
				cssjs('remove',triggers[i],normalTriggerClass);
				cssjs('add',triggers[i],expandedTriggerClass);
				cssjs('remove',triggers[i].hideElement,collapsedElementClass)
				cssjs('add',triggers[i].hideElement,normalElementClass)
				//addimage(triggers[i],true);
			}
		break;
		default:
/* initialise all */
			for(var i=0;i<triggers.length;i++)
			{
				if(!cssjs('check',triggers[i],normalTriggerClass) && !cssjs('check',triggers[i],expandedTriggerClass)){continue;}
				var newa=document.createElement('a');
				//var newimg=document.createElement('img');
				//var locexpandMessage=expandMessage.replace(/%section%/,triggers[i].firstChild.nodeValue);
				//var loccollapseMessage=collapseMessage.replace(/%section%/,triggers[i].firstChild.nodeValue);
				//newimg.src=cssjs('check',triggers[i],expandedTriggerClass)?collapseImage:expandImage;
				//newimg.alt=cssjs('check',triggers[i],expandedTriggerClass)?loccollapseMessage:locexpandMessage;
				//newimg.title=cssjs('check',triggers[i],expandedTriggerClass)?loccollapseMessage:locexpandMessage;;
				//newa.appendChild(newimg);
				//newa.href='#';
				triggers[i].insertBefore(newa,triggers[i].firstChild);
				var tohide=triggers[i].nextSibling;
				while(tohide.nodeType!=1)
				{
					tohide=tohide.nextSibling;
				}
				var toadd=cssjs('check',triggers[i],expandedTriggerClass)?normalElementClass:collapsedElementClass;
				cssjs('add',tohide,toadd);
				triggers[i].hideElement=tohide;
				triggers[i].onmouseover=function()
				{
					cssjs('add',this,hoverTriggerClass);
				}
				triggers[i].onmouseout=function()
				{
					cssjs('remove',this,hoverTriggerClass);
				}
				triggers[i].onclick=function()
				{
// collapse all before showing the current element
					if(document.getElementById(enableAlternateElement))
					{
						for(var i=0;i<triggers.length;i++)
						{
							if(!cssjs('check',triggers[i],normalTriggerClass) && !cssjs('check',triggers[i],expandedTriggerClass)){continue;}
							if(triggers[i]==this){continue;}
							cssjs('remove',triggers[i],expandedTriggerClass)
							cssjs('add',triggers[i],normalTriggerClass)
							cssjs('remove',triggers[i].hideElement,normalElementClass)
							cssjs('add',triggers[i].hideElement,collapsedElementClass)
							//addimage(triggers[i],false);
						}
						if(cssjs('check',this,expandedTriggerClass))
						{
							cssjs('swap',this,expandedTriggerClass,normalTriggerClass)
							cssjs('swap',this.hideElement,normalElementClass,collapsedElementClass)
							//addimage(this,false);
						} else {
							cssjs('swap',this,normalTriggerClass,expandedTriggerClass)
							cssjs('swap',this.hideElement,collapsedElementClass,normalElementClass)
							//addimage(this,true);
						}	
					} else {
// show hide on click of the trigger element
						if(cssjs('check',this,expandedTriggerClass))
						{
							cssjs('swap',this,expandedTriggerClass,normalTriggerClass)
							cssjs('swap',this.hideElement,normalElementClass,collapsedElementClass)
							//addimage(this,false);
						} else {
							cssjs('swap',this,normalTriggerClass,expandedTriggerClass)
							cssjs('swap',this.hideElement,collapsedElementClass,normalElementClass)
							//addimage(this,true);
						}	
					}
					return false;
				}
			}
		break;
	}
/* Collapse and Expand all links */
	var metalinks=document.getElementById(collapseAllElement);
	if(!metalinks || metalinks.getElementsByTagName('ul')[0]){return;}
	var newul=document.createElement('ul');
	var newli=document.createElement('li');
	newa=document.createElement('a');
	newa.href='#';
	newa.onclick=function(){domcollapse(1);return false;}
	newa.appendChild(document.createTextNode(expandAllMessage));
	newli.appendChild(newa);
	newul.appendChild(newli);		

	newli=document.createElement('li');
	newa=document.createElement('a');
	newa.href='#';
	newa.onclick=function(){domcollapse(0);return false;}
	newa.appendChild(document.createTextNode(collapseAllMessage));
	newli.appendChild(newa);
	newul.appendChild(newli);
	if(cmd!='nounique')
	{
		newli=document.createElement('li');
		newa=document.createElement('a');
		newa.href='#';
		newa.onclick=function()
		{
			if(this.id==enableAlternateElement)
			{
				this.removeAttribute('id');
				this.replaceChild(document.createTextNode(triggerUniqueMessage),this.firstChild);					
			} else {
				this.id=enableAlternateElement;
				this.replaceChild(document.createTextNode(triggerNonUniqueMessage),this.firstChild);					
			}
			return false;
		}
		if(cmd=='makeunique')
		{
			newa.id=enableAlternateElement;
			newa.appendChild(document.createTextNode(triggerNonUniqueMessage));
		} else {
			newa.appendChild(document.createTextNode(triggerUniqueMessage));
		}
		newli.appendChild(newa);
		newul.appendChild(newli);
	}
	metalinks.appendChild(newul);			

	//function addimage (o,state)
	//{
		//var locexpandMessage=expandMessage.replace(/%section%/,o.childNodes[1].nodeValue);
		//var loccollapseMessage=collapseMessage.replace(/%section%/,o.childNodes[1].nodeValue);
		//o.getElementsByTagName('img')[0].src=state?collapseImage:expandImage;
		//o.getElementsByTagName('img')[0].alt=state?loccollapseMessage:locexpandMessage;
		//o.getElementsByTagName('img')[0].title=state?loccollapseMessage:locexpandMessage;
	//}
	function cssjs(a,o,c1,c2)
	{
		switch (a){
			case 'swap':
				o.className=!cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp('\\b'+c1+'\\b').test(o.className)
			break;
		}
	}
}


/* Popup Toric Calculator */

var newWindow = null;

function popUp(strURL,strType,strHeight,strWidth) {
var strOptions="";
if (strType=="console") strOptions="resizable,height="+strHeight+",width="+strWidth;
if (strType=="fixed") strOptions="status,height="+strHeight+",width="+strWidth;
if (strType=="elastic") strOptions="toolbar,menubar,scrollbars,resizable,location,height="+strHeight+",width="+strWidth;
window.open(strURL, 'newWin', strOptions);
}


// Nasty kludgy Soft-hyphen hack
// v0.1 by yoz@yoz.com, 17/01/05

// This code can be added to any HTML page to provide better soft hyphen
// support for Mozilla-based browsers.
// doShyTags() should be called on page load, and shyreflow() on any
// occasion where reflow is needed (such as the onresize event)
//
// At present, soft hyphens are only dealt with when surrounded by
// characters matched by the "\w" regexp character class.
// If you'd like to fix this, please edit the regexp at the start
// of doShyTags() and send me your edits


var doneshytags = false; // set to true once we've rebuilt the HTML
var counter = 0; // used for generating numeric IDs
var shys = new Array(); // used for storing refs to our Shy objects
var shyids = new Array(); // used for storing num IDs to Shy elements

// replacer() is called by the replace call in doShyTags()
// it takes words that use &shy; and breaks them into a number of SPAN
// elements, while storing the IDs of the shy elements
function replacer(s, n, full) {

	// split on &shy;
	var splitword = s.split(/\xAD/i);
	
	// now wrap everything in new SPAN elements, keeping track of 
	// used IDs
	var newword = "";
	for (i=0;i<splitword.length;i++)
	{
		if (newword != "") // if we're in the middle of a word
		{
			// add a shy element
			newword += "<span id='shy"+(++counter)+"'>- </span>";
			shyids.push(counter);
		}
		
		newword += "<span id='shy"+ (++counter) + "'>" + splitword[i] + "</span>";
	}

	return newword;	
	
}

// doShyTags() locates all &shy; entities and breaks the surrounding word into
// a set of separated referenceable elements 
// then creates and stores Shy objects for each &shy; element

function doShyTags() {
	
	// NOTE: ANY ADDED SUPPORT FOR FOREIGN CHARACTERS SHOULD GO
	// IN THE REGEXP BELOW, ADDED TO BOTH "[..]" CLASSES
	var wordre = /[\w]+\xAD[\w\xAD]+/gi; // RE to match words with &shy;
	
	// replace all words using &shy; with munged equivalents
	if (document.body.innerHTML.search(wordre) >= 0) {
		document.body.innerHTML = document.body.innerHTML.replace(wordre,replacer);
	}
	
	// create Shy objects for each shy element we created
	for(i=0;i<shyids.length;i++)
	{
		shys.push(new Shy(shyids[i]));
	}
	
	doneshytags = true;
	
	// and we're done
	
}

// constructor for Shy object.
// Is given a numeric ID $n, looks for shy element named "shy$x" in the document
// then creates an object referencing that element's style object and the
// style objects of the text elements on either side

function Shy(n) {
	this.style = document.getElementById("shy"+n).style;
	this.next = document.getElementById("shy"+(n+1));
	this.prev = document.getElementById("shy"+(n-1));
	return this;
}

// shyreflow() - goes through the document checking and setting visibilities
// on shy elements. It does this by checking whether the text nodes before and
// after are on the same line; if so, the shy should not be visible

function shyreflow() {
	
	// to start: make all Shy objects visible
	for (i=0;i<shys.length;i++)
	{
		shys[i].style.display = "";
	}
	
	// now check heights of text elements on either side. If the same,
	// make the shy invisible
	for (i=0;i<shys.length;i++)
	{
		
		//alert("Left: "+ shys[i].prev.offsetTop +
		//			", right:" + shys[i].next.offsetTop);
			
		if (shys[i].next.offsetTop == shys[i].prev.offsetTop)
		{
			
			shys[i].style.display = "none";
		}
	}
}

window.onLoad = function () {
	doShyTags();
	shyreflow();
	load_dc()
}

window.onresize = function () {
	shyreflow();
}