﻿new function() {
	eval(estrada.namespace);

	attachEvent(document, "layout", function() {
		//estrada.layoutView.set(true);		
		// create layout
		var layout = frame("holder",
			frame("page",
				cols(area("site-title"), area("tools")),
				cols(area("sections"), frame("search", area("search-box"), area("quick-links"))),
				area("breadcrumbs"),
				area("masthead"),
				cols(area("navigation"), frame("main",
					area("heading"),
					area("page-title"),
					cols(area("content"), area("related")))),
				cols(frame("footer",				
					area("utility"),
					area("legal"),
					area("contact-info")), area("site-title")),
				area("login")
			)
		).build(document.body);
		// push by id
		layout.push({
			"search-box": "search",
			"page-title": "titling",
			login: ["login", "properties"] });
			
		// push from grab-bucket
		layout.push(grab(document.getElementById("context"), {
			"section-title": "navigation"}));
			 
		layout.push(grab(document.getElementById("navigation"), {
			breadcrumbs: "breadcrumbs",
			"ancestors-children": "navigation" }));

		layout.push(grab(document.getElementById("context"), {
			emergency: "heading", 
			heading: "heading", 
			"site-title": "site-title", 
			"contact-info": "contact-info", 
			masthead: "masthead" }));
		
		layout.push(grab(document.getElementById("feeds"), {
			tools: "tools",
			content: "content",
			related: "related",
			audiences: "navigation",
			"quick-links": "quick-links",
			ads: "navigation",
			sections: "sections",
			utility: "utility",
			legal: "legal" }));

		// last one by id to ensure order
		layout.push({ content: "extensions" });

		// bind behaviors
		layout.bind("pretty-search").to(document);
		layout.bind("hover-menu").to("quick-links");
		layout.bind("url-highlight").to("sections");
		layout.bind("pretty-crumbs").to("breadcrumbs");
		layout.bind("deck").to("content");
		layout.bind("tiles-columns").to("content");
		layout.bind("first-li").to(document);
		layout.bind("rss-icon").to("page-title");
		layout.bind("indexer").to("related");
		layout.bind("indexer").to("content");
		layout.bind("selector").to("related");
		
		////////////////////////////////////////////////////////////////////
		// This code sets all text input elements in an ancestor element
		// with a single submit input to post when enter is hit while in the
		// text field
		////////////////////////////////////////////////////////////////////    
	    var oInputSubmits = getElementsByType(document, "input", "submit");
	    var iIdx = 0;
	    foreach (map(oInputSubmits), function(oInputSubmit) {
		    var oAncestorNode = null;
		    oCurrentNode = oInputSubmit.parentNode;
		    while (oAncestorNode == null && oCurrentNode != document) {
			    var oInputTextFields = getElementsByType(oCurrentNode, "input", "text");
			    if (oInputTextFields && oInputTextFields.length > 0) {
				    oAncestorNode = oCurrentNode;
			    } else {
				    oCurrentNode = oCurrentNode.parentNode;
			    }
		    }
		    if (oAncestorNode) {
			    var oSubmitCheck = getElementsByType(oAncestorNode, "input", "submit");
			    if (oSubmitCheck && oSubmitCheck.length == 1) {
				    if (oInputSubmit.id == "") {
					    oInputSubmit.id = oInputSubmit.name;
				    }
				    foreach (map(oAncestorNode.getElementsByTagName("input")), function (oInput) {
					    if (oInput.type == "text" || oInput.type == "password") {
						    oInput.setAttribute("submitId", oInputSubmit.id);
				            tilt.attachEvent(oInput, "keydown", function(oNode, oE) {
				                if (oE.keyCode == 13) {
					                var oSubmitId = oNode.getAttribute("submitId");
                   					window.setTimeout("var oSubmit = document.getElementById(\"" + oSubmitId + "\");oSubmit.focus();oSubmit.click()", 0);
				                    return false;
				                }
				                return true;
				            });
					    }
				    });
                    iIdx++;
			    }
		    }
	    });
		///////////////////////////////////////////////////////////////////////
		// include script for datetime picker, if needed
		///////////////////////////////////////////////////////////////////////
		if (filter(document.getElementsByTagName("input"), function(input) {
			return input.className.indexOf("date") >= 0;
		}).length > 0) {
			tilt.addScript("datetime.js");	
		}
		
		///////////////////////////////////////////////////////////////////////
		// include script for grid, if needed
		///////////////////////////////////////////////////////////////////////
		var oContent = document.getElementById("l-content");
		if (oContent) {
			if (foreach(oContent.getElementsByTagName("div"), function(div) {
				if (div.className == "visibility") {
					div.id = "grid-visibility";
					return true;
				}
			})) {
				tilt.addScript("grid.js");
			}
		}
		
		///////////////////////////////////////////////////////////////////////
		// include script for category-editor, if needed
		///////////////////////////////////////////////////////////////////////
		if (filter(document.getElementsByTagName("div"), function(div) {
			return div.className.indexOf("category-editor") >= 0;
		}).length > 0) {
			tilt.addScript("dynamictree.js");	
		}
	    
	    // replace images with flash by convention
		foreach(map(document.getElementsByTagName("img")), function(img) {
			var oSrc = img.src;
			if (oSrc && oSrc.indexOf(".swf.") > 0) {
				replaceWithFlash(img);
			}
		});	
	});
	
	function getElementsByType(oElm, strTagName, strTypeName) {
		var oElement;
		var arrReturnElements = [ ];
		if (oElm) {
			var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
			for(var i=0;i<arrElements.length;i++) {
				oElement = arrElements[i];
				if((oElement.type && (oElement.type == strTypeName)) || (oElement.type && strTypeName == "*")) {
					arrReturnElements.push(oElement);
				}   
			}
		}
		return (arrReturnElements)
	}
	
	attachEvent(document, "layouterror", function(errors) {
		var msg = "";
		foreach(errors, function(error) {
			msg = "\n\t" + error.name + ": " + error.message;
		});
		alert("layout errors occured:" + msg);
	});
	
	function replaceWithFlash(img)
	{
		var width = img.currentStyle ? img.currentStyle.width.replace(/px/, "") : img.width;			
		var height = img.currentStyle ? img.currentStyle.height.replace(/px/, "") : img.height;
		var src = img.src;
		if (width && height && src) {
			var movie = src.replace(/\.swf\..+/, ".swf");
			var version = 4;
			var useNetscapePlugins = navigator.plugins && navigator.mimeTypes.length;
			if (detectFlash())
			{
				var child = img;
				var oParent = img.parentNode;
				if (oParent.nodeName.toUpperCase() == "A") {
					child = oParent;
					oParent = oParent.parentNode;
				}
				var classname = child.className;
				var flashDiv = document.createElement("div");
				flashDiv.className = classname;
				flashDiv.innerHTML = createMovieHtml();
				oParent.replaceChild(flashDiv, child);
			}
			
		}

		function createMovieHtml()
		{
			var sizeAttributes = "width=\"" + width + "\" height=\"" + height + "\"";
			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;
   						return description.charAt(description.indexOf('.')-1);
					}
				} 
				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;
			}
		}
	}
}

estrada.behavior("menu").is({
	bind: function(node) {
		node.className = "l-closed";
		this.attachEvent(document.body, "click", function() {
			var node = estrada.scope.retrieve(arguments).getElement();
			if (node.className == "l-open") {
				node.className = "l-closed";
			}
			return true;				
		});
		this.attachEvent(node, "click", function() {
			var node = estrada.scope.retrieve(arguments).getElement();
			if (node.className != "l-open") {
				node.className =  "l-open";
				return false; 
			}
			return true;
		});
	}
})

estrada.behavior("hover-menu").is({
	bind: function(node) {
		node.className = "l-closed";
		this.attachEvent(node, "mouseout", function() {
			var node = estrada.scope.retrieve(arguments).getElement();
			if (node.className == "l-open") {
				node.className = "l-closed";
			}
			return true;				
		});
		this.attachEvent(node, "mouseover", function() {
			var node = estrada.scope.retrieve(arguments).getElement();
			if (node.className != "l-open") {
				node.className =  "l-open";
				return false; 
			}
			return true;
		});
	}
})

estrada.behavior("url-highlight").is({
	bind: function(node) {
		foreach(node.getElementsByTagName("a"), function(a) {
			if (window.location.href.indexOf(a.href) == 0) {
				a.className = "l-url-current";
			}
		})
	}
})

estrada.behavior("first-li").is({
	bind: function(node) {
		foreach(node.getElementsByTagName("ul"), function(ul) {
			foreach(ul.getElementsByTagName("li"), function(li) {
				li.className += " l-first";
				return true;
			})
		})
	}
})

estrada.behavior("pretty-crumbs").is({
	bind: function(node) {
		var child = node.firstChild;
		if (child) {
			var div = node.insertBefore(document.createElement("div"), child);
			div.className = "l-title";
			div.innerHTML = "You are here: ";
			var home = first(child.getElementsByTagName("a"));
			if (home) {
				home.innerHTML = "Home";
			}
		}
	}
})

estrada.behavior("pretty-search").is({
	bind: function(node) {
		var searchQuery = node.getElementById("search-query");
		if (searchQuery) {
			var defaultText = "Search";
			var blurClassName = "text l-blur";
			searchQuery.value = defaultText;
			searchQuery.className = blurClassName;
			tilt.attachEvent(searchQuery, "focus", function() {
				if (searchQuery.value == defaultText) {
					searchQuery.value = "";
					searchQuery.className = "text";
				}
			});
			tilt.attachEvent(searchQuery, "blur", function() {
				if (searchQuery.value.length == 0) {
					searchQuery.value = defaultText;
					searchQuery.className = blurClassName;
				}
			});
			tilt.attachEvent(searchQuery, "keydown", function(searchQuery, e) {
                if (e.keyCode == 13) {
                    window.setTimeout("document.getElementById(\"search-submit\").click()", 0);
                    return false;
                }
                return true;
			});
		}
		
		var searchSubmit = node.getElementById("search-submit");
		if (searchSubmit) {
			var parent = searchSubmit.parentNode;
			var div = parent.appendChild(document.createElement("div"));
			div.id = "l-search-submit";
			tilt.attachEvent(div, "click", function() {
				document.getElementById("search-submit").click();
			});
		}
	}
})

estrada.behavior("deck").is({
	bind: function(node, scope) {
		var behavior = this;
		foreach(filter(map(node.getElementsByTagName("div")), function(node) { return estrada.hasClassName(node, "deck") }), function(node) {
			var list;
			var title;
			foreach(node, function(node) {
				node.nodeName == "UL" && (list = estrada.setUniqueId(node));
				node.nodeName == "H3" && (title = estrada.setUniqueId(node));
			});
			if (list)
			{
				list = document.getElementById(list);
				var pics = node.insertBefore(document.createElement("ul"), list);
				pics.className = "l-pictures";
				node.insertBefore(document.createElement("div"), list).className = "l-pictures-bottom";
				var tabs = node.insertBefore(document.createElement("ul"), list);
				tabs.className = "l-tabs";
				var items = scope.items = {};
				var hasPic;
				list.className = "l-content";
				var previous;
				var next;
				foreach(list.getElementsByTagName("li"), function(li, i) {
					var item = { content: estrada.setUniqueId(li) };
					li.className = i == 0 ? "l-visible" : "l-hidden";
					var id;
					var tab;
					var pic;
					foreach(li, function(node) {
						if (estrada.hasClassName(node, "title")) {
							tab = estrada.setUniqueId(node);
						}
						if (!pic && node.nodeName == "IMG") {
							pic = estrada.setUniqueId(node);
						}
					});
					if (pic) {
						var picLi = pics.appendChild(document.createElement("li"));
						picLi.appendChild(document.getElementById(pic));
						item.pic = estrada.setUniqueId(picLi);
						picLi.className = i == 0 ? "l-visible" : "l-hidden";
						hasPic = true;
					}
					if (tab) {
						var node = document.getElementById(tab);
						var title = tabs.appendChild(document.createElement("li"));
						item.id = id = item.title = estrada.setUniqueId(title);
						title.className = i == 0 ? "l-focused" : "l-blurred";
						if (node.nodeName == "A") {
							title.innerHTML = "<span class=\"l-title\">" + node.innerHTML + "</span>";
							node.innerHTML = "more &gt;&gt;"
							li.appendChild(node);
						}
						else {
							title.appendChild(node);
							node.className += " l-title";
						}
						behavior.attachEvent(title, "click", function(node) {
							node = node.nodeName == "LI" ? node : node.parentNode;
							var scope = estrada.scope.retrieve(arguments).getBehaviorScope();
							if (scope && scope.current != node.id) {
								change(scope.items[scope.current], "l-blurred", "l-hidden");
								change(scope.items[node.id], "l-focused", "l-visible");
								scope.current = node.id;
								setSequence(scope);
							}
						});
					}
					else {
						item.id = id = item.content;
					}
					if (previous) {
						item.previous = previous;
						items[previous].next = id;
					}
					previous = id;
					if (i == 0) {
						scope.current = id;
					}
					if (id) {
						items[id] = item;
					}
				})
				if (estrada.hasClassName(node, "sequence")) {
					var div = node.appendChild(document.createElement("div"));
					div.className = "l-sequence";
					var seq = div.appendChild(document.createElement("ul"));
					var previous = seq.appendChild(document.createElement("li"));
					scope.previous = estrada.setUniqueId(previous);
					previous.className = "l-disabled";
					previous.innerHTML = "<span class=\"l-previous\">Previous</span>";
					behavior.attachEvent(previous, "click", function() {
						var scope = estrada.scope.retrieve(arguments).getBehaviorScope();
						var current = scope.items[scope.current];
						if (current.previous) {
							var previous = scope.items[current.previous];
							change(current, "l-blurred", "l-hidden");
							change(previous, "l-focused", "l-visible");
							scope.current = previous.id;
							setSequence(scope);
						}
					})
					var next = seq.appendChild(document.createElement("li"));
					scope.next = estrada.setUniqueId(next);
					next.className = "l-enabled";
					next.innerHTML = "<span class=\"l-next\">Next</span>";
					behavior.attachEvent(next, "click", function() {
						var scope = estrada.scope.retrieve(arguments).getBehaviorScope();
						var current = scope.items[scope.current];
						if (current.next) {
							var next = scope.items[current.next];
							change(current, "l-blurred", "l-hidden");
							change(next, "l-focused", "l-visible");
							scope.current = next.id;
							setSequence(scope);
						}
					})
				}
			}
			if (title) {
				var h3 = document.getElementById(title);
				node.appendChild(h3);
				h3.className += " l-title";
				var a = first(h3);
				if (a && a.nodeName == "A") {
					h3 = a;
				}
				h3.innerHTML = "All " + h3.innerHTML;
			}
			node.appendChild(document.createElement("div")).className = "l-bottom";
		
			function change(item, focus, visibility) {
				document.getElementById(item.content).className = visibility;
				item.pic && (document.getElementById(item.pic).className = visibility);
				item.title && (document.getElementById(item.title).className = focus);
			}
			function setSequence(scope) {
				if (scope.next) {
					var current = scope.items[scope.current];
					state(document.getElementById(scope.next), current.next)
					state(document.getElementById(scope.previous), current.previous);
				}
				
				function state(node, enabled) {
					node.className = enabled ? "l-enabled" : "l-disabled";
				}
			}
		})
	}
})

estrada.behavior("tiles-columns").is({
	bind: function(node, scope) {
		var behavior = this;
		foreach(map(node.getElementsByTagName("ul")), function(node) {
			node = node.parentNode;
			var tiles = estrada.hasClassName(node, "tiles");
			var columns = estrada.hasClassName(node, "columns");
			if (tiles || columns) {
				var list;
				var title;
				node.className += " l-tiles-columns";
				foreach(node, function(node) {
					node.nodeName == "UL" && (list = estrada.setUniqueId(node));
					node.nodeName == "H3" && (title = estrada.setUniqueId(node));
				});
				if (list) {
					var ul = document.getElementById(list);
					var rows = estrada.setUniqueId(columns ? node.appendChild(document.createElement("ul")) : ul);
					var row;
					var colCount = 1;
					var tileCount = 1;
					foreach(ul, function(li, i) {
						if (columns) {
							if (tileCount % 2) {
								var newRow = document.getElementById(rows).appendChild(document.createElement("li"));
								var tile = newRow.appendChild(document.createElement("div"));
								newRow.className += colCount % 2  ? " l-odd"  : " l-even";
								tile.className = "l-row";
								var div = tile.appendChild(document.createElement("div"));
								div.className = "l-left";
								move(li, div, columns);
								row = estrada.setUniqueId(tile);
								++colCount;
							}
							else {
								var oldRow = document.getElementById(row);
								var div = oldRow.appendChild(document.createElement("div"));
								div.className = "l-right";
								move(li, div, columns);
								oldRow.appendChild(document.createElement("div")).className = "l-row-bottom";
							}
						}
						else {
							var to = li.appendChild(document.createElement("div"));
							li.className += tileCount % 2  ? " l-odd"  : " l-even";
							to.className = "l-tile";
							move(li, to, columns);
						}
						++tileCount;
					})
					columns && ul.parentNode.removeChild(ul);
				}
				if (title) {
					var h3 = document.getElementById(title);
					node.appendChild(h3);
					var a = first(h3);
					if (a && a.nodeName == "A") {
						h3 = a;
					}
					h3.innerHTML = "All " + h3.innerHTML;
				}
			}
		})
		
		function move(from, to, moveTitle) {
			var nodes = [ ];
			foreach (from, function(node) {
				if (node != to) {
					nodes.push(node);
				}
			});
			var contentDiv = to.appendChild(document.createElement("div"));
			contentDiv.className = "l-content";
			var content = estrada.setUniqueId(contentDiv);
			var toId = estrada.setUniqueId(to);
			to.appendChild(document.createElement("div")).className = "l-bottom";
			var thumb;
			var title;
			foreach(nodes, function(node) {
				var to = document.getElementById(toId);
				if (!thumb && node.nodeName == "IMG" && estrada.hasClassName(node, "thumbnail")) {
					thumb = estrada.setUniqueId(node);
				}
				else {
					if (!title && node.nodeName == "A" && estrada.hasClassName(node, "title")) {
						title = estrada.setUniqueId(node);
					}
					document.getElementById(content).appendChild(node);
				}
			})
			if (thumb) {
				var div = to.insertBefore(document.createElement("div"), to.firstChild);
				div.className = "l-thumbnail";
				div.appendChild(document.getElementById(thumb));
				to.className += " l-has-thumb";
			}
			if (title) {
				title = document.getElementById(title);
				if (moveTitle) {
					to.insertBefore(title, to.firstChild);
				}
				var a = contentDiv.appendChild(document.createElement("a"));
				a.className = "l-more";
				a.href = title.href;
				a.innerHTML = "more &gt;&gt;";
			}
		}
	}
});

estrada.behavior("rss-icon").is({
	bind: function(node) {
		var head = first(document.getElementsByTagName("head"));
		if (head) {
			var rss = first(filter(head, function(node) {
				if (node.type == "application/rss+xml") {
					return true;
				}
			}));
			if (rss) {
				var div = node.appendChild(document.createElement("div"));
				div.className = "l-rss";
				var a = div.appendChild(document.createElement("a"));
				a.href = rss.href;
				a.innerHTML = "RSS";
				node.className += " l-with-rss";
				node.appendChild(document.createElement("div")).className = "l-rss-bottom";
			}
		}
	}
});

estrada.behavior("indexer").is({
	bind: function(node) {
		var bind = this;
		foreach(map(node), function(node) {
			if (estrada.hasClassName(node, "indexer")) {
				var scope = {};
				foreach(node, function(node) {
					if (node.nodeName == "H3") {
						scope.title = estrada.setUniqueId(node);
					}
					else if (node.nodeName == "UL") {
						scope.list = estrada.setUniqueId(node);
					}
				})
				if (scope.title) {
					var title = document.getElementById(scope.title);
					var a = first(title.getElementsByTagName("A"));
					if (a) {
						scope.href = a.href;
						title.innerHTML = a.innerHTML;
					}
				}
				if (scope.list) {
					list = document.getElementById(scope.list);
					var search = node.insertBefore(document.createElement("div"), list);
					search.className = "l-search";
					var oNode = document.createElement("div");
					scope.input = estrada.setUniqueId(oNode);
					search.innerHTML = "<input type=\"text\" class=\"l-query\" id=\"" + scope.input + "\" /><div class=l-mockbtn />";
					oInput = document.getElementById(scope.input);
					tilt.attachEvent(oInput, "keyup", function(oInput) {
						clearSelectedLetter();
						show(scope, oInput.value, false);
					});
					var alphabet = node.insertBefore(document.createElement("div"), list);
					alphabet.className = "l-alphabet";
					var ul = alphabet.appendChild(document.createElement("ul"));
					scope.alphabet = {};
					for(var i = 0; i < 26; i++) {
						var li = ul.appendChild(document.createElement("li"));
						var code = 65 + i;
						var letter = String.fromCharCode(code);
						li.innerHTML = "<a className=\"" + letter + "\">" + letter + "</a>";
						var oA = first(li.getElementsByTagName("a"));
						scope.alphabet[code] = estrada.setUniqueId(li);
						tilt.attachEvent(oA, "click", function(oA) {
							clearSelectedLetter();
							oA.parentNode.className = oA.parentNode.className + " l-selected";
							show(scope, oA.innerHTML, true);
						});
					}
					var items = node.appendChild(document.createElement("div"));
					items.className = "l-items";
					items.appendChild(list);
					show(scope, "*", true);
				}
			}
		})
		function clearSelectedLetter() {
			var oAlphabet = first(getElements(document, "div", "l-alphabet"));
			foreach(map(getElements(oAlphabet, "li", "l-selected")), function(oLi) {
				oLi.className = oLi.className.replace("l-selected", "");
			});
		}
		function show(scope, value, start) {
			if (!scope.loaded) {
				estrada.ajah(scope.href, {
					feeds: function(node) {
						foreach(filter(node.getElementsByTagName("div"), function(node) { return estrada.hasClassName(node, "index") }), function(node) {
							var list = document.getElementById(scope.list);
							while(list.firstChild) list.removeChild(list.firstChild);
							scope.items = [];
							map(node.getElementsByTagName("a"), function(node, i) {
								scope.items[i] = { href: node.href, title: node.innerHTML };
							})
							scope.index = [];
							foreach(scope.items, function(item, i) {
								var list = document.getElementById(scope.list);
								var li = list.appendChild(document.createElement("li"));
								item.id = estrada.setUniqueId(li);
								li.className = "l-hidden";
								var a = li.appendChild(document.createElement("a"));
								var title = item.title.toUpperCase();
								for(var j = 0; j < title.length; j++) {
									var c = title.charCodeAt(j);
									if (j == 0) {
										document.getElementById(scope.alphabet[c]).className = "l-exists";
									}
									var lines = scope.index[c] || (scope.index[c] = []);
									(lines[i] || (lines[i] = [])).push(j);
								}
								a.innerHTML = item.title;
								a.href = item.href;
							})
						})
						scope.loaded = true;
						display(value, start);
					}
				})
			}
			else {
				display(value, start);
			}
						
			function display(value, start) {
				value = value.toUpperCase();
				if (!value) {
					value = "*";
					start = true;
				}
				if (value == scope.current && start == scope.start) return;
				scope.current = value;
				scope.start = start;
				var result = {};
				if (value == "*") {
					result = scope.items;
				} else {
					for(var i = 0; i < value.length; i++) {
						var c = value.charCodeAt(i);
						var lines = scope.index[c];
						if (!lines) {
							result = {};
							break;
						}
						if (i == 0) {
							foreach(lines, function(positions, line) {
								if (!positions) return;
								var resultLine = map(positions);
								if (start) {
									resultLine = filter(resultLine, function(position) {
										return position == 0;
									});
									if (resultLine.length == 0) return;
								}
								result[line] = resultLine;
							});
						}
						else {
							var iteration = {};
							for(var line in result) {
								var next = lines[line];
								if (next) {
									var lineResult = filter(map(result[line], function(position) {
										for(var p = 0; p < next.length; p++) {
											var nextPos = next[p];
											if (nextPos == position + 1) return nextPos;
										}
									}), function(p) { return p })
									if (lineResult.length > 0) {
										iteration[line] = lineResult;
									}
								}
							}
							result = iteration;
						}
					}
				}
				var selection = [];
				for(var line in result) {
					selection.push(line);
				}
				setClass(scope.selection, "l-hidden");
				setClass(selection, "l-visible");
				scope.selection = selection;
				
				function setClass(selection, className) {
					foreach(selection, function(line) {
						document.getElementById(scope.items[line].id).className = className;
					})
				}
				
				function storePositions(positions, previous) {
					var result = {};
					foreach(positions, function(position) {
						result[position] = ((previous && previous[position]) || 0) + 1;
					});
					return result;
				}
			}
		}
	}
});

estrada.behavior("selector").is({
	bind: function(node) {
		var oSelector = first(getElements(node, "div", "selector"));
		var bind = this;
		var oNewSelector;
		var oH3 = first(getElements(oSelector, "h3", "*"));
		if (oH3) {
			oH3.parentNode.removeChild(oH3);
		}
		var oUL = first(getElements(oSelector, "ul", "*"));
		if (oUL) {
			var links = map(oUL, function(node, i) { 
				var a = first(getElements(node,"a","*"));
				if (a) {
					var href = a.href;
					var title = a.innerHTML;
					a.parentNode.removeChild(a);
					return { href: href, title: title }
				}
				return null;
			})
			links.current = 0;
			
			var selectId = estrada.setUniqueId();
			var selectHtml = "<select id=\"" + selectId + "\">";
			selectHtml += "<option value=\"" + 0 + "\">- - - Select Sport - - -</option>";
			selectHtml += "<option value=\"" + 1 + "\">Athletics Home</option>";
			var i = 2;
			foreach(links, function(link) {
				selectHtml += "<option value=\"" + i++ + "\">" + link.title + "</option>";
			})
			selectHtml += "</select>";
			oNewSelector = oUL.parentNode.insertBefore(document.createElement("div"), oUL);
			oNewSelector.className = "l-selector";
			oNewSelector.innerHTML = selectHtml;
			bind.attachEvent(document.getElementById(selectId), "change", function(node) {
				jumpTo(links, node.value);
			});
			oUL.parentNode.removeChild(oUL);
		}
		function jumpTo(links, key) {
			if (key > 0) {
				if (key == 1) {
					window.location = "/athletics";
				} else if (links && links[key-2] && links[key-2].href) {
					window.location = links[key-2].href;
				}
			}
		}
		var oScoreTab, oSchedTab, oScoreInfo, oSchedInfo, oElm, oElm2, oElm3;
		var oScoreSched = null, oScoreH3, oSchedH3;
		var oScoreboard = first(getElements(node, "div", "scoreboard"));
		var oSchedule = first(getElements(node, "div", "schedule"));
		if (oSelector) {
			oScoreSched = document.createElement("div");
			oScoreSched.className = "l-scoresched";
			var oHeading = oScoreSched.appendChild(document.createElement("h3"));
			oHeading.innerHTML = "SPORTS LISTING";
			oScoreSched.appendChild(oNewSelector);
			var oElm = oScoreSched.appendChild(document.createElement("div"));
			oElm.className = "l-separator";
			oScoreTab = oScoreSched.appendChild(document.createElement("div"));
			oScoreTab.className = "l-scoretab l-inactive";
			oScoreTab.setAttribute("info","l-scoreinfo");
			if (oScoreboard) {
				oScoreH3 = first(getElements(oScoreboard, "h3", "*"));
				if (oScoreH3) {
					oElm = first(getElements(oScoreH3, "a", "*"));
					if (oElm) {
						oScoreTab.innerHTML = oElm.innerHTML;
					} else{
						oScoreTab.innerHTML = oScoreH3.innerHTML;
					}
				} else {
					oScoreTab.innerHTML = "Scores";
				}
			} else {
					oScoreTab.innerHTML = "Scores";
			}
			
			oSchedTab = oScoreSched.appendChild(document.createElement("div"));
			oSchedTab.className = "l-schedtab l-active";
			oSchedTab.setAttribute("info","l-schedinfo");
			if (oSchedule) {
				oSchedH3 = first(getElements(oSchedule, "h3", "*"));
				if (oSchedH3) {
					oElm = first(getElements(oSchedH3, "a", "*"));
					if (oElm) {
						oSchedTab.innerHTML = oElm.innerHTML;				
					} else {
						oSchedTab.innerHTML = oSchedH3.innerHTML;				
					}
				} else {
					oSchedTab.innerHTML = "Schedule";
				}
			} else {
				oSchedTab.innerHTML = "Schedule";
			}
			oScoreSched.appendChild(oScoreTab);
			oScoreSched.appendChild(oSchedTab);
			
			var oScoreUL = first(getElements(oScoreboard, "ul", "articles"));
			var oSchedUL = first(getElements(oSchedule, "ul", "articles"));
			oScoreInfo = oScoreSched.appendChild(document.createElement("div"));
			oScoreInfo.className = "l-info l-scoreinfo l-hide";
			if (oScoreUL) {
				var oNewRow, oNewCell, oNewDiv, strValue;
				var oNewTable = oScoreInfo.appendChild(document.createElement("table"));
				var oNewHolder = oNewTable.appendChild(document.createElement("tbody"));
				var strCurrentSport = "", strSport, oSportUL, oSportLi;
				foreach(map(oScoreUL), function(oLi) {
					oNewRow = oNewHolder.appendChild(document.createElement("tr"));
					/* sport */
					if (oSportUL = first(getElements(oLi, "ul", "sport"))) {
						if (oSportLi = first(oSportUL.getElementsByTagName("li"))) {
							if (strSport = oSportLi.innerHTML) {
								if (strSport != strCurrentSport) {
									oSportTitle = document.createElement("h4");
									oSportTitle.innerHTML = strSport;
									if (strCurrentSport == "") {
										oNewCell = oNewRow.appendChild(document.createElement("td"));
										oNewCell.className = "l-sport-header";
										oNewCell.colSpan ="4";
										oNewCell.appendChild(oSportTitle);
										oNewRow = oNewHolder.appendChild(document.createElement("tr"));
									} else {
										oNewTable.parentNode.insertBefore(oSportTitle, oNewTable);
										oNewCell = oNewRow.appendChild(document.createElement("td"));
										oNewCell.className = "l-sport-header";
										oNewCell.colSpan ="4";
										oNewCell.appendChild(oSportTitle);
										oNewTable = oScoreInfo.appendChild(document.createElement("table"));
										oNewHolder = oNewTable.appendChild(document.createElement("tbody"));
										oNewRow = oNewHolder.appendChild(document.createElement("tr"));
									}
									strCurrentSport = strSport;
								}
							}
						}
					} else {
						if (strCurrentSport != "") {
							oNewTable = oScoreInfo.appendChild(document.createElement("table"));
							oNewHolder = oNewTable.appendChild(document.createElement("tbody"));
							oNewRow = oNewHolder.appendChild(document.createElement("tr"));
						}
					}

					/* game-time */
					oNewCell = oNewRow.appendChild(document.createElement("td"));
					oNewCell.className = "l-gate-time-cell";
					oNewDiv = oNewCell.appendChild(document.createElement("div"));
					oNewDiv.className = "l-game-time";
					oElm = first(getElements(oLi, "abbr", "game-time"));
					if (oElm) {
						var strDateTime = oElm.title;
						var arrA1 = strDateTime.split('T');
						var arrA2 = arrA1[0].split('-');
						oNewDiv.innerHTML = arrA2[1] + '/' + arrA2[2];
					}
					
					/* opponent */
					oNewCell = oNewRow.appendChild(document.createElement("td"));
					oNewCell.className = "l-opponent-cell";
					oNewDiv = oNewCell.appendChild(document.createElement("div"));
					oNewDiv.className = "l-opponent";
					oElm = first(getElements(oLi, "div", "opponent"));
					oElm2 = first(getElements(oLi, "div", "location"));
					oElm3 = first(getElements(oLi, "div", "conf-game"));
					if (oElm3.innerHTML && oElm3.innerHTML.indexOf("Yes") >= 0) {
						strValue = "*";
					} else {
						strValue = "";
					}
					if (oElm2.innerHTML && oElm2.innerHTML.indexOf("Away") >= 0) {
						oNewDiv.innerHTML = "@ " + oElm.innerHTML + strValue;
					} else if (oElm2.innerHTML && oElm2.innerHTML.indexOf("Neutral") >= 0) {
						oNewDiv.innerHTML = "vs " + oElm.innerHTML + strValue;
					} else {
						oNewDiv.innerHTML = oElm.innerHTML + strValue;
					}
					
					/* won/lost */
					oNewCell = oNewRow.appendChild(document.createElement("td"));
					oNewCell.className = "l-won-lost-cell";
					oNewDiv = oNewCell.appendChild(document.createElement("div"));
					oNewDiv.className = "l-won-lost";
					oElm = first(getElements(oLi, "div", "team-score"));
					var intTeamScore = parseInt(oElm.innerHTML);
					oElm2 = first(getElements(oLi, "div", "opponent-score"));
					var intOpponentScore = parseInt(oElm2.innerHTML);
					if (intTeamScore > intOpponentScore) {
						oNewDiv.innerHTML = "W";
					} else if (intTeamScore < intOpponentScore) {
						oNewDiv.innerHTML = "L";
					} else {
						oNewDiv.innerHTML = "T";
					}
					
					/* score */
					oNewCell = oNewRow.appendChild(document.createElement("td"));
					oNewCell.className = "l-score-cell";
					oNewDiv = oNewCell.appendChild(document.createElement("div"));
					oNewDiv.className = "l-score";
					oNewDiv.innerHTML = oElm.innerHTML + "-" + oElm2.innerHTML;
				});
				oScoreboard.parentNode.removeChild(oScoreboard);
			}
			oSchedInfo = oScoreSched.appendChild(document.createElement("div"));
			oSchedInfo.className = "l-info l-schedinfo l-show";
			if (oSchedUL) {
				var oUp = oSchedInfo.appendChild(document.createElement("div"));
				oUp.className = "l-up";
				var oSportDiv, strValue, oDateHolder=null, oSportHolder=null, oTimeDiv;
				var strCurrentDate = "", strCurrentSport = "";
				var strSport, strDate, oSportUL, oSportLi, oSportTitle;
				foreach(map(oSchedUL), function(oLi) {
					/* game-time */
					oTimeDiv = document.createElement("div");
					oTimeDiv.className = "l-time";
					var strDateVal = "TBA"
					var strTimeVal = "TBA"
					if (oElm = first(getElements(oLi, "abbr", "game-time"))) {
						var arrA1 = oElm.title.split('T');
						if (arrA1 && arrA1.length >= 2) {
							var arrA2 = arrA1[0].split('-');
							if (arrA2 && arrA2.length >=3) {
								var arrA3 = arrA1[1].split(':');
								if (arrA3 && arrA3.length >=3) {
									var oNewDate = new Date(arrA2[0],arrA2[1]-1,arrA2[2],arrA3[0],arrA3[1],arrA3[2]);
									strDateVal = formatDate(oNewDate, "EE, NNN d");
									strTimeVal = formatDate(oNewDate, "h:mm") + formatDate(oNewDate, "a");
								}
							}
						}
					}
					strDate = strDateVal
					oTimeDiv.innerHTML = strTimeVal
					if (strDate != strCurrentDate) {
						oDateHolder = oSchedInfo.appendChild(document.createElement("div"));
						oDateHolder.className = "l-date-holder l-hide";
						oElm2 = oDateHolder.appendChild(document.createElement("h4"));
						oElm2.innerHTML = strDate;
						strCurrentDate = strDate;
						strCurrentSport = "";
					}

					/* sport */
					if (oSportUL = first(getElements(oLi, "ul", "sport"))) {
						if (oSportLi = first(oSportUL.getElementsByTagName("li"))) {
							if (strSport = oSportLi.innerHTML) {
								if (strSport != strCurrentSport) {
									oSportHolder = oDateHolder.appendChild(document.createElement("div"));
									oSportHolder.className = "l-sport-holder";
									oSportTitle = document.createElement("h5");
									oSportTitle.innerHTML = strSport;
									oSportHolder.appendChild(oSportTitle);
									strCurrentSport = strSport;
								}
							}
						}
					} else {
						oSportHolder = oDateHolder.appendChild(document.createElement("div"));
						oSportHolder.className = "l-sport-holder";
						strSport = "";
					}

					oSportHolder.appendChild(oTimeDiv);
									
					/* opponent */
					oNewDiv = oSportHolder.appendChild(document.createElement("div"));
					oNewDiv.className = "l-opponent";
					oElm = first(getElements(oLi, "div", "opponent"));
					oElm2 = first(getElements(oLi, "div", "location"));
					oElm3 = first(getElements(oLi, "div", "conf-game"));
					if (oElm3.innerHTML && oElm3.innerHTML.indexOf("Yes") >= 0) {
						strValue = "*";
					} else {
						strValue = "";
					}
					if (oElm2.innerHTML && oElm2.innerHTML.indexOf("Away") >= 0) {
						oNewDiv.innerHTML = "@ " + oElm.innerHTML + strValue;
					} else if (oElm2.innerHTML && oElm2.innerHTML.indexOf("Neutral") >= 0) {
						oNewDiv.innerHTML = "vs " + oElm.innerHTML + strValue;
					} else {
						oNewDiv.innerHTML = oElm.innerHTML + strValue;
					}

				});
				var oDown = oSchedInfo.appendChild(document.createElement("div"));
				oDown.className = "l-down";
				oSchedule.parentNode.removeChild(oSchedule);
				var oFullSched = oSchedInfo.appendChild(document.createElement("a"));
				oFullSched.href = "/athletics/schedule";
				oFullSched.className = "l-full-schedule";
				oFullSched.innerHTML = "See Full Schedule";
			}				
			var oConfDiv = oScoreSched.appendChild(document.createElement("div"));
			oConfDiv.className = "l-legend";
			oConfDiv.innerHTML = "*Conference opponent";
			function setTab(oTab) {
				oScoreTab.className = oScoreTab.className.replace("l-active", "l-inactive");
				oSchedTab.className = oSchedTab.className.replace("l-active", "l-inactive");
				oTab.className = oTab.className.replace("l-inactive", "l-active");
				var strInfoClass = oTab.getAttribute("info");
				foreach(map(getElements(oScoreSched, "div", "l-info")), function(oInfo) {
					if (oInfo.className.indexOf(strInfoClass) >= 0) {
						oInfo.className = oInfo.className.replace("l-hide", "l-show");
					} else {
						oInfo.className = oInfo.className.replace("l-show", "l-hide");
					}
				});
			}
			var intVisibleDays = 3;
			var arrDays = getElements(oSchedInfo, "div", "l-date-holder");
			var intNumberOfDays = arrDays.length;
			var intTopDay = 0;
			function scrollSched(oArrow) {
				if (oArrow.className.indexOf("l-up") >= 0) {
					/* scroll up */
					if (intTopDay > 0) {
						--intTopDay;
					} else {
						return(true);
					}
				} else {
					/* scroll down */
					if ((intTopDay + intVisibleDays) < intNumberOfDays) {
						++intTopDay;
					} else {
						return(true);
					}
				}
				showDays();
			}
			function showDays() {
				var intIdx;
				var oDay;
				if (intNumberOfDays > 0) {
					for (intIdx=0; intIdx < intTopDay; ++intIdx) {
						oDay = arrDays[intIdx];
						oDay.className = oDay.className.replace("l-show", "l-hide");
					}
					for (intIdx=intTopDay; intIdx < (intTopDay + intVisibleDays) && intIdx < intNumberOfDays; ++intIdx) {
						oDay = arrDays[intIdx];
						oDay.className = oDay.className.replace("l-hide", "l-show");
					}
					for (intIdx=(intTopDay + intVisibleDays); intIdx < intNumberOfDays; ++intIdx) {
						oDay = arrDays[intIdx];
						oDay.className = oDay.className.replace("l-show", "l-hide");
					}
				}
			}
			showDays();
			tilt.attachEvent(oScoreTab, "click", setTab);
			tilt.attachEvent(oSchedTab, "click", setTab);
			if (oUp) tilt.attachEvent(oUp, "click", scrollSched);
			if (oDown) tilt.attachEvent(oDown, "click", scrollSched);
			
			/* last thing to do here */
			oSelector.parentNode.insertBefore(oScoreSched, oSelector);
			oSelector.parentNode.removeChild(oSelector);
		}
	}
});		
function getElements(oElm, strTagName, strClassName) {
	var oElement;
	var arrReturnElements = [ ];
	if (oElm) {
		var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
		for(var i=0;i<arrElements.length;i++) {
			oElement = arrElements[i];
			if (oElement.className) {
				var oClasses = oElement.className.split(" ");
				var bolFound = false;
				var intXX = 0;
				while (!bolFound && (intXX < oClasses.length)) {
					if (oClasses[intXX] == strClassName) {
						bolFound = true;
					} else {
						++intXX;
					}
				}
				if (!bolFound) {
					if (strClassName == "*") {
						bolFound = true;
					}
				}
			} else {
				if (strClassName == "*") {
					bolFound = true;
				}
			}
			if (bolFound) {
				arrReturnElements.push(oElement);
			}
		}
	}
	return (arrReturnElements)
}
////////////////////////////////////////////////////////////////////////////
// This function uses the same 'format' strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | A  (AM or PM)      | a ( a or p)
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
/////////////////////////////////////////////////////////////////////////////
function formatDate(date,format) {
	var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	function LZ(x) {return(x<0||x>9?"":"0")+x}
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11) {value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["A"]="PM"; value["a"]= "p"; }
	else { value["A"]="AM"; value["a"] = "a"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
}