var debug = false;

TDLinkObject = function(LinkObj, Link, Index) {
	this.Obj = LinkObj;
	this.LinkTo = Link;
	this.Flyout = Index;
};

TDFlyoutNav = function(Container) {
	var self = this;
	
	var Headers = {};
	var Flyouts = {};
	var FlyoutHeights = {};
	var SubLinks = {};
	var HeaderCount = 0;
	var SubLinkCount = 0;
	var ActiveFlyout = -1;
	
	// tweening variables
	var timer;
	var height = new Array(); // expand index will be 0, collapse index will be 1+
	var step = new Array(); // expand index will be 0, collapse index will be 1+
	
	function init() {
		if (Container) {
			var Children = Container.childNodes;
			for (var x = 0; x < Children.length; x++) {
				if (Children[x].className && Children[x].className == "TDNavHeaders") {
					var NavHeaders = Children[x].childNodes;
					for (var y = 0; y < NavHeaders.length; y++) {
						if (NavHeaders[y].className && NavHeaders[y].className.indexOf("TDNavHeader") >= 0) {
							if (NavHeaders[y].innerHTML.indexOf("<a") > -1 || NavHeaders[y].innerHTML.indexOf("<A") > -1) {
								var linkto = /href="(.*)"/.exec(NavHeaders[y].innerHTML);
								var linktext = />(.*)</.exec(NavHeaders[y].innerHTML);
								NavHeaders[y].innerHTML = linktext[1];
								Headers[HeaderCount] = new TDLinkObject(NavHeaders[y], linkto[1], -1);
							} else {
								Headers[HeaderCount] = new TDLinkObject(NavHeaders[y], false, -1);
							}
							HeaderCount++;
						}
					}
				} else if (Children[x].className && Children[x].className.indexOf("TDNavFlyout") >= 0) {
					var index = GetHeaderIndex(Children[x].id.replace("Flyout-", "Header-"));
					
					if (index > -1) {
						Flyouts[index] = Children[x];
						FlyoutHeights[index] = Children[x].offsetHeight;
						Flyouts[index].style.height = 0;
						Flyouts[index].style.visibility = "visible";
					}
				}
			}
			
			for (var x = 0; x < HeaderCount; x++) {
				AddEvent(Headers[x].Obj, "mouseover", HeaderHover);
				if (Headers[x].LinkTo) AddEvent(Headers[x].Obj, "click", HeaderClick);
				
				if (Flyouts[x]) {
					var Subs = Flyouts[x].childNodes;
					for (var y = 0; y < Subs.length; y++) {
						if (Subs[y].className && Subs[y].className.indexOf("TDNavSub") >= 0) {
							var linkto = /href="(.*)"/.exec(Subs[y].innerHTML);
							var linktext = />(.*)</.exec(Subs[y].innerHTML);
							Subs[y].innerHTML = linktext[1];
							SubLinks[SubLinkCount] = new TDLinkObject(Subs[y], linkto[1], x);
							SubLinkCount++;
						}
					}
				}
			}
			
			if (SubLinkCount > 0) {
				for (var x = 0; x < SubLinkCount; x++) {
					AddEvent(SubLinks[x].Obj, "mouseover", SubHover);
					AddEvent(SubLinks[x].Obj, "click", SubClick);
				}
			}
			Container.style.visibility = "inherit";
		}
	};
	
	function GetHeaderIndex(id) {
		var index = -1;
		if (HeaderCount > 0) {
			for (var x = 0; x < HeaderCount; x++) {
				if (Headers[x].Obj.id == id) index = x;
			}
		}
		
		return index;
	};
	
	function GetSubLinkIndex(id) {
		var index = -1;
		if (SubLinkCount > 0) {
			for (var x = 0; x < SubLinkCount; x++) {
				if (SubLinks[x].Obj.id == id) index = x;
			}
		}
		
		return index;
	};
	
	function HeaderHover(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		var index = GetHeaderIndex(e.target.id);
		AddEvent(e.target, "mouseout", HeaderLeave);
		
		if (Flyouts[index])
			ActiveFlyout = index;
		else
			ActiveFlyout = -1;
			
		e.target.className += "-Hover";
		
		TweenInit();
	};
	
	function HeaderLeave(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		var index = GetHeaderIndex(e.target.id);
		RemoveEvent(e.target, "mouseout", HeaderLeave);
		
		ActiveFlyout = -1;
		e.target.className = e.target.className.replace("-Hover", "");

		TweenInit();
	};
	
	function HeaderClick(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		var index = GetHeaderIndex(e.target.id);
		if (Headers[index].LinkTo) location.href = Headers[index].LinkTo;
	};
	
	function SubHover(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		var index = GetSubLinkIndex(e.target.id);
		ActiveFlyout = SubLinks[index].Flyout;
		
		AddEvent(e.target, "mouseout", SubLeave);
		e.target.className += "-Hover";
		
		TweenInit();
	};
	
	function SubLeave(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		ActiveFlyout = -1;
		
		RemoveEvent(e.target, "mouseout", SubLeave)
		e.target.className = e.target.className.replace("-Hover", "");
		
		TweenInit();
	};
	
	function SubClick(e) {
		e = e ? e : event;
		if (!e.target) e.target = e.srcElement;
		
		var index = GetSubLinkIndex(e.target.id);
		location.href = SubLinks[index].LinkTo;
	};
	
	function TweenInit() {
		height = new Array();
		step = new Array();
		
		for (var x = 0; x < HeaderCount; x++) {
			if (Flyouts[x]) {
				if (x == ActiveFlyout) {
					//var resetheight = Flyouts[x].offsetHeight;
					//Flyouts[x].style.visibility = "hidden";
					//Flyouts[x].style.height = "auto";
					height[x] = FlyoutHeights[x];
					//Flyouts[x].style.height = resetheight + "px";
					//Flyouts[x].visibility = "visible";
					step[x] = Math.floor((height[x] - Flyouts[x].offsetHeight) / 12);
					if (step[x] < 1) step[x] = 1;
				} else {
					height[x] = 0;
					step[x] = Math.floor(Flyouts[x].offsetHeight / 12) * -1;
					if (step[x] > -1) step[x] = -1;
				}
			}
		}
		
		if (timer) window.clearInterval(timer);
		timer = window.setInterval(function() { Tween(); }, 10);
	};
	
	function Tween() {
		var stopcount = 0;
		
		for (var x = 0; x < HeaderCount; x++) {
			if (Flyouts[x]) {
				if (Flyouts[x].offsetHeight + step[x] > 0 && Flyouts[x].offsetHeight + step[x] < FlyoutHeights[x]) {
					Flyouts[x].style.height = (Flyouts[x].offsetHeight + step[x]) + "px";
				} else {
					Flyouts[x].style.height = height[x] + "px";
					stopcount++;
				}
			} else {
				stopcount++;
			}
		}
		if (stopcount >= HeaderCount) window.clearInterval(timer);
	};
	
	init();
};