
function inArray(arr,str) {
	for (var key in arr) if (arr[key] == str) return key;
	return -1;
}
function removeDuplicates(arr) {
//  Removes duplicate values from arr
	var retval = new Array();
	for (var i=0; i<arr.length; i++) if (!inArray(retval,arr[i])) retval.push(arr[i]);
	return retval;
}

function addClass(classStr, theClass) {
//  Adds class to space-separated classStr
	var classArr = new Array();
	classArr = classStr.split(' ');
//  removeDuplicates because we only want each class mentioned once in a class string
	removeDuplicates(classArr);
	if (inArray(classArr, theClass)==-1) classArr.push(theClass);
	return classArr.join(' ');
}
function removeClass(classStr, theClass) {
//  Removes class from space-separated classStr

	var classArr = classStr.split(' ');
	var i = inArray(classArr, theClass);
	if (i>-1) classArr.splice(i,1);
	var classStr = classArr.join(' ');
	return classStr;

}

function switchStyles(newStyle) {

	if (!newStyle || !newStyle.length) { newStyle = this.value; }
	var links = document.getElementsByTagName('LINK');
	var link;
	
	for (var i=0; link = links[i]; i++) {
		if ((link.getAttribute('rel').indexOf('stylesheet') != -1) && (link.getAttribute('title'))) {
			link.disabled = true;
			if (link.getAttribute('title') == newStyle) {
				link.disabled = false;
			}
		}
	}

	createCookie('style', newStyle, 365);

}
function setupStyleSwitcher() {

	var styleSwitcher;
	if (!(styleSwitcher = document.getElementById('style_switcher'))) return;
	
	var defaultStyle;
	styleSwitcher.onchange = switchStyles;
	styleSwitcher.options.length = 0;
	var link;
	var links = document.getElementsByTagName('LINK');
	for (var i=0; link = links[i]; i++) {
		if ((link.getAttribute('rel').indexOf('stylesheet') != -1) && (link.getAttribute('title').length > 0)) {
			if (link.getAttribute('rel').indexOf('alternate') == -1) defaultStyle = link.getAttribute('title');
			styleSwitcher.options[styleSwitcher.options.length] = new Option(link.getAttribute('title'), link.getAttribute('title'));
		}
	}

	//  Remove 'hideme' from the className
	styleSwitcher.parentNode.parentNode.parentNode.className = removeClass(styleSwitcher.parentNode.parentNode.parentNode.className, 'hideme');

	var savedStyle = readCookie('style');
	savedStyle = (savedStyle == null || savedStyle == 'undefined') ? defaultStyle : savedStyle;
	var style;
	for (var i=0; style = styleSwitcher.options[i]; i++) {
		if (style.value == savedStyle) { style.selected = true; }
	}
	switchStyles(savedStyle);
}

function generateTableOfContents() {

	var tocHolder;
	
	//  only continue if a table of contents container is present
	if (!(tocHolder = document.getElementById('table_of_contents'))) return;

	while(tocHolder.firstChild) { tocHolder.removeChild(tocHolder.firstChild); }

/*	This makes sense to me:
		tocHolder.setAttribute('class', '');
	But it doesn't work with IE 6 so we have to use:
*/		tocHolder.className = '';

	var tocTitle = document.createElement('H4');
	tocTitle.innerHTML = 'Table of Contents';
	tocHolder.appendChild(tocTitle);
	var tmpHolder = document.createElement('UL');

	var aElements = document.getElementsByTagName('A');
	for (var i=0; i<aElements.length; i++) {

		if (aElements[i].getAttribute('name')) {

			var tmp = document.createElement('LI');
			var child = aElements[i].nextSibling;
			while (child.nodeType != 1) { child = child.nextSibling; }
			tmp.innerHTML = '<a href="#' + aElements[i].getAttribute('name') + '">' + child.innerHTML + '</a>';
			tmpHolder.appendChild(tmp);

		}

	}

	tocHolder.appendChild(tmpHolder);
	tocHolder.style.display = 'block';

}
function makeTablesStripey() {
	var evenRows = 1;
	var tables = document.getElementsByTagName('TABLE');
	
	for (var currentTable = 0; currentTable < tables.length; currentTable++) {
		if (tables[currentTable].className.indexOf('stripeMe') != -1) {
			var tBodies = tables[currentTable].getElementsByTagName('TBODY');
			for (var currentBody = 0; currentBody < tBodies.length; currentBody++) {
				var rows = tBodies[currentBody].getElementsByTagName('TR');
				for (var currentRow = evenRows; currentRow < rows.length; currentRow+=2) {
					rows[currentRow].className = 'evenRow';
				}
			}
		}
	}
}
function openWindow(url, width, height) {

	if ((width != undefined) && (height != undefined)) {

		//	If both width and height are defined then we can set resizable=no and scrollbars=no
		attrs = 'resizable=no,scrollbars=no,width='+width+',height='+height+',';

	} else {

		attrs = 'resizable=yes,scrollbars=yes,';

	}

	attrs = attrs + 'toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no,';

	window.open(url,'popup',attrs);

}

function setExternalLinks() {

	//  Get array of all <a> elements on the page
	var el_list = document.getElementsByTagName('A');
	var el, i;
	//  If <a> element has rel="external" then set target="_blank"
	for (i=0; el = el_list[i]; i++) {
		if (el.getAttribute('rel') && el.getAttribute('rel').indexOf('external') != -1) {
			el.setAttribute('target', '_blank');
		}
	}
}

function showHideMenu() {
	var target = this.nextSibling;
	while (target.nodeType != 1) target = target.nextSibling;
	if (target.style.display == '') {
		target.style.display = 'none';
		this.className = removeClass(this.className, 'selected');
	} else {
		target.style.display = '';
		this.className = addClass(this.className, 'selected');
	}
}
function setNavigationHandlers() {

	var el;
	
	//  Only continue if an element was found
	if (!(el = document.getElementById('main-nav-content'))) return;
	
	var mode = el.getAttribute('rel');

	for (var i=0; i<el.childNodes.length; i++) {
		if (el.childNodes[i].nodeType == 1) {
			for (var j=0; j<el.childNodes[i].childNodes.length; j++) {
				if (el.childNodes[i].childNodes[j].tagName == 'SPAN') {
					el.childNodes[i].childNodes[j].onclick = showHideMenu;
					if (el.childNodes[i].childNodes[j].className.indexOf('selected') == -1) {
						var t = el.childNodes[i].childNodes[j].nextSibling;
						while (t.nodeType != 1) t = t.nextSibling;
						if (t.style.display == '') t.style.display = 'none';
					}
				}
			}
		}
	}
}

/***************************************************************************************************/
/* FUNKY FUNCTIONS FOR AJAX */

function sendRequest(url,callback,postData) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		req.onreadystatechange = function () {
			if (req.readyState != 4) return;
			if (req.status != 200 && req.status != 304) {
				return;
			}
			callback(req);
		}
	if (req.readyState == 4) return;
	req.send(postData);
}

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

function loadPage(req) {
	var writeroot = document.getElementById('page-content');
	writeroot.innerHTML = req.responseText;
	hijackLinks();
}


function hijackLinks() {

	var elements = document.getElementsByTagName('A');
	for (var i=0; i<elements.length; i++) {

		if (elements[i].getAttribute('rel') == 'internal') {

			elements[i].onclick = function() { sendRequest(this.getAttribute('href')+'&getContent=true', loadPage); return false; };

		}

	}

}


/** FUNKY FUNCTIONS FOR COOKIES */

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*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);
}

/***************************************************************************************************/


/*
	This function was stolen from:
	http://simon.incutio.com/archive/2004/05/26/addLoadEvent
*/
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}





/*
	We want these functions to run once the page has finished loading
*/

addLoadEvent( setExternalLinks );
addLoadEvent( generateTableOfContents );
addLoadEvent( makeTablesStripey );
addLoadEvent( setupStyleSwitcher );
addLoadEvent( setNavigationHandlers );