tilt.attachEvent(document, "contentreceived", LayoutEngine);

function LayoutEngine(isInvalidStructure)
{
	var body = document.body;
	var bodyClassName = body.className;

	if (!document.getElementsByTagName || !Array.prototype.push || !document.createAttribute)
	{
		body.className = "Unsupported";
		return;
	}
	
	if (bodyClassName != "Home")
	{
		window.location = "http://www.uab.edu/"
	}
	
	body.style.margin = "0";
	body.style.padding = "0";
	
	createLayout(isInvalidStructure);
	
	function createLayout(fixLayout)
	{
		var delimiter = "," + String.fromCharCode(160) + " ";
		var form = document.getElementById("form");
		
		var formItems = fixLayout ? findLayoutItems() : tilt.createClassNameBag(form);
		switch(body.className)
		{
			case "Home":
				var leftTopics = [];
				var rightTopics = [];
				var topicsNode = formItems.Topics;
				if (topicsNode)
				{
					var topics = topicsNode.getElementsByTagName("dl");
					for (var i = 0; i < topics.length; i++)
					{
						var topic = topics[i];
						var topicItems = topic.getElementsByTagName("li");
						for(var j = 0; j < topicItems.length - 1; j++)
						{
							topicItems[j].appendChild(document.createTextNode(delimiter));
						}
						(i < 4 ? leftTopics : rightTopics).push(topic);
					}
					var president = document.getElementById("president");
					if (president)
					{
						rightTopics.push(president);
					}
				}
				form.appendChild(
					tilt.createTable(
					{
						Header: tilt.createTable(
							{
								Top:
								{
									Titling: formItems.Titling,
									SiteTools: formItems.SiteTools,
									SiteSearch: formItems.SiteSearch
								}
							}, "Header"
						),
						Promo: formItems.Promo,
						Audiences: formItems.Audiences,
						Emergency: document.getElementById("emergency"),
						Topics:
						{
							Left: leftTopics,
							Center: rightTopics,
							Right: [ formItems.Tasks, formItems.News ]
						},
						Footer: formItems.ContactInfo
					},
					"Main")
				);
				form.removeChild(topicsNode);
				removeUabHome(formItems.SiteTools);
				replaceWithFlash(formItems.Promo);
				break;
			case "Landing":
				var sectionsNode = formItems.Sections;
				var sections = createArrayFromHtmlCollection(sectionsNode.getElementsByTagName("dl"));
				var firstSection = sections.length > 0 ? [sections.shift()] : null;
				form.appendChild(
					tilt.createTable(
					{
						Header: tilt.createTable(
							{
								Top:
								{
									Titling: formItems.Titling,
									SiteTools: formItems.SiteTools,
									SiteSearch: formItems.SiteSearch
								}
							}, "Header"
						),
						Audiences: [document.createElement("span"), formItems.Audiences],
						Content:
						{
							LeftSidebar: formItems.Topics,
							Landing: tilt.createTable(
							{
								First:
								{
									Feature: formItems.Feature,
									QuickLinks: formItems.QuickLinks
								},
								Second:
								{
									FirstSection: columnize(firstSection, 2),
									Announcements: formItems.Announcements
								},
								Third: columnize(sections, 3)
							},
							"Landing")
						},
						Footer: formItems.ContactInfo
					},
					"Main")
				);
				form.removeChild(sectionsNode);
				selectCurrentAudience(formItems.Audiences.getElementsByTagName("a"));
				createPrintThisPageLink();
				break;
			case "Inner":
				form.appendChild(
					tilt.createTable(
					{
						Header: tilt.createTable(
							{
								Top:
								{
									Titling: formItems.Titling,
									SiteTools: formItems.SiteTools,
									SiteSearch: formItems.SiteSearch
								},
								ColorBar: document.createTextNode("")
							}, "Header"
						),
						Content:
							formItems.Navigation ?
							{
								LeftSidebar: formItems.Navigation,
								Body: formItems.Body
							}
							:
							{
								Body: formItems.Body
							},
						Footer : formItems.ContactInfo
					},
					"Main")
				);
				createPrintThisPageLink();
				break;
		}
		adjustSearchBoxes();
		adjustFooterItems(formItems.ContactInfo);
		accessifyLinks();	

		function adjustSearchBoxes()
		{
			if (form.tagName == "DIV")
			{
				var siteSearch = formItems.SiteSearch;
				// remove Search if other inputs are found
				var inputs = body.getElementsByTagName("input");
				if (inputs.length > 0 && siteSearch)
				{
					var counter = 0;
					for(var i = 0; i < inputs.length; i++)
					{
						var input = inputs[i];
						if (input.type == "submit")
						{
							counter++;
						}
						if (counter > 1)
						{
							siteSearch.parentNode.removeChild(siteSearch);
							return;
						}
					}
				}
			}

			var defaultSearchValue = "Search UAB";
			// hack the SiteSearch Submit button
			var searchSubmit = document.getElementById("searchSubmit");
			if (searchSubmit)
			{
				searchSubmit.value = "       " + searchSubmit.value;
			}
			
			var searchQuery = document.getElementById("searchQuery");
			if (searchQuery)
			{
				searchQuery.value = defaultSearchValue;
				tilt.attachEvent(searchQuery, "focus", Query_OnFocus);
				tilt.attachEvent(searchQuery, "blur", Query_OnBlur);
				if (form)
				{
					tilt.attachEvent(form, "submit", Form_OnSubmit);
				}
				tilt.attachEvent(window, "unload", Query_OnUnload);
			}
			
			function Form_OnSubmit()
			{
				if (searchQuery.value == defaultSearchValue)
				{
					return false;
				}
				return true;
			}

			function Query_OnFocus()
			{
				if (searchQuery.value == defaultSearchValue)
				{
					searchQuery.value = "";		
				}
				return true;
			}
			
			function Query_OnBlur()
			{
				if (searchQuery.value.length == 0)
				{
					searchQuery.value = defaultSearchValue;
				}
				return true;
			}
			
			function Query_OnUnload()
			{
				tilt.detachEvent(searchQuery, "focus", Query_OnFocus);
				tilt.detachEvent(searchQuery, "blur", Query_OnBlur);
				tilt.detachEvent(window, "unload", Query_OnUnload);	
				if (form)
				{
					tilt.detachEvent(form, "submit", Form_OnSubmit);
				}
				return true;
			}
		}
		
		function accessifyLinks()
		{
			var anchors = document.getElementsByTagName("a");
			for(var i = 0; i < anchors.length; i++)
			{
				var anchor = anchors[i];
				anchor.title = retrieveText(anchor);
//				tilt.attachEvent(anchor, "click", anchor_OnClick);
			}
			
			function anchor_OnClick(anchor)
			{
				var href = anchor.href;
				var tracker = document.createElement("script");
				tracker.setAttribute("type", "text/javascript");
				tracker.setAttribute("src", "/click-tracking.js?from=" + escape(window.location.href) + "&to=" + escape(href) + "&timestamp=" + (new Date()).toUTCString());
				body.appendChild(tracker);
				window.setTimeout("window.location.assign(\"" + href + "\")", 0);
				return false;
			}

			function retrieveText(node)
			{
				var text = node.innerText;
				if (!text)
				{
					text = "";
					var childNode = node.firstChild;
					while(childNode)
					{
						if (childNode && childNode.nodeType == 3)
						{
							text += childNode.nodeValue;
						}
						childNode = childNode.nextSibling;
					}
				}
				return text;
			}
		}
		
		function adjustFooterItems(footer)
		{
			if (footer)
			{
				var listItems = footer.getElementsByTagName("li");
				if (listItems.length > 0)
				{
					listItems[0].className = "First";
				}
			}		
		}
		
		function removeUabHome(siteTools)
		{
			if (siteTools)
			{
				var links = siteTools.getElementsByTagName("a");
				for(var i = 0; i < links.length; i++)
				{
					var link = links[i];
					if (link.className == "UabHome")
					{
						var listItem = link.parentNode;
						listItem.parentNode.removeChild(listItem);
						return;
					}
				}
			}
		}
		
		function findLayoutItems()
		{
			var result = {};
			addToBag(body.getElementsByTagName("dl"));
			addToBag(body.getElementsByTagName("div"));
			return result;
			
			function addToBag(list)
			{
				for(var i = 0; i < list.length; i++)
				{
					var item = list[i];
					var className = item.className;
					if (className)
					{
						result[className] = item;
					}
				}
			}
		}

		function replaceWithFlash(promoNode)
		{
			var width = "730";
			var height = "188";
			var movie = "Resources/Promo.swf";
			var id = "PromoFlashMovie";
			var version = 4;
			var useNetscapePlugins = navigator.plugins && navigator.mimeTypes.length;
			
			if (detectFlash())
			{
				promoNode.innerHTML = createMovieHtml();
			}
			
			function createMovieHtml()
			{
				var sizeAttributes = "width=\"730\" height=\"188\"";
				return useNetscapePlugins ?
					"<embed type=\"application/x-shockwave-flash\" src=\"" + movie + "\" " + sizeAttributes + "></embed>"
					:
					"<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" " + sizeAttributes + "><param name=\"movie\" value=\"" + movie + "\" /></object>";
			}
			
		function detectFlash()
            {
                  return getFlashVersion() >= version;

                  function getFlashVersion()
                  {
                        if (useNetscapePlugins)
                        {
                              var plugin = navigator.plugins["Shockwave Flash"];
                              if(plugin && plugin.description)
                              {
                                    var description = plugin.description;
                                    var idx = description.indexOf('.')-2;
                              return description.substring(idx, idx+2);
                              }
                        } 
                        else
                        {
                              var version = 0;
                              for(var i = 4; i >= 3; i--)
                              {
                                    var testObject;
                                    try
                                    {
                                          testObject = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." +  i);
                                    }
                                    catch(e)
                                    {
                                          continue;
                                    }
                                    return i;
                              }
                        }
                        return 0;
                  }
            }
	 }
		
		function columnize(nodes, columnCount)
		{
			if (!nodes)
			{
				return null;
			}
			var holder = document.createElement("div");
			holder.className = "Columnized";
			for(var i = 0; i < nodes.length; i++)
			{
				holder.appendChild(createColumns(nodes[i]));
			}
			return holder;
			
			function createColumns(node)
			{
				var data = getFirstElementByTagName(node, "dd");
				if (data)
				{
					var list = getFirstElementByTagName(data, "ul");
					if (list)
					{
						var items = createArrayFromHtmlCollection(list.getElementsByTagName("li"));
						var columns = [list];
						var columnCells = { C1: list };
						for(var i = 1; i < columnCount; i++)
						{
							var column = document.createElement("ul");
							columns.push(column);
							columnCells["C" + i + 1] = column;
							data.appendChild(column);
						}
						var itemCount = items.length;
						var columnSize = parseInt(Math.ceil(items.length / columnCount), 10);
						for(var i = columnSize; i < itemCount; i++)
						{
							var columnIndex = parseInt(Math.floor(i / columnSize), 10);
							if (columnIndex < columns.length)
							{
								var column = columns[columnIndex];
								column.appendChild(items[i]);
							}
						}
						data.appendChild(tilt.createTable(
							{
								Columns: columnCells
							}
						));
					}
				}
				return node;
			}
		}
		
		function selectCurrentAudience(audienceAnchors)
		{
			var nonPidRegex = new RegExp("(?:\\&|\\?)pid=(\\d+)");
			nonPidRegex.exec(window.location.href);
			var locationPid = RegExp.$1;
			for(var i = 0; i < audienceAnchors.length; i++)
			{
				var anchor = audienceAnchors[i];
				if (anchor.href && anchor.href.indexOf(window.location) == 0) {
					replaceAnchor(anchor);
				}
			}
			
			function replaceAnchor(anchor)
			{
				var text = anchor.innerHTML;
				var strong = document.createElement("strong");
				strong.appendChild(document.createTextNode(text));
				strong.className = anchor.className;
				var parentNode = anchor.parentNode;
				parentNode.removeChild(anchor);
				parentNode.appendChild(strong);
			}
		}
		
		function createPrintThisPageLink()
		{
			var div = document.createElement("div"); 
			div.setAttribute("id", "PrintThisPage");
			var anchor = document.createElement("a");
			anchor.href = "javascript:window.print()";
			body.appendChild(div);
			div.appendChild(anchor);
			anchor.appendChild(document.createTextNode("Print This Page"));
		}
	}
	
	function createArrayFromHtmlCollection(htmlCollection)
	{
		var result = [];
		for(var i = 0; i < htmlCollection.length; i ++)
		{
			result.push(htmlCollection[i]);
		}
		return result;
	}
	
	function getFirstElementByTagName(node, tagName)
	{
		if (!node) { return null };
		var elements = node.getElementsByTagName(tagName);
		return elements.length > 0 ? elements[0] : null;
	}
}
