﻿<!--

// Set dropdown menus to inactive - onload makes them active

	var menuSystemActive = false;
	
// detection of platforms

	// iphone + ipod safari
	var iphoneMode = false;
	if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) iphoneMode = true;
	

// Set the window name

	window.name = "main";


// onload triggers

	function pageTrigger() {
		if(graphicVersion) {
			menuSystemActive = true;
			document.getElementById("headerSearchField").setAttribute("autocomplete", "off"); 
			initScrollers();
			initExpanders();
			// catalogue page
			if(document.getElementById("topTabs")) {
				// check size cover pic
				checkImageSize(document.getElementById("titleCoverImg"),223,348);
				// review form
				if(document.getElementById("reviewFormExpander")) {
					document.getElementById("reviewFormExpander").innerHTML = document.getElementById("reviewFormHolder").innerHTML;
					document.getElementById("reviewFormHolder").innerHTML = "";
					document.getElementById("reviewFormHolder").style.display = "none";
				}
			}
			// homepage tabbed box
			if(document.getElementById("homeTabbedBoxTabs")) startTabCycle();
			// fix for submit forms by hitting 'return'
			inputSubmitByReturn();
		}
	}
	
// fix for submit forms by hitting 'return'

	function addInputSubmitEvent(form, input) {
		input.onkeydown = function(e) {
			e = e || window.event;
			if (e.keyCode == 13) {
				form.submit();
				return false;
			}
		};
	}

	function inputSubmitByReturn() {
		var forms = document.getElementsByTagName('form');
		for (var i=0;i < forms.length;i++) {
			var inputs = forms[i].getElementsByTagName('input');
			for (var j=0;j < inputs.length;j++) {
				addInputSubmitEvent(forms[i], inputs[j]);
			}
		}
	}
	
// back to top function
	
	function toTop() {
		window.scroll(0,0);
		return false;
	}
	
// pop-up window opener

	window.name = "main";

	function openWindow(srcLink,wWidth,wHeight) {
		if(srcLink) {
			if(wWidth && wHeight) {
				window.open(srcLink, '', 'toolbar=no,menubar=yes,scrollbars=yes,resizable=yes,width=' + wWidth + ',height=' + wHeight);
			} else {
				window.open(srcLink, '', 'toolbar=no,menubar=yes,scrollbars=yes,resizable=yes');
			}
			return false;
		}
	}


// Function to check if a field string is empty
	
	function isEmptyField(srcField) {
		srcText = srcField.value;
		srcText = srcText.replace(/^\s+/g, '').replace(/\s+$/g, '');
		if(srcText == "") {
			srcField.value = "";
			return true;
		} else return false;
	}
	
	
// Email address validation
	
	function isValidEmail(src) {
		var emailReg = "^\\w+[\\+\\.\\w-]*@([\\w-]+\\.)*\\w+[\\w-]*\\.([A-Za-z]{2,4}|\\d+)$";
		var regex = new RegExp(emailReg);
		return regex.test(src);
	}
	
	
// Image size checking + resizing

	function checkImageSize(srcImage,maxWidth,maxHeight) {
		if(document.images) {
			getWidth = srcImage.width;
			getHeight = srcImage.height;
			if(getWidth>maxWidth || getHeight>maxHeight) {
				widthVariance = maxWidth/getWidth;
				heightVariance = maxHeight/getHeight;
				if(widthVariance<=heightVariance) scalePercentage = getWidth/maxWidth;
				else scalePercentage = getHeight/maxHeight;
				srcImage.width = getWidth/scalePercentage;
				srcImage.height = getHeight/scalePercentage;
			}
		}
	}


// Header search form stuff

	var headerInitSearchText = "Find a book...";
	var allPageCatalogueSearchText = "Find a book...";
	var inPageSubcategoriesSearchText = "Find a book...";
	
	function checkSearchField(formType,fieldMode) {
		if(formType == "header") {
			searchField = document.getElementById("headerSearchField");
			initText = headerInitSearchText;
		} else if(formType == "allPageCatalogue") {
			searchField = document.getElementById("allPageCatalogueSearchField");
			initText = allPageCatalogueSearchText;
		} else if(formType == "inPageSubcategories") {
			searchField = document.getElementById("inPageSubcategoriesSearchField");
			initText = inPageSubcategoriesSearchText;
		}
		if(fieldMode) {
			// enters field
			if(formType == "header") ajaxLiveSearch(true);
			searchField.className = "active";
			if(searchField.value == initText) searchField.value = "";
		} else {
			// exits field
			if(formType == "header") ajaxLiveSearch(false);
			searchField.className = "";
			if(isEmptyField(searchField)) searchField.value = initText;
		}
	}

	function validateHeaderSearch(formType) {
		if(formType == "header") {
			searchField = document.getElementById("headerSearchField");
			initText = headerInitSearchText;
		} else if(formType == "allPageCatalogue") {
			searchField = document.getElementById("allPageCatalogueSearchField");
			initText = allPageCatalogueSearchText;
		} else if(formType == "inPageSubcategories") {
			searchField = document.getElementById("inPageSubcategoriesSearchField");
			initText = inPageSubcategoriesSearchText;
		}
		if(isEmptyField(searchField) || searchField.value == initText) {
			alert("You have not entered anything to search for!");
			return false;
		} else return true;
	}
	
	function submitHeaderSearch() {
		if(validateHeaderSearch()) document.getElementById("headerSearchForm").submit();
	}
	function submitAllPageCatalogueSearch() {
		if(validateHeaderSearch()) document.getElementById("allPageCatalogueSearchForm").submit();
	}
	function submitInPageSubcategoriesSearch() {
		if(validateHeaderSearch()) document.getElementById("inPageSubcategoriesSearchForm").submit();
	}
	
	// AJAX SEARCH STUFF
	
	var ajaxSearchResults = null;
	var ajaxSearchResultsString;
	var ajaxSearchResultsContainer;
	var ajaxSearchField;
	var ajaxString = "";
	var ajaxLastString = "nothing";
	var ajaxResultsCount = 0;
	var ajaxResultsLimit = 20;
	var ajaxTimeout = null;
	var ajaxSelectIndex = -1;
	
	//var simplifyRegString = [^A-Za-z0-9\sàáâèéëïöôüùû]+;
	var simplifyRegex = new RegExp(/[^A-Za-z0-9\sàáâèéëïöôüùû]+/g);
	var complexFindChars = new Array("—","–","-","à","á","â","è","é","ë","ê","ï","ö","ô","ü","ù","û");
	var simpleFindChars = new Array(" "," "," ","a","a","a","e","e","e","e","i","o","o","u","u","u");
	
	function simplifyString(srcString) {
		newString = srcString.toLowerCase();
		// remove complex characters
		for(i=0;i<complexFindChars.length;i++) {
			while(newString.indexOf(complexFindChars[i]) > -1) {
				newString = newString.replace(complexFindChars[i], simpleFindChars[i]);
			}
		}
		// remove punctuation
		newString = newString.replace(simplifyRegex , "");
		// clear double spaces
		while(newString.indexOf("  ") > -1) {
			newString = newString.replace("  ", " ");
		}
		// return
		return newString;
	}
	
	function ajaxLiveSearch(getMode) {
		ajaxSearchField = document.getElementById("headerSearchField");
		ajaxSearchResultsContainer = document.getElementById("headerSearchAjaxResults");
		if(getMode) {
			// start
			clearTimeout(ajaxTimeout);
			ajaxSearchUpdate = setInterval("ajaxLiveUpdate()", 50);
		} else {
			// finish
			clearInterval(ajaxSearchUpdate);
			ajaxTimeout = setTimeout("ajaxClearResults();",200);
			ajaxSearchUpdate = null;
		}
	}
	
	function ajaxLiveUpdate() {
		if(isEmptyField(ajaxSearchField)) {
			ajaxClearResults();
		} else if(ajaxSearchField.value.toString().length < 2 || ajaxSearchField.value.toString() == headerInitSearchText) {
			ajaxClearResults();
		} else {
			getString = simplifyString(ajaxSearchField.value.toString());
			// fix 123 issue
			if(getString.indexOf("123") > -1) getString = getString.replace("123","1 2 3");
			if(getString != ajaxString) {
				if(ajaxString != "") ajaxLastString = ajaxString;
				ajaxString = getString;
				if(ajaxString.indexOf(ajaxLastString) > -1) {
					// filter current results array
					tempSearchResults = new Array();
					ajaxResultsCount = 0;
					for(i=0; i<ajaxSearchResults.length; i++) {
						if(ajaxProductSearchTitles[ajaxSearchResults[i]].indexOf(ajaxString) > -1 || ajaxProductSearchSeries[ajaxSearchResults[i]].indexOf(ajaxString) > -1 || ajaxProductSearchAuthors[ajaxSearchResults[i]].indexOf(ajaxString) > -1) {
							tempSearchResults[ajaxResultsCount] = ajaxSearchResults[i];
							ajaxResultsCount += 1;
						}
					}
					ajaxSearchResults = tempSearchResults;
				} else {
					// search all data
					ajaxSearchResults = new Array();
					ajaxResultsCount = 0;
					for(i=0; i<ajaxProductTitles.length; i++) {
						if(ajaxProductSearchTitles[i].indexOf(ajaxString) > -1 || ajaxProductSearchSeries[i].indexOf(ajaxString) > -1 || ajaxProductSearchAuthors[i].indexOf(ajaxString) > -1) {
							ajaxSearchResults[ajaxResultsCount] = i;
							ajaxResultsCount += 1;
						}
					}
				}
				ajaxShowResults();
			}
		}
	}
	
	function ajaxClearResults() {
		ajaxString = "";
		ajaxSearchResultsContainer.className = "inactive";
	}
	
	function ajaxClickOnResultLink() {
		clearTimeout(ajaxTimeout);
		ajaxTimeout = setTimeout("ajaxClearResults();",500);
	}
	
	function ajaxShowResults() {
		// write results
		if(ajaxResultsCount > 0) {
			ajaxSearchResultsString = "<p class='suggestions'><em>Some suggestions:</em></p>";
			ajaxSearchResultsString += "<p>";
			resultsLoopLimit = ajaxResultsCount;
			if(resultsLoopLimit > ajaxResultsLimit) resultsLoopLimit = ajaxResultsLimit;
			for (i=0; i< resultsLoopLimit; i++) {
				ajaxSearchResultsString += "<a href='/catalogue/catalogue.aspx?css=1&id=" + ajaxProductIDs[ajaxSearchResults[i]] + "' onmouseover='setAjaxSelectedIndex(" + i + ")'><span>" + ajaxProductTitles[ajaxSearchResults[i]] + "<\/span><\/a>";
			}
			ajaxSearchResultsString += "<\/p>";
			// more results
			ajaxSearchResultsString += "<p><a href='javascript:submitHeaderSearch();' onmouseover='setAjaxSelectedIndex(" + resultsLoopLimit + ")' onclick='setAjaxSelectedIndex(" + resultsLoopLimit + ")'><span>See the full list of search results&hellip;<\/span><\/a><\/p>";
			// write to page
			ajaxSearchResultsContainer.innerHTML = ajaxSearchResultsString;
			ajaxSearchResultsContainer.className = "";
			// key listener
			ajaxSelectIndex = -1;
			ajaxSearchField.onkeydown = function(e) {
				e = e || window.event;
				if (e.keyCode == 40) {
					// down cursor
					ajaxResultsSelect(true);
					return false;
				} else if (e.keyCode == 38) {
					// up cursor
					ajaxResultsSelect(false);
					return false;
				} else if (e.keyCode == 13) {
					// return key
					if(ajaxSelectIndex >= 0) {
						window.location = ajaxSearchResultsContainer.getElementsByTagName("A")[ajaxSelectIndex].href;
						return false;
					}
				}
			}
		} else {
			ajaxLastString = "nothing";
			// reset
			ajaxClearResults();
			// key listener
			ajaxSearchField.onkeydown = null;
		}
	}
	
	function ajaxResultsSelect(getMove) {
		ajaxLinks = ajaxSearchResultsContainer.getElementsByTagName("A");
		if(getMove) {
			// down
			if(ajaxSelectIndex < (ajaxLinks.length - 1)) {
				if(ajaxSelectIndex >= 0) ajaxLinks[ajaxSelectIndex].className = "";
				ajaxSelectIndex += 1;
				ajaxLinks[ajaxSelectIndex].className = "selectedLink";
			}
		} else {
			// up
			if(ajaxSelectIndex > 0) {
				if(ajaxSelectIndex >= 0) ajaxLinks[ajaxSelectIndex].className = "";
				ajaxSelectIndex -= 1;
				ajaxLinks[ajaxSelectIndex].className = "selectedLink";
			}
		}
	}
	
	function setAjaxSelectedIndex(getNewIndex) {
		ajaxLinks = ajaxSearchResultsContainer.getElementsByTagName("A");
		if(ajaxSelectIndex >= 0) ajaxLinks[ajaxSelectIndex].className = "";
		ajaxSelectIndex = getNewIndex;
		ajaxLinks[ajaxSelectIndex].className = "selectedLink";
	}


// Print function

	function printPage() {
		if(window.print) {
			window.print();
		} else {
			alert("Your browser does not support the javascript 'print' function.\nPlease use your operating system's print menu to print this page.")
		}
		return false;
	}

// Menu Stuff
	
	var dynamicMenu;
	var menuOffsetLeft;
	var menuOffsetTop;
	var MenuAreaWidth;
	var menuMinX;
	var menuMaxX;
	var storeMenuIndex = null;
	var storeButtonState = null;
	var storeThisElement = null;
	var menuActive = false;
	var menuTimeout = null;
	
	function getMenuClass(src,hoverState) {
		if(hoverState) return "menuOver"
		else {
			if(storeButtonState) return "menuOn"
			else return "menuOff";
		}
	}
	
	function setPos(getObject,getX,getY) {
		getX = Math.floor(getX);
		getY = Math.floor(getY);
		if(getObject.style.posTop) {
			getObject.style.posLeft = getX;
			getObject.style.posTop = getY;
		} else {
			getObject.style.left = getX + "px";
			getObject.style.top = getY + "px";
		}
	}
	
	function showMenu(menuIndex,buttonState,buttonOffset,thisElement) {
		if(menuSystemActive) {
			cancelHideMenu();
			// build dynamicMenu if it doesn't already exist
			if(!document.getElementById("dynamicMenu")) {
				var newdiv = document.createElement('div');
   				newdiv.setAttribute('id', 'dynamicMenu');
				document.body.appendChild(newdiv);
				dynamicMenu = document.getElementById("dynamicMenu");
				// also read some initial values
				MenuAreaWidth = parseFloat(document.getElementById('menuArea').offsetWidth);
			}
			if(menuActive && menuIndex!= storeMenuIndex) doHideMenu();
			if(!menuActive) {
				// get offsets
				MenuOffsetLeft = parseFloat(document.getElementById('centredPage').offsetLeft) + parseFloat(document.getElementById('pageArea').offsetLeft) + parseFloat(document.getElementById('menuArea').offsetLeft);
				MenuOffsetTop = parseFloat(document.getElementById('centredPage').offsetTop) + parseFloat(document.getElementById('pageArea').offsetTop) + parseFloat(document.getElementById('menuArea').offsetTop);
				menuMinX = MenuOffsetLeft + 5;
				menuMaxX = MenuOffsetLeft + MenuAreaWidth - 5;
				// create dropdown
				storeMenuIndex = menuIndex;
				storeButtonState = buttonState;
				storeThisElement = thisElement;
				thisElement.className = getMenuClass(thisElement,true);
				if(SubMenuStrings[menuIndex]) {
					// Set column width class for menu
					dynamicMenu.className = ("cols" + SubMenuCols[menuIndex]);
					SubMenuWidth = dynamicMenu.offsetWidth;
					// Work out menu position
					yPos = MenuOffsetTop + 30;
					xPos = buttonOffset + MenuOffsetLeft + 10;
					// check limits
					if(xPos < menuMinX) xPos = menuMinX;
					if((xPos + SubMenuWidth) > menuMaxX) xPos = (menuMaxX - SubMenuWidth) + 5;
					// build menu content
					buildMenu = "<div class='dynamicMenuElements'>";
					buildMenu += "<div class='topShadow'><div id='dynamicMenuArrow' class='dynamicMenuArrow'><\/div><\/div>";
					buildMenu += "<div class='midSection'>";
					buildMenu += "<div class='menuBody'>";
					buildMenu += SubMenuStrings[menuIndex];
					buildMenu += "<\/div>";
					buildMenu += "<\/div>";
					buildMenu += "<div class='bottomShadow'><\/div>";
					buildMenu += "<\/div>";
					dynamicMenu.innerHTML = buildMenu;
					// arrow position
					arrowX = MenuOffsetLeft + 5 + Math.floor(buttonOffset + (parseFloat(thisElement.offsetWidth)/2)) - xPos;
					setPos(document.getElementById('dynamicMenuArrow'),arrowX,0);
					// Set position of menu + make visible
					setPos(dynamicMenu,xPos,yPos);
					dynamicMenu.style.zIndex = 200;
					dynamicMenu.style.visibility = "visible";
					// rollover behaviour
					dynamicMenu.onmouseover = function() {
						showMenu(menuIndex,buttonState,buttonOffset,thisElement);
					}
					dynamicMenu.onmouseout = function() {
						hideMenu();
					}
					
				}
				menuActive = true;
			}
		}
	}
	
	function hideMenu() {
		if(menuSystemActive) {
			menuTimeout = setTimeout("doHideMenu();",200);
		}
	}
	
	function doHideMenu() {
		if(menuSystemActive && storeThisElement != null) {
			// hide menu
			storeThisElement.className = getMenuClass(storeThisElement,false);
			dynamicMenu.style.visibility = "hidden";
			storeMenuIndex = null;
			storeButtonState = null;
			storeThisElement = null;
			menuActive = false;
			// cancel behaviours
			dynamicMenu.onmouseover = null;
			dynamicMenu.onmouseout = null;
		}
	}
	
	function cancelHideMenu() {
		if(menuSystemActive) {
			clearTimeout(menuTimeout);
			menuTimeout = null;
		}
	}
	
	function menuAreaClick(menuIndex,buttonState,buttonOffset,thisElement) {
		if(menuSystemActive) {
			if(menuActive && storeMenuIndex == menuIndex) {
				// go to first url in submenu
				firstLink = dynamicMenu.getElementsByTagName("A")[0];
				firstLinkURL = firstLink.href.toString();
				firstLinkTarget = firstLink.target.toString();
				firstLinkTracking = firstLink.getAttribute("onclick").toString();
				// do tracking if required
				if (firstLinkTracking.indexOf("trackLink") > -1) {
					// get tracking code
					var regex = new RegExp(".*trackLink\\('([^']*)'.*");
					trackingCode = regex.exec(firstLinkTracking)[1];
					trackLink(trackingCode);
				}
				// page load
				if(firstLinkTarget == "_blank") {
					window.open(firstLinkURL);
				} else {
					window.location = firstLinkURL;
				}
				// close menu
				doHideMenu();
				return false;
			} else  {
				// show menu
				showMenu(menuIndex,buttonState,buttonOffset,thisElement);
				return false;
			}
		} else {
			return true;
		}
	}
	
	
// Function to track links with Google Analytics
	
	function trackLink(linkSrc) {
		try { pageTracker._trackPageview(linkSrc); } // New Google tracking code
		catch(e) {
			try { urchinTracker(linkSrc); } // Legacy Google tracking code
			catch(e) { }
		}
	}
	
// add a getElementByClass function for browsers that don't support getElementsByClassName
		
	// getElementsByClass(class string, optional DOM node, optional html tag)
	function getElementsByClass(searchClass,node,tag) {
		var classElements = new Array();
		if ( node == null )
			node = document;
		if ( tag == null )
			tag = '*';
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		for (i = 0, j = 0; i < elsLen; i++) {
			if ( pattern.test(els[i].className) ) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	}
	
// Area Expander/Collapser code

	var expanderArrow1off = new Image();
	expanderArrow1off.src = "\/images\/common\/expander\/expander-arrow-closed-off.gif";
	var expanderArrow1over = new Image();
	expanderArrow1over.src = "\/images\/common\/expander\/expander-arrow-closed-over.gif";
	var expanderArrow2 = new Image();
	expanderArrow2.src = "\/images\/common\/expander\/expander-arrow-stage1.gif";
	var expanderArrow3 = new Image();
	expanderArrow3.src = "\/images\/common\/expander\/expander-arrow-stage2.gif";
	var expanderArrow4off = new Image();
	expanderArrow4off.src = "\/images\/common\/expander\/expander-arrow-open-off.gif";
	var expanderArrow4over = new Image();
	expanderArrow4over.src = "\/images\/common\/expander\/expander-arrow-open-over.gif";
	
	var areaExpanders = new Array();
	var expanderActive = false;
	var expanderIcon;
	var expanderTargetHeight;
	var expanderCurrentHeight;
	var expanderIncrement;
	var expanderInterval;
	var socialNetworkIndex;
	var aboutUsborneIndex;
	
	function initExpanders() {
		if(document.getElementsByClassName) {
			findExpanders = document.getElementsByClassName("areaExpander");
		} else {
			findExpanders = getElementsByClass("areaExpander",document,"div");
		}
		for(x=0; x<findExpanders.length ;x++) {
			// create area expander objects in an array
			areaExpanders[x] = new areaExpander(findExpanders[x], x);
		}
		// check if we have been asked to open an exander and jump down to it...
		if (document.location.toString().indexOf("#") == -1) {
			var queryArray = new Array;
			var anchorLocation = "";
			queryArray = document.location.search.substring(1).split("&");
			if (queryArray.length > 0) {
				for (var i in queryArray) {
					// Look for tab names
					if (queryArray[i].toLowerCase().indexOf("opentab") >= 0) {
						var querySplit = new Array;
						querySplit = queryArray[i].split("=");
						if (querySplit.length > 0) { anchorLocation = "#" + querySplit[1]; break; }
					}
				}
				if (anchorLocation.length > 0) document.location = anchorLocation;
			}
		}
	}
	
	function areaExpander(getDiv, getIndex) {
		this.oDiv = getDiv;
		this.index = getIndex;
		// check initial expansion setting
		if(this.oDiv.className.indexOf("startOpen") > -1) {
			this.expanded = true;
		} else {
			this.expanded = false;
		}
		// check to see if this is the social networking area
		if(this.oDiv.className.indexOf("socialNetworkLinks") > -1) {
			this.socialNetworkLinks = true;
			socialNetworkIndex = this.index;
		} else {
			this.socialNetworkLinks = false;
		}
		// check to see if this is the homepage 'about Usborne' section
		if(this.oDiv.className.indexOf("homeAboutUsborne") > -1) {
			aboutUsborneIndex = this.index;
		}
		// look for existing initContent div
		if(document.getElementsByClassName) {
			if(this.oDiv.getElementsByClassName("initContent")[0]) {
				this.initContent = this.oDiv.getElementsByClassName("initContent")[0];
				this.useInitContent = true;
			} else {
				this.useInitContent = false;
			}
		} else {
			if(getElementsByClass("initContent",this.oDiv,"div")[0]) {
				this.initContent = getElementsByClass("initContent",this.oDiv,"div")[0];
				this.useInitContent = true;
			} else {
				this.useInitContent = false;
			}
		}
		// get first H2
		this.firstH2 = this.oDiv.getElementsByTagName("H2")[0];
		this.firstH2clean = this.firstH2.innerHTML;
		// set 'closed' height for expander
		if(this.useInitContent) {
			this.closedHeight = parseFloat(this.initContent.offsetHeight + 30); // add bottom margin
		} else {
			this.closedHeight = parseFloat(this.firstH2.offsetHeight + 30); // add top and bottom margins
		}
		// set 'open' height for expander
		this.openHeight = parseFloat(this.oDiv.offsetHeight);
		// resize closed areas
		if(!this.expanded) this.oDiv.style.height = this.closedHeight + "px";
		// add expander link to h2 for closed areas
		this.firstH2closedHTML = "<a href='javascript:toggleAreaExpander(" + this.index + ");' title='Click here to expand this area' onmouseover='hoverArrowIcon(" + this.index + ",true);' onmouseout='hoverArrowIcon(" + this.index + ",false);'>";
		this.firstH2closedHTML += this.firstH2.innerHTML + "<\/a>";
		if(!this.expanded) {
			this.firstH2.innerHTML = this.firstH2closedHTML;
			this.oDiv.style.overflow = "hidden";
		}
		// add expander arrow icon to area
		this.iconHTML = "<div id='expanderArrow_" + this.index + "' class='expanderArrow'>";
		this.iconHTML += "<a href='javascript:toggleAreaExpander(" + this.index + ");' onmouseover='hoverArrowIcon(" + this.index + ",true);' onmouseout='hoverArrowIcon(" + this.index + ",false);'>";
		this.iconHTML += "<img src='/images/common/expander/expander-arrow-closed-off.gif' width='18' height='18' border='0' alt='' title='' /><\/a><\/div>";
		this.oDiv.innerHTML += this.iconHTML
		this.arrowIcon = document.getElementById("expanderArrow_" + this.index);
		this.arrowIcon.className = "expanderArrow";
		this.arrowIconImg = this.arrowIcon.getElementsByTagName("IMG")[0];
		this.setArrowIcon();
	}
	
	areaExpander.prototype.setArrowIcon = function() {
		if(this.expanded) {
			this.arrowIconImg.src = expanderArrow4off.src;
			this.arrowIconImg.alt = "Click here to minimize this area";
			this.arrowIconImg.title = "Click here to minimize this area";
		} else {
			this.arrowIconImg.src = expanderArrow1off.src;
			this.arrowIconImg.alt = "Click here to expand this area";
			this.arrowIconImg.title = "Click here to expand this area";
		}
	}
	
	function hoverArrowIcon(getIndex,getMode) {
		thisExpander = areaExpanders[getIndex];
		if(!expanderActive) {
			if(getMode) {
				if(thisExpander.expanded) {
					thisExpander.arrowIconImg.src = expanderArrow4over.src;
				} else {
					thisExpander.arrowIconImg.src = expanderArrow1over.src;
				}
			} else {
				if(thisExpander.expanded) {
					thisExpander.arrowIconImg.src = expanderArrow4off.src;
				} else {
					thisExpander.arrowIconImg.src = expanderArrow1off.src;
				}
			}
		}
	}
	
	function animateArrowIcon(getIndex,getMode) {
		thisExpander = areaExpanders[getIndex];
		expanderIcon = thisExpander.arrowIconImg;
		if(getMode) {
			setTimeout("expanderIcon.src = expanderArrow2.src;", 50);
			setTimeout("expanderIcon.src = expanderArrow3.src;", 100);
			setTimeout("expanderIcon.src = expanderArrow4over.src;", 150);
		} else {
			setTimeout("expanderIcon.src = expanderArrow3.src;", 50);
			setTimeout("expanderIcon.src = expanderArrow2.src;", 100);
			setTimeout("expanderIcon.src = expanderArrow1over.src;", 150);
		}
	}
	
	function toggleAreaExpander(getIndex) {
		if(!expanderActive) {
			expanderActive = true;
			thisExpander = areaExpanders[getIndex];
			thisExpander.oDiv.style.overflow = "hidden";
			if(thisExpander.expanded) {
				// store an updated value for openHeight (in case of dynamic changes)
				thisExpander.openHeight = parseFloat(thisExpander.oDiv.offsetHeight);
				// is open
				expanderTargetHeight = thisExpander.closedHeight;
				expanderCurrentHeight = thisExpander.openHeight;
				animateArrowIcon(getIndex,false);
				expanderIncrement = (expanderCurrentHeight - expanderTargetHeight) / 10;
				expanderInterval = setInterval("resizeAreaExpander(" + getIndex + ", false);", 10);
				// settings for social networking content
				if(thisExpander.socialNetworkLinks == true) {
					document.getElementById("socialBookmarks").className = "";
					document.getElementById("socialBookmarksHelp").className = "";
					document.getElementById("socialHelpLink").style.display = "inline";
				}
				// check to see if there's an additional expand/collapse link, and change it's text
				if (document.getElementById("areaExpanderLink" + getIndex)) {
					var linkHref = unescape(document.getElementById("areaExpanderLink" + getIndex).getElementsByTagName("A")[0].href);
					var linkText = linkHref.match(/changeExpanderLink\(\s*\d+\s*,\s*'(.*)'\s*,\s*'(.*)'\s*\)/i);
					changeExpanderLink(getIndex, linkText[1], linkText[2]);
				}
			} else {
				// is closed
				expanderTargetHeight = thisExpander.openHeight;
				expanderCurrentHeight = thisExpander.closedHeight;
				animateArrowIcon(getIndex,true);
				expanderIncrement = (expanderTargetHeight - expanderCurrentHeight) / 10;
				expanderInterval = setInterval("resizeAreaExpander(" + getIndex + ", true);", 10);
				// settings for social networking content
				if(thisExpander.socialNetworkLinks == true) {
					document.getElementById("socialBookmarks").className = "show";
					document.getElementById("socialBookmarksHelp").className = "show";
					document.getElementById("socialHelpLink").style.display = "none";
				}
				// check to see if there's an additional expand/collapse link, and change it's text
				if (document.getElementById("areaExpanderLink" + getIndex)) {
					var linkHref = unescape(document.getElementById("areaExpanderLink" + getIndex).getElementsByTagName("A")[0].href);
					var linkText = linkHref.match(/changeExpanderLink\(\s*\d+\s*,\s*'(.*)'\s*,\s*'(.*)'\s*\)/i);
					changeExpanderLink(getIndex, linkText[1], linkText[2]);
				}
			}
		}
	}
	
	function resizeAreaExpander(getIndex, getMode) {
		if(expanderActive) {
			thisExpander = areaExpanders[getIndex];
			if(getMode) {
				// open the area
				if((expanderCurrentHeight + expanderIncrement) < expanderTargetHeight) {
					expanderCurrentHeight += expanderIncrement;
					thisExpander.oDiv.style.height = expanderCurrentHeight + "px";
				} else {
					expanderActive = false;
					thisExpander.expanded = true;
					clearInterval(expanderInterval);
					expanderInterval = null;
					// tidy up
					expanderCurrentHeight = expanderTargetHeight;
					thisExpander.oDiv.style.overflowY = "visible";
					thisExpander.oDiv.style.height = "auto";
					thisExpander.oDiv.getElementsByTagName("H2")[0].innerHTML = thisExpander.firstH2clean;
					thisExpander.setArrowIcon();
				}
			} else {
				// close the area
				if((expanderCurrentHeight - expanderIncrement) > expanderTargetHeight) {
					thisExpander.oDiv.style.overflowY = "hidden";
					expanderCurrentHeight -= expanderIncrement;
					thisExpander.oDiv.style.height = expanderCurrentHeight + "px";
				} else {
					expanderActive = false;
					thisExpander.expanded = false;
					clearInterval(expanderInterval);
					expanderInterval = null;
					// tidy up
					expanderCurrentHeight = expanderTargetHeight;
					thisExpander.oDiv.style.height = expanderCurrentHeight + "px";
					thisExpander.oDiv.getElementsByTagName("H2")[0].innerHTML = thisExpander.firstH2closedHTML;
					thisExpander.setArrowIcon();
				}
			}
		}
	}
	
	function changeExpanderLink(expanderID, moreLinkText, lessLinkText) {
		var toggleLink = document.getElementById("areaExpanderLink" + expanderID).getElementsByTagName("A");
		if(areaExpanders[expanderID].expanded) {
			toggleLink[0].innerHTML = moreLinkText;
		} else {
			toggleLink[0].innerHTML = lessLinkText;
		}
	}

// Form functions
	
	var ajaxFormActive = false;

	var busyIndicator = new Image();
	busyIndicator.src = "\/images\/common\/forms\/submit-busy-indicator.gif";
	
	function resetInlineValidation(checkField,tickIndex) {
		document.getElementById("tick" + tickIndex).className = "formTickEmpty";
	}
	
	function inlineValidation(checkField,tickIndex,checkMode) {
		// validate
		if(checkMode == "empty") {
			validation = true;
			if(isEmptyField(checkField) || detectBadChars(checkField.value)) validation = false;
		}
		if(checkMode == "email") {
			validation = true;
			if(isEmptyField(checkField) || !isValidEmail(checkField.value)) validation = false;
		}
		// indicator
		if(validation) {
			document.getElementById("tick" + tickIndex).className = "formTick";
		} else {
			document.getElementById("tick" + tickIndex).className = "formAlert";
		}
	}
	
	
// Cookie functions

	function createCookie(name, value, hours) {
		if (hours) {
			var date = new Date();
			date.setTime(date.getTime() + (hours * 60 * 60 * 1000));
			var expires = "; expires=" + date.toGMTString();
		}
		else var expires = "";
		document.cookie = name + "=" + value + expires + "; path=/";
	}
	
	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i = 0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0) == ' ') c = c.substring(1, c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
		}
		return null;
	}
	
	function eraseCookie(name) {
		createCookie(name, "", -1);
	}
	
	
// Homepage tabbed box functions

	var tabCycleInterval;
	var currHomeTab = 1;
	
	// Get cookie for current tab
	if (readCookie("homepageTab")) {
		currHomeTab = parseInt(readCookie("homepageTab"));
		currHomeTab = (currHomeTab > 1 ? currHomeTab - 1 : 3);
	}
	
	function changeToTab(tabNum) {
		// Are we really changing tabs?
		if (tabNum != currHomeTab) {
			// Check the passed tab number isn't over 3
			if (tabNum > 3) tabNum = 1;
			// Change tabs
			for (var i = 1; i < 4; i++) document.getElementById("tab" + i).className = "";
			document.getElementById("tab" + tabNum).className = "tabOn";
			// Change main image
			document.getElementById("homeTabBoxImageLink" + tabNum).className = "homeTabbedBoxImage";
			document.getElementById("homeTabBoxImageLink" + currHomeTab).className = "homeTabbedBoxImageHidden";
			currHomeTab = tabNum;
			// Set cookie
			createCookie("homepageTab", (currHomeTab < 3 ? currHomeTab + 1 : 1), 1)
		} else {
			// If we're clicking on an active tab, then go to that image link
			document.location = document.getElementById("homeTabBoxImageLink" + tabNum).href;
		}
		return false;
	}
	
	function startTabCycle() {
		tabCycleInterval = setInterval("changeToTab(currHomeTab + 1)", 6000);
	}
	
	function stopTabCycle() {
		clearInterval(tabCycleInterval);
	}
	
// Animated form area stuff

	var timerlen = 5;
	var slideAniLen = 350;
	var timerID = new Array();
	var startTime = new Array();
	var obj = new Array();
	var endHeight = new Array();
	var moving = new Array();
	var dir = new Array();
	var startColour = "";
	var endColour = "";
	
	function showHideFormElement(checkBox, divID, overrideValue) {
		if (graphicVersion) {
			if (((checkBox.checked && overrideValue === undefined) || overrideValue == 1) && document.getElementById(divID).style.display != "block") {
				if (!moving[divID]) slidedown(divID);
				else checkBox.checked = !checkBox.checked;
			} else if (((!checkBox.checked && overrideValue === undefined) || overrideValue == 0) && document.getElementById(divID).style.display == "block") {
				if (!moving[divID]) slideup(divID);
				else checkBox.checked = !checkBox.checked;
			}
		}
	}
	
	function slidedown(objname) {
		if(moving[objname]) return; // cannot slide down something that is still animating
		
		// Start slide
		document.getElementById(objname).getElementsByTagName("DIV")[0].style.backgroundColor = "#" + startColour;
		moving[objname] = true;
		dir[objname] = "down";
		startslide(objname);
	}
	 
	function slideup(objname) {
		if(moving[objname]) return; // cannot slide down something that is still animating
		
		// Start slide
		moving[objname] = true;
		dir[objname] = "up";
		startslide(objname);
	}
	
	function startslide(objname) {
		clearInterval(document.getElementById(objname).getElementsByTagName("DIV")[0].timer); // Kill any colour fading
		obj[objname] = document.getElementById(objname);
		
		endHeight[objname] = parseInt(obj[objname].style.height);
		startTime[objname] = (new Date()).getTime();
		
		if(dir[objname] == "down") obj[objname].style.height = "1px";
		
		obj[objname].style.display = "block";
		
		timerID[objname] = setInterval("slidetick('" + objname + "');", timerlen);
	}
	
	function slidetick(objname) {
		var elapsed = (new Date()).getTime() - startTime[objname];
		
		if (elapsed > slideAniLen) {
			endSlide(objname);
		} else {
			var timeratio = (elapsed / slideAniLen);
			timeratio = Math.pow(timeratio, 0.4);
			var d = Math.round(timeratio * endHeight[objname]);
			if(dir[objname] == "up") d = endHeight[objname] - d;				
			obj[objname].style.height = d + "px";
		}
		return;
	}
	
	function endSlide(objname) {
		clearInterval(timerID[objname]);
		
		if(dir[objname] == "up") obj[objname].style.display = "none";
		
		obj[objname].style.height = endHeight[objname] + "px";
		
		delete(moving[objname]);
		delete(timerID[objname]);
		delete(startTime[objname]);
		delete(endHeight[objname]);
		delete(obj[objname]);
		
		if(dir[objname] == "down") colorFade(objname,startColour,endColour,25,30);
		delete(dir[objname]);
		
		return;
	}
	
	function colorFade(id,start,end,steps,speed) {
		var startrgb,endrgb,er,eg,eb,step,rint,gint,bint,step;
		var target = document.getElementById(id).getElementsByTagName("DIV")[0];
		clearInterval(target.timer);
		endrgb = colorConv(end);
		er = endrgb[0];
		eg = endrgb[1];
		eb = endrgb[2];
		startrgb = colorConv(start);
		r = startrgb[0];
		g = startrgb[1];
		b = startrgb[2];
		target.r = r;
		target.g = g;
		target.b = b;
		rint = Math.round(Math.abs(target.r-er)/steps);
		gint = Math.round(Math.abs(target.g-eg)/steps);
		bint = Math.round(Math.abs(target.b-eb)/steps);
		if(rint == 0) rint = 1;
		if(gint == 0) gint = 1;
		if(bint == 0) bint = 1;
		target.step = 1;
		target.timer = setInterval( function() { animateColor(id,steps,er,eg,eb,rint,gint,bint) }, speed);
	}
	
	function animateColor(id,steps,er,eg,eb,rint,gint,bint) {
		var target = document.getElementById(id).getElementsByTagName("DIV")[0];
		var color;
		if(target.step <= steps) {
			var r = target.r;
			var g = target.g;
			var b = target.b;
			if(r >= er) r -= rint; else r += rint;
			if(g >= eg) r -= gint; else g += gint;
			if(b >= eb) b -= bint; else b += bint;
			color = 'rgb(' + r + ',' + g + ',' + b + ')';
			target.style.backgroundColor = color;
			target.r = r;
			target.g = g;
			target.b = b;
			target.step += 1;
		} else {
			clearInterval(target.timer);
			color = 'rgb(' + er + ',' + eg + ',' + eb + ')';
			target.style.backgroundColor = color;
		}
	}
	
	function colorConv(color) {
		var rgb = [parseInt(color.substring(0,2),16), parseInt(color.substring(2,4),16), parseInt(color.substring(4,6),16)];
		return rgb;
	}

// -->
