window.CustomLayoutProcessing = new function() {

	var navigation;
	
	this.preLayoutProcessing = function()
	{
		var forms = document.getElementsByTagName("form");
		var form = forms[0];
		if (form) {
			navigation = document.getElementById("navigation");
			if (navigation) {
				/*
				* Clone navigation as sitetools
				*/
				var el = navigation;
				var idx = 0;
				while (el && (idx < 2)) {
					el = getNextChild(el, ["ul", "li"]);
					if (el.tagName.toLowerCase() == "ul") {
						++idx;
					}
				}
				if (idx == 2) {
					var sitetools = document.createElement("div");
					sitetools.id = "sitetools";
					sitetools.appendChild(el.cloneNode(true));
					var extra = findFirstElementOfClass(sitetools, "a", "extra");
					if (extra) {
						extra.parentNode.className += " extra";
					}
					form.appendChild(sitetools);
				}
			}
			/*
			var titling = document.getElementById("titling");
			if (titling) {
				var classbag = new ElementClassBag(titling, ["Header", "Logo"]);
				var globalnav = document.getElementById("globalnav");
				titling.appendChild(classbag.Elements["Logo"]);		
				titling.appendChild(globalnav);
				titling.appendChild(classbag.Elements["Header"]);
			}
			*/
		}
	}

	this.postLayoutProcessing = function()
	{
		var el;
		if (navigation) {
			/*
			* Set class = "Home" for li that contains home link
			*/
			el = navigation;
			while (el && (el.tagName.toLowerCase() != "li")) {
				el = getNextChild(el);
			}
			if (el) {
				el.className += " Home";
				
			}
		}
	}
	
	function getNextChild(node, validTypes) {
		var el = node.firstChild;
		while (el) {
			if ((el.nodeType == 1) && isValidType(el, validTypes)) {
				return(el);
			} 
			else {
				el = el.nextSibling;
			}
		}
		return(null);
	}
	
	function isValidType(el, validTypes) {
		if (!validTypes || validTypes.length == 0) {
			return true;
		}
		var tag = el.tagName.toLowerCase();
		for (var i = 0; i < validTypes.length; i++) {
			if (tag == validTypes[i]) {
				return true;
			}
		}
		return false;
	}
	
	function findFirstElementOfClass(start, element, classname)
	{
		var foundElement = null;
		foreach(start.getElementsByTagName(element), function(el) {
			if (el.className.indexOf(classname) >= 0)
			{
				foundElement = el;
				return true;
			}
		});
		return foundElement;
	}
	
	function ElementClassBag(node, classes)
	{
		var Classes = classes;
		this.Elements = [];
		
		this.contains = function()
		{
			for(var i = 0; i < Classes.length; i++)
			{
				if (!this.Elements[Classes[i]])
				{
					return false;
				}
			}
			return true;
		}
		
		for(var i = 0; i < Classes.length; i++)
		{
			var className = Classes[i];
			var element = traverse(node, className, 0);
			if (element)
			{
				this.Elements[className] = element;
			}
		}
		
		function traverse(node, className, level) {
			var el = null;
			++level;
			foreach(node, function(child) {
				//document.write(level + ":" + child + ", " + child.className + "<br>");
				if (hasClass(child, className)) {
					el = child;
					return true;
				}
				else {
					el = traverse(child, className, level);
					if (el) return true;
				}
			})
			return el;
		}
	}
	
	function hasClass(node, className)
	{
		var rv = false;
		var classNames = node.className.split(" ");
		if (classNames && classNames.length > 0)
		{
			for (var y=0; (y < classNames.length) && (rv == false); ++y)
			{
				if (classNames[y] == className)
				{
					rv = true;
				}
			}
		}
		return rv;	
	}
}


