/*
http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
function getElementsByClassName(oElm, strTagName, oClassNames){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	if(typeof oClassNames == "object"){
		for(var i=0; i<oClassNames.length; i++){
			arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames[i].replace(/-/g, "\-") + "(\s|$)"));
		}
	}
	else{
		arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames.replace(/-/g, "\-") + "(\s|$)"));
	}
	var oElement;
	var bMatchesAll;
	for(var j=0; j<arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k=0; k<arrRegExpClassNames.length; k++){
			if(!arrRegExpClassNames[k].test(oElement.className)){
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}

/*
http://en.wikipedia.org/wiki/XMLHttpRequest
*/
function httpGetText(uri) {
	var request = (typeof(XMLHttpRequest) != "undefined") ? new XMLHttpRequest() : new ActiveXObject("Msxml2.XMLHTTP");
	request.open("GET", uri, false);
	request.send(null);
	
	if(!request.getResponseHeader("Date")) {
		var cached = request;
		request = (typeof(XMLHttpRequest) != "undefined") ? new XMLHttpRequest() : new ActiveXObject("Msxml2.XMLHTTP");
		var ifModifiedSince = cached.getResponseHeader("Last-Modified");
		ifModifiedSince = (ifModifiedSince) ? ifModifiedSince : new Date(0); // January 1, 1970
		request.open("GET", uri, false);
		request.setRequestHeader("If-Modified-Since", ifModifiedSince);
		request.send(null);
		if(request.status == 304) {
			request = cached;
		}
	}
	return request.responseText;
}

/*
http://codingforums.com/archive/index.php?t-85692.html
*/
function loadScript(src, callback) {
	var script = document.createElement("script");
	
	if(script.addEventListener)
		script.addEventListener("load", callback, false);
	else if(script.attachEvent)
		script.attachEvent("onreadystatechange",function() { loadScript.callbackIE(callback); });
	script.src = src;
	document.getElementsByTagName("head")[0].appendChild(script);
}

loadScript.callbackIE = function(callback) {
	var target = window.event.srcElement;
	if(target.readyState == "loaded")
		callback.call(target);
};

/*
function loadScript(src, callback) {
	var node = document.createElement("script");
	if (node.addEventListener)
		node.addEventListener("load", callback, false);
	else
		node.onreadystatechange = function() {
			if (this.readyState == "complete") callback.call(this);
		}
	node.src = src;
	document.getElementsByTagName("head").item(0).appendChild(node);
	node = null;
}
*/


/*
http://www.hunlock.com/blogs/Howto_Dynamically_Insert_Javascript_And_CSS
*/
function includeHead(headText) {
	headElement = document.getElementsByTagName("head")[0];
	
	links = headText.match(/\<link(.*)\/\>/g);
	if(links) {
		for(i = 0; i<links.length; i++) {
			link = links[i];
			type = link.match(/type\=\"([^"]+)\"/)[1];
			rel = link.match(/rel\=\"([^"]+)\"/)[1];
			href = link.match(/href\=\"([^"]+)\"/)[1];
			cssNode = document.createElement('link');
			cssNode.type = type;
			cssNode.rel = rel;
			cssNode.href = href;
			//cssNode.media = media;
			headElement.appendChild(cssNode);
		}
	}
	scripts = headText.match(/\<script(.*)\>\<\/script\>/g);
	if(scripts) {
		for(i = 0; i<scripts.length; i++) {
			script = scripts[i];
			type = script.match(/type\=\"([^"]+)\"/)[1];
			src = script.match(/src\=\"([^"]+)\"/)[1];
			/*
			scriptNode = document.createElement('script');
			scriptNode.type = type;
			scriptNode.src = src;
			scriptNode.onload = initializeScript;
			headElement.appendChild(scriptNode);
			*/
			loadScript(src, initializeScript);
		}
	}
}

function initializeScript() {
	scriptUrl = this.src;
	scriptBaseName = scriptUrl.substring(scriptUrl.lastIndexOf('/') + 1, scriptUrl.lastIndexOf('.'));
	//alert("Loaded: " + scriptUrl);
	//alert("base [" + scriptBaseName + "]");
	//init();
	eval("init_" + scriptBaseName + "()");
}

function includeForElement(element) {
	url = element.getAttribute("href");
	
	responseText = httpGetText(url);
		
	if(responseText) {
		/*
		responseText = responseText.replace(/\<\?xml.*\?\>/g, "");
		responseText = responseText.replace(/\<\!DOCTYPE.*\>/, "");
		responseText = responseText.replace(/\<html.*\>/, "");
		responseText = responseText.replace(/\<body.*\>/, "");
		responseText = responseText.replace(/\<\/body\>/, "");
		responseText = responseText.replace(/\<\/html\>/, "");
		*/
		
		/*
		http://www.regular-expressions.info/dot.html
		*/
		headText = responseText.match(/\<head\>([\s\S]*)\<\/head\>/)[1];
		includeHead(headText);
		
		//responseText = responseText.replace(/\<head\>[\s\S]*\<\/head\>/, "");
		divElement = document.createElement("div");
		divElement.innerHTML = responseText;
		includeElement = divElement.getElementsByTagName('div')[0];
		
		parentElement = element.parentNode;
		parentElement.insertBefore(includeElement,element);
		parentElement.removeChild(element);
	}
}

function processIncludes() {
	aIncludeElements = getElementsByClassName(document, "a", "include");
	for(var i = 0; i<aIncludeElements.length; i++) {
		element = aIncludeElements[i];
		includeForElement(element);
	}
}

/*
http://simonwillison.net/2004/May/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();
		}
	}
}

addLoadEvent(processIncludes);
