/* QUIRKSMODE JAVASCRIPT -- Courtesy of quirksmode.org */



var blogs = ['/blog/','/bugreports/','/elsewhere/'];

var archivedText = 'You\'re looking at outdated content that is no longer maintained. Use with care.';



var advancedJavaScriptSupport = document.createElement && document.getElementsByTagName && createXMLHTTPObject();



if (advancedJavaScriptSupport)

	document.write('<style>body {padding-top: 0px;}</style>'); 	// make room for headers



window.onunload = function () {



	// execute unload routine of page, if present



	if (self.exit)

		exit();

	

	// execute unload routine for blog pages, if present



	if (self.exitBlogs)

		exitBlogs();

}



window.onload = function () {

	

	

	/* Initialise example scripts on content pages in all browsers */

	

	if (self.init)

		init();



	/* See if browser supports advanced interface */



	if (!advancedJavaScriptSupport) return;

	

	

	/* Miscellaneous */

	

	setScreenShots();

	setCompTables();

	sizePres();

	redirectExternalLinks();

	window.onresize = sizePres;

	if (Preferences.siteNavPos && Preferences.siteNavPos != 'fixed') {

		document.getElementById('header').style.position = Preferences.siteNavPos;

	}

	else {

		setMenuOffset.initialPos = getStyle('header','top');

		window.onscroll = document.documentElement.onscroll = setMenuOffset;

		setMenuOffset();

		/* in Moz 1.7.12/FF 1.5 window.onscroll is wiped when you use the mouse wheel while 

		the pointer is NOT above a true page element (ie. when it is above the naked documentElement)

		 ... or something ...

		Of course Safari doesn't accept document.documentElement.onscroll; Op and IE 7 do */

	}



	/* Initialise blog and bilingual scripts, if they're there */



	if (self.initBlogs)

		initBlogs();

	

	if (self.initBilingual)

		initBilingual();

}



/* Zebra lists */



function zebraLists() {

	var lists = getElementsByTagNames('ol,ul');

	for (var i=0;i<lists.length;i++) {

		var items = lists[i].childNodes;

		var counter = 1;

		for (var j=0;j<items.length;j++) {

			if (items[j].nodeName == 'LI' && !items[j].getElementsByTagName('li').length) {

				counter++;

				if (counter % 2 == 1)

					items[j].className = 'odd';

				else

					items[j].className = '';

			}

		}

	}

}	





function setScreenShots() {

	var imgs = document.getElementsByTagName('img');

	var ssSpan = document.createElement('span');

	ssSpan.className = 'ssSpan';

	for (var i=0;i<imgs.length;i++) {

		if (imgs[i].className != 'screenshot') continue;

		var currentSsSpan = ssSpan.cloneNode(true);

		if (imgs[i].alt)

			currentSsSpan.appendChild(document.createTextNode('Screenshot: ' + imgs[i].alt));

		else

			currentSsSpan.appendChild(document.createTextNode('Screenshot without alt text'));

		imgs[i].parentNode.insertBefore(currentSsSpan,imgs[i]);

	}

}



function setCompTables() {

	var reference = document.createElement('p');

	reference.innerHTML = 'See also the <a href="/key.html">key</a> to my compatibility tables.';

	var tables = document.getElementsByTagName('table');

	for (var i=0;i<tables.length;i++) {

		if (tables[i].className.indexOf('compatibility') == -1) continue;

		var topics = tables[i].getElementsByTagName('div');



		var selectBox = document.createElement('select');

		selectBox.className = 'contents';

		selectBox.options[0] = new Option('Contents of this table','');

		selectBox.onchange = function () {

			if (this.value)

				location.hash = this.value;

		}

		

		for (var j=0;j<topics.length;j++) {

			if (topics[j].className != 'name') continue;

			



			var unique = 't'+i+j;

			var linkText = topics[j].innerText || topics[j].textContent;

			selectBox.options[selectBox.options.length] = new Option(linkText,unique);

			topics[j].parentNode.id = unique;

			



/*			var link = document.createElement('a');

			var unique = 't'+i+j;

			link.href = '#' + unique;

			topics[j].parentNode.id = unique;

			var linkText = topics[j].innerText || topics[j].textContent;

			link.innerHTML = linkText;

			link.className = 'page';

			contents.appendChild(link);

			contents.appendChild(document.createTextNode(' '));

*/



		}

//		contents.appendChild(selectBox);

		tables[i].parentNode.insertBefore(reference.cloneNode(true),tables[i]);

		tables[i].parentNode.insertBefore(selectBox,tables[i]);

	}

}



function sizePres() {



	/* Stretch pres to right edge of browser window */

	var pres = document.getElementsByTagName('pre');

	if (!pres.length) return;

	var testPre;

	for (var i=0;i<pres.length;i++) {

		if (pres[i].parentNode.nodeName == 'BODY') {

			testPre = pres[i];

			break;

		}

	}

	if (!testPre) return;

	testPre.style.marginRight = 'auto';

	var docWidth = document.documentElement.clientWidth;

	var preWidth = testPre.offsetWidth;

	var rightMargin = docWidth - preWidth;

	if (rightMargin < 0)

		rightMargin = 0;

	for (var i=0;i<pres.length;i++) {

		if (pres[i].parentNode.nodeName == 'BODY') {

			pres[i].style.marginRight = '-' + rightMargin + 'px';	

		}

	}

}



function setMenuOffset() { 

	var header = document.getElementById('header');

	if (!header) return;

	var currentOffset = document.documentElement.scrollTop || document.body.scrollTop; // body for Safari

	var startPos = parseInt(setMenuOffset.initialPos) || 190;

	var desiredOffset = startPos - currentOffset;

	if (desiredOffset < 10)

		desiredOffset = 10;

	if (desiredOffset != parseInt(header.style.top)) 

		header.style.top = desiredOffset + 'px';



	var currentLeftOffset = document.documentElement.scrollLeft || document.body.scrollLeft; // body for Safari

	if (currentLeftOffset != - parseInt(header.style.left))

		header.style.left = '-' + currentLeftOffset + 'px';

}



function redirectExternalLinks() {

	if (!Preferences.external || Preferences.external != 'redirect') return;

	var links = document.getElementsByTagName('a');

	for (var i=0;i<links.length;i++) {

		if (links[i].className.indexOf('external') == -1) continue;

		links[i].target = 'ppk';

	}

}



/* PREPARING THE HEADER */



function setHeader(req) {

	var header = document.createElement('div');

	header.className = 'pageHeader';

	document.body.insertBefore(header,document.body.firstChild);

	header.innerHTML = req.responseText;

	document.getElementById('lastMod').innerHTML = lastMod();

	var lastModContainer = document.getElementById('lastModPar')

//	lastModContainer.style.marginLeft = 243 - lastModContainer.clientWidth + 'px';

	document.body.insertBefore(lastModContainer,document.body.firstChild);

	var searchBox = document.getElementById('searchTop');

	if (!searchBox) return;

	searchBox.onfocus = function () {

		if (this.value == this.defaultValue) this.value = '';	

	}

	searchBox.onblur = function () {

		if (!this.value) this.value = this.defaultValue;	

	}

	searchBox.form.onsubmit = function () {

		searchBox.value = 'site:www.quirksmode.org ' + searchBox.value;

	}

}



/* IMPORT TOC AND MAIN NAVIGATION */

 

function setNavigation(req) {

	var importHeader = document.getElementById('header');

	if (!importHeader) return;

	importHeader.innerHTML = req.responseText;

	var ToC = createTOC();

	if (ToC)

		document.getElementById('TOC').appendChild(ToC);

	if (location.hash)

		location.hash = location.hash;

	document.getElementById('menuLink').onclick = getMainNav;

	if (Preferences.showSiteNav && Preferences.showSiteNav == 'yes') {

		document.getElementById('menuLink').onclick();

	}

}



/* CREATE TOC */



function createTOC() {

	var y = document.createElement('div');

	y.id = 'innertoc';

	var a = y.appendChild(document.createElement('span'));

	a.onclick = showhideTOC;

	a.id = 'contentheader';

	a.innerHTML = 'show page contents';

	var z = y.appendChild(document.createElement('div'));

	z.onclick = showhideTOC;

	var toBeTOCced = getElementsByTagNames('h2,h3,h4,h5');

	if (toBeTOCced.length < 2) return false;

	

	for (var i=0;i<toBeTOCced.length;i++) {

		var textSrc = toBeTOCced[i];

		var firstNode = textSrc.firstChild;

		if (firstNode.nodeName == 'A')

			textSrc = firstNode;

		var tmp = document.createElement('a');

		tmp.innerHTML = textSrc.innerHTML;

		tmp.className = 'page';

		z.appendChild(tmp);

		if (toBeTOCced[i].nodeName == 'H4')

			tmp.className += ' indent';

		if (toBeTOCced[i].nodeName == 'H5')

			tmp.className += ' extraindent';

		var headerId = toBeTOCced[i].id || 'link' + i;		

		tmp.href = '#' + headerId;		

		toBeTOCced[i].id = headerId;

		if (toBeTOCced[i].nodeName == 'H2') {

			tmp.innerHTML = 'Top';

			tmp.href = '#top';

			toBeTOCced[i].id = 'top';

		}

	}

	return y;

}



var TOCstate = 'none';



function showhideTOC() {

	TOCstate = (TOCstate == 'none') ? 'block' : 'none';

	document.getElementById('contentheader').innerHTML = (TOCstate == 'none') ? 'show page contents' : 'hide page contents';

	document.getElementById('innertoc').lastChild.style.display = TOCstate;

}



/* MAIN NAVIGATION */



function getMainNav() {

	document.getElementById('waitMessageNav').style.display = 'block';

	sendRequest('/sitemap.html',setMainNav);

	this.innerHTML = 'hide site navigation';

	this.className = 'opened';

	this.onclick = removeMainNav;

	return false;

}



function setMainNav(req) {	

	var container = document.createElement('div');

	container.innerHTML = req.responseText;

	var x = container.getElementsByTagName('div');

	var siteMap;

	for (var i=0;i<x.length;i++) {

		if (x[i].id == 'mainMenu') {

			siteMap = x[i];

			break;

		}		

	}

	if (!siteMap) return;

	var archiveLink = document.createElement('a');

	archiveLink.href = '/sitemap.html#archive';

	archiveLink.appendChild(document.createTextNode('Archives'));

	siteMap.appendChild(archiveLink);



	var pageName = location.href,pageHash;

	if (pageHash = pageName.lastIndexOf('#') +1)

		pageName = pageName.substring(0,pageHash-1);



	var links = siteMap.getElementsByTagName('a');

	for (var i=0;i<links.length;i++) {

		var linkText = links[i].nextSibling;

		if (!linkText) continue;

		if (linkText.nodeType == 3) {

			links[i].title = linkText.nodeValue.substring(2);

			linkText.parentNode.removeChild(linkText);

		}

		if (links[i].href == pageName)

			highlightLink(links[i])

	}

	

	document.getElementById('siteNav').appendChild(siteMap);

	document.getElementById('siteNav').onclick = openCloseNav;

	container.innerHTML = '';



	var currentLink = document.getElementById('youarehere');

	if (currentLink) {	

		while(currentLink != siteMap) {

			if (currentLink.nodeName == 'DIV') {

				currentLink.style.display = 'block';

				var relatedHeader = currentLink.previousSibling;

				while (relatedHeader.nodeType != 1)

					relatedHeader = relatedHeader.previousSibling;

				if (relatedHeader.nodeName.indexOf('H') == 0) {

					relatedHeader.className = 'opened';

					relatedHeader.relatedItem = currentLink;

					openCloseNav['previous' + relatedHeader.nodeName] = relatedHeader;

				}

			}

			currentLink = currentLink.parentNode;

		}

	}

/*	else {

		var archivedPage = true;

		for (var i=0;i<blogs.length;i++) {

			if (location.href.indexOf(blogs[i]) != -1) {

				archivedPage = false;

				break;

			}

		}

		if (archivedPage) {

			highlightLink(archiveLink)

			var x = document.createElement('p');

			x.className = 'archived';

			x.appendChild(document.createTextNode(archivedText));

			siteMap.appendChild(x);

		}

	} */

	document.getElementById('waitMessageNav').style.display = 'none';

}



function highlightLink(link) {

	link.id = 'youarehere';

	link.title = 'You are here';

	var originalText = link.firstChild.nodeValue;

	link.onclick = function () {

		this.firstChild.nodeValue = 'You are here';

		setTimeout(function () {

			link.firstChild.nodeValue = originalText;

		},1000);

		return false;

	};

}



function openCloseNav(e) {

	var evt = e || window.event;

	var evtTarget = evt.target || evt.srcElement;

	while (evtTarget.nodeType != 1)

		evtTarget = evtTarget.parentNode;

	if (evtTarget.nodeName.indexOf('H') != 0) return;



	if (!evtTarget.relatedItem) {

		var elementToBeOpened = evtTarget.nextSibling;

		while (elementToBeOpened.nodeType != 1)

			elementToBeOpened = elementToBeOpened.nextSibling;

		evtTarget.relatedItem = elementToBeOpened;

	}



	var newState = (evtTarget.relatedItem.style.display == 'block') ? 'none' : 'block';

	evtTarget.relatedItem.style.display = newState;

	evtTarget.className = (newState == 'none') ? '' : 'opened';

	

	if (Preferences.siteNavFold == 'one' && openCloseNav['previous' + evtTarget.nodeName]) {

		openCloseNav['previous' + evtTarget.nodeName].relatedItem.style.display = 'none';

		openCloseNav['previous' + evtTarget.nodeName].className = '';

		openCloseNav['previous' + evtTarget.nodeName] = null;

	}



	if (newState == 'block') {

		openCloseNav['previous' + evtTarget.nodeName] = evtTarget;

	}

	else {

		openCloseNav['previous' + evtTarget.nodeName] = undefined;

	}

}



var navStorage;



function removeMainNav() {

	var navElement = document.getElementById('siteNav');

	var nav = document.getElementById('mainMenu');

	if (nav) {

		navStorage = nav.parentNode.removeChild(nav);

		this.onclick = restoreMainNav;

	}

	else

		this.onclick = getMainNav;	

	this.innerHTML = 'show site navigation';

	this.className = '';

	return false;

}



function restoreMainNav() {

	document.getElementById('siteNav').appendChild(navStorage);

	this.innerHTML = 'hide site navigation';

	this.className = 'opened';

	this.onclick = removeMainNav;

	return false;

}



/* FOOTER */



function setFooter(req) {

	var footer = document.getElementById('footer');

	var valid = document.getElementById('validation');

	var validNotice;

	if (valid)

		validNotice = valid.parentNode.removeChild(valid);

	footer.innerHTML = req.responseText;

	if (validNotice) footer.appendChild(validNotice);

}



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

/*                                     */

/*             UTILITIES               */

/*                                     */

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





/* GETELEMENTSBYTAGNAMES */



function getElementsByTagNames(list,obj) {

	if (!obj) var obj = document;

	var tagNames = list.split(',');

	var resultArray = new Array();

	for (var i=0;i<tagNames.length;i++) {

		var tags = obj.getElementsByTagName(tagNames[i]);

		for (var j=0;j<tags.length;j++) {

			resultArray.push(tags[j]);

		}

	}

	var testNode = resultArray[0];

	if (!testNode) return [];

	if (testNode.sourceIndex) {

		resultArray.sort(function (a,b) {

				return a.sourceIndex - b.sourceIndex;

		});

	}

	else if (testNode.compareDocumentPosition) {

		resultArray.sort(function (a,b) {

				return 3 - (a.compareDocumentPosition(b) & 6);

		});

	}

	return resultArray;

}



/* LAST MODIFIED */



function lastMod(date) {

	var x = date || new Date (document.lastModified);

	Modif = new Date(x.toGMTString());

	Year = takeYear(Modif);

	Month = Modif.getMonth();

	Day = Modif.getDate();

	Mod = (Date.UTC(Year,Month,Day,0,0,0))/86400000;

	x = new Date();

	today = new Date(x.toGMTString());

	Year2 = takeYear(today);

	Month2 = today.getMonth();

	Day2 = today.getDate();

	now = (Date.UTC(Year2,Month2,Day2,0,0,0))/86400000;

	daysago = now - Mod;

	if (daysago < 0) return '';

	unit = 'days';

	if (daysago > 730) {

		daysago = Math.floor(daysago/365);

		unit = 'years';

	}

	else if (daysago > 60) {

		daysago = Math.floor(daysago/30);

		unit = 'months';

	}

	else if (daysago > 14) {

		daysago = Math.floor(daysago/7);

		unit = 'weeks'

	}

	var towrite = '';

	if (daysago == 0) towrite += 'today';

	else if (daysago == 1) towrite += 'yesterday';

	else towrite += daysago + ' ' + unit + ' ago';

	return towrite;

}





function takeYear(theDate) {

	var x = theDate.getYear();

	var y = x % 100;

	y += (y < 38) ? 2000 : 1900;

	return y;

}



/* XMLHTTP */



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) {

//			alert('HTTP error ' + req.status);

			return;

		}

		callback(req);

	}

	if (req.readyState == 4) return;

	req.send(postData);

}



function XMLHttpFactories() {

	return [

		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;

	var factories = XMLHttpFactories();

	for (var i=0;i<factories.length;i++) {

		try {

			xmlhttp = factories[i]();

		}

		catch (e) {

			continue;

		}

		break;

	}

	return xmlhttp;

}



/* COOKIES */



var Cookies = {

	init: function () {

		var allCookies = document.cookie.split('; ');

		for (var i=0;i<allCookies.length;i++) {

			var cookiePair = allCookies[i].split('=');

			this[cookiePair[0]] = cookiePair[1];

		}

	},

	create: function (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=/";

		this[name] = value;

	},

	erase: function (name) {

		this.create(name,'',-1);

		this[name] = undefined;

	}

};

Cookies.init();



/* INITIALISE PREFERENCES (needs cookies) */



var Preferences = {

	init: function () {

		if (!Cookies.sitePrefs) return;

		sitePrefs = Cookies.sitePrefs.split(',,');

		for (var i=0;i<sitePrefs.length;i++) {

			var oneSitePref = sitePrefs[i].split(':');

			this[oneSitePref[0]] = oneSitePref[1];

		}	

	}

};

Preferences.init();



/* PUSH AND SHIFT FOR IE5 */



function Array_push() {

	var A_p = 0

	for (A_p = 0; A_p < arguments.length; A_p++) {

		this[this.length] = arguments[A_p]

	}

	return this.length

}



if (typeof Array.prototype.push == "undefined") {

	Array.prototype.push = Array_push

}



function Array_shift() {

	var A_s = 0

	var response = this[0]

	for (A_s = 0; A_s < this.length-1; A_s++) {

		this[A_s] = this[A_s + 1]

	}

	this.length--

	return response

}



if (typeof Array.prototype.shift == "undefined") {

	Array.prototype.shift = Array_shift

}



/* GET STYLES */



function getStyle(el,styleProp) {

	var x = document.getElementById(el);

	if (x.currentStyle)

		var y = x.currentStyle[styleProp];

	else if (window.getComputedStyle)

		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);

	return y;

}



/* ULTRA-SIMPLE EVENT ADDING */



function addEventSimple(obj,evt,fn) {

	if (obj.addEventListener)

		obj.addEventListener(evt,fn,false);

	else if (obj.attachEvent)

		obj.attachEvent('on'+evt,fn);

}



function removeEventSimple(obj,evt,fn) {

	if (obj.removeEventListener)

		obj.removeEventListener(evt,fn,false);

	else if (obj.detachEvent)

		obj.detachEvent('on'+evt,fn);

}



