// Constants
var AutoMenuOffWidth = 800;
var SideBarObj;
var TabBarOverflowObj;

function SuggestSearchTerms(sender) {
	var str = sender.value;
	var resultsObj = $('SearchSuggestions');
	if (resultsObj) {
	
		resultsObj.set('html','');
		
		if (str.length <= 1) { 
			resultsObj.setStyle('display','none');
			return;
		}
		
		xmlHttp=GetXmlHttpObject();
		
		if (xmlHttp==null) {
			//alert ("Your browser does not support AJAX!");
			return;
		} 
		
		var url = '/Web/SearchSuggest.asp' + BuildQueryString({'q': str, 'sid': Math.random()});
		//url+= '?q=' + str;
		//url+= '&sid=' + Math.random();
		
		xmlHttp.onreadystatechange= function() {
			
			if (xmlHttp.readyState==4) {
				var resultsObj = $('SearchSuggestions');
				resultsObj.set('html','');
				
				var xmlDoc = xmlHttp.responseXML.documentElement;
				var Terms = xmlDoc.getElementsByTagName('term');
				if (Terms.length > 0) {
					var docFragObj = document.createDocumentFragment();
					
					//var newSelectNode = document.createElement("select");
					//newSelectNode 
					
					//var newUl = document.createElement("ul");
					
					for (var i = 0; i < Terms.length && i <= 25; i++) {
						var linkObj = new Element('a', {
							'text': Terms[i].firstChild.nodeValue,
							'href': '#',
							'events': {
								'click': SearchForThis
							}
						});
						docFragObj.appendChild(linkObj);
						
						//window.alert("Adding: " + Terms[i].firstChild.value);
					}
					//resultsObj.innerHTML = "Some example text";
					//newUl.appendChild( docFragObj );
					resultsObj.appendChild( docFragObj );
					resultsObj.style.display = 'block';
				}
			}
			//resultsObj = docFragObj ;
			//resultsObj.innerHTML=xmlHttp.responseText;
		};
		xmlHttp.open('GET',url,true);
		xmlHttp.send(null);
	}
}

function SuggestSearchTerms2(sender) {
	var str = sender.value;
	var resultsObj = $('SearchSuggestions');
	if (resultsObj) {
	
		resultsObj.set('html','');
		//var myFx = new Fx.Tween(resultsObj, {link: 'cancel'});
		//myFx.set('height', '0px');
		//resultsObj.hide();
		
		if (str.length <= 1) { 
		resultsObj.setStyle('display','none');
			return;
		}
		
		var url = "/Web/SearchSuggest.asp";
		url+= "?q=" + str;
		url+= "&sid=" + Math.random();
		
		//, update: 'SearchSuggestions'
		var myHTMLRequest = new Request.HTML({
			url: url,
			async: true,
			onSuccess: function(responseText, responseXML) {
				//console.log(responseXML);
				
				var resultsObj = $('SearchSuggestions');
				resultsObj.set('html','');
				
				//var xmlDoc = responseXML;//.documentElement;
				//var Terms = xmlDoc.getElementsByTagName("term");
				//if (Terms.length > 0) {
					var docFragObj = document.createDocumentFragment();
				//var SearchTerms = responseXML.getElement('term');
				var SearchTerms = responseXML.getElements('term');
				var Terms = SearchTerms[0];
				//console.log(Terms );
				Terms.each( function(termObj) {
					
					
					//var newSelectNode = document.createElement("select");
					//newSelectNode 
					
					//var newUl = document.createElement("ul");
					
					//for (var i = 0; i < Terms.length && i <= 25; i++) {
					
						//console.log(Terms[i]);
						var linkObj = new Element('a', {
							//'text': Terms[i].nodeValue,
							'text': termObj.get('text'),
							'href': '#',
							'events': {
								'click': SearchForThis
							}
						});
						
						
						//var newA = document.createElement("a");
						//var newText = document.createTextNode( Terms[i].firstChild.nodeValue );
						//newA.setAttribute("href", "#");
						
						//AddEvent(newA, "click", SearchForThis);
						
						//newA.appendChild(newText); //append text to new div
						docFragObj.appendChild(linkObj);
						
						//window.alert("Adding: " + Terms[i].firstChild.value);
				});
				//}
					//resultsObj.innerHTML = "Some example text";
					//newUl.appendChild( docFragObj );
					resultsObj.appendChild( docFragObj );
					//resultsObj.show();
					//myFx.start('height', '20em');
					if (Terms.length > 0) {
						resultsObj.setStyle('display','block');
					}
					else {
						resultsObj.setStyle('display','none');
					}
			}
		});
		myHTMLRequest.get();
	}
}

function InitializeLoginState() {
	var objLibLoginStateText = $('LibLoginStateText');
	if (objLibLoginStateText) {
		if (objLibLoginStateText.href) {
			objLibLoginStateText.addEvent('click', function() {
				var objLibLogin = $('LibLogin');
				ToggleBlock(objLibLogin);
				if (objLibLogin.getStyle('display') == 'none') {
					this.removeClass('LibLoginStateTextOn');
					this.addClass('LibLoginStateTextOff');
				}
				else {
					this.removeClass('LibLoginStateTextOff');
					this.addClass('LibLoginStateTextOn');
				}
				return false;
			});
		}
		objLibLoginStateText.addClass('LibLoginStateTextOff');
	}
}

function SearchForThis(ev){
	ev = ev || window.event;
	var sender = ev.srcElement || ev.target;

	var resultsObj = $('SearchSuggestions');
	if (resultsObj) {
		//var me = this;
		$('SearchSiteField').value = sender.get('text');
		resultsObj.setStyle('display','none');
	}
	return false;
}

// Hours for the Sidemenu
function InitializeHours() {
	//window.alert('found an hours row');
	var Calendar = new Date();
	var weekday = Calendar.getDay();
	if ( weekday >= 1 && weekday <= 4) {
		weekday = '';
	}
	var HoursRows = $$('.HoursRow');
	HoursRows.each( function(row) {
		
		if (row.id == 'Hours'+weekday) {
			row.addClass('Active');
		}
		else {
			row.removeClass('InActive');
		}
	});
}

function InitializeSideBarOptions() {
	//		<div id="LibSideBarOptions"><form id="LibSideBarOptionsForm" name="LibSideBarOptionsForm"><div id="LibSideBarOptionsContents">
	//			Menu: 
	//			<label><input type="radio" name="menustate" value="on">On</label>
	//			<label><input type="radio" name="menustate" value="off">Off</label>
	//		</div></form></div>
	if ($('LibSideBar')) {
		var OptionsObj = new Element('div', {id: 'LibSideBarOptions'});
		var OptionsFormObj = new Element('form', {id: 'LibSideBarOptionsForm', name: 'LibSideBarOptionsForm'});
		var OptionsContentsObj = new Element('div', {id: 'LibSideBarOptionsContents', text: 'Menu: '});
		var LabelOnObj = new Element('label');
		var LabelOffObj = new Element('label');
		var InputOnObj = new Element('input', {type: 'radio', id: 'SetMenuOn', name: 'menustate', value: 'on', checked: 'checked'});
		var InputOffObj = new Element('input', {type: 'radio', id: 'SetMenuOff', name: 'menustate', value: 'off'});
		
		var sideBar = $('LibSideBar');
		var myFx = new Fx.Tween(sideBar, {link: 'cancel', unit: 'px'});
		var myFx2 = new Fx.Tween(sideBar, {link: 'cancel', unit: 'ex'});
		if ($('HomepageContent')) {
			var myHCFx = new Fx.Tween($('HomepageContent'), {link: 'cancel', unit: 'px'});
		}
		SideBarObj = new SideBar();
		InputOnObj.addEvent('click', SideBarObj.Show );
		InputOffObj.addEvent('click', SideBarObj.Hide );
		
		LabelOnObj.appendChild(InputOnObj);
		LabelOnObj.appendText('On');
		LabelOffObj.appendChild(InputOffObj);
		LabelOffObj.appendText('Off');
		OptionsContentsObj.appendChild(LabelOnObj);
		OptionsContentsObj.appendChild(LabelOffObj);
		OptionsFormObj.appendChild(OptionsContentsObj);
		OptionsObj.appendChild(OptionsFormObj);
		document.body.appendChild(OptionsObj);
	}
}

function SideBar() {
	this.active = true;
	//var active = this.active;
	
	var sideBarObj = $('LibSideBar');
	var myFx = new Fx.Tween(sideBarObj, {link: 'cancel', unit: 'px', duration: 501});
	//var myFx2 = new Fx.Tween(sideBarObj, {link: 'cancel', unit: 'ex'});
	if ($('HomepageContent')) {
		var myHCFx = new Fx.Tween($('HomepageContent'), {link: 'cancel', unit: 'px', duration: 501});
	}
	//myFx.active = true;
	//window.alert('Initializing the sidebar');
	
	this.Show = function(event) {
		/// Check if this method was fired from a DOM event or internally. Rerout it if it was from a DOM event.
		//if (!(this instanceof SideBarObj)) return SideBarObj.Show();
		if (sideBarObj) {
			//var localFx = sideBarObj.get('tween');
			if (event && event.shift) {
				//window.alert('Shift Key was down');
				//sideBarObj.set('tween', {'duration': 4000});
				//var localFx = sideBarObj.get('tween');
				/// This is SUPPOSED to set the menu to animate slowly if the shift key is held down, but the settings don't seem to be working at ALL! ARG!
				myFx.set('duration', 4000);
				//localFx.setOptions('duration', 4000);
				//window.alert(localFx.get('duration'));
			}
			//console.log(myFx);
			//function Run() {
				//SideBar.setStyle('display', 'block');
				//myFx.start('width', 200);
				myFx.start('margin-left', 0);
				//myFx2.start('margin-right', 0, 5);
				if (myHCFx) {
					myHCFx.start('margin-left', 230);
				}
				var menuOnObj = $('SetMenuOn');
				if (menuOnObj) {
					menuOnObj.checked = true;
				}
				//myFx.active = true;
				this.active = true;
			//}
			
			/*ev = ev || window.event;
			if (ev) {
				var senderObj = ev.target || ev.srcElement;
				if (senderObj) {
					//window.alert('turning the sidebar on');
					if (senderObj && senderObj.checked && SidebarObj.active == false) {
						Run();
					}
				}
				else {
					Run();
				}
			}
			else {
				Run();
			}*/
		}
	};
	this.Hide = function(event) {
		//if (!(this instanceof SideBarObj)) return SideBarObj.Hide();
		if (sideBarObj) {
			if (event && event.shift) {
				//window.alert('Shift Key was down');
				myFx.set('duration', 4000);
			}
			//function Run() {
				 //SideBar.setStyle('display', 'none');
				//myFx.start('width', 0);
				myFx.start('margin-left', -250);
				//myFx2.start('margin-right', 5, 0);
				if (myHCFx) {
					myHCFx.start('margin-left', 0);
				}
				var menuOffObj = $('SetMenuOff');
				if (menuOffObj) {
					menuOffObj.checked = true;
				}
				//myFx.active = false;
				//console.log(this.parent);
				this.active = false;
			//}
			
			/*ev = ev || window.event;
			if (ev) {
				var senderObj = ev.target || ev.srcElement;
				if (senderObj && senderObj.checked && SidebarObj.active == true) {
					Run();
				}
				else {
					Run();
				}
			}
			else {
				Run();
			}*/
		}
	};
	return this;
}

function InitializeTabBarOverflow() {
	
	var overflowObj	= new Element('div', {'id': 'LibTabBarOverflow'});
	var contentsObj	= new Element('div', {'id': 'LibTabBarOverflowContents'});
	var menuObj			= new Element('ul',  {'id': 'LibTabBarOverflowMenu'}); //, 'html': '<li id="FirstID"><a href="somewhere">Somewhere</a></li><li id="SecondID"><a href="somewhereelse">Somewhere Else</a></li>'});
	
	TabBarOverflowObj = new TabBarOverflow({'main': overflowObj, 'menucontainer': contentsObj, 'menu': menuObj});
	
	var chevronObj		= new Element('div', {
		'class': 'Chevron',
		'events': {
			'click': TabBarOverflowObj.ToggleMenu
		}
	});
	
	contentsObj.appendChild(menuObj);
	overflowObj.appendChild(chevronObj);
	overflowObj.appendChild(contentsObj);
	
	$(document.body).appendChild(overflowObj);
}

function TabBarOverflow(Args) {
	//var realthis = this;
	/// Visible refers to wether the whole shebang is visible or not.
	this.visible = false;
	//var visible = false;
	/// Active refers to wether the menu is active or not
	this.active = false;
	//var active = false;
	/// <NYI> Set dependant on wether on not the USER activated the menu
	this.useractivated = false;
	this.itemcount = 0;
	//var useractivated = false;
	
	//this.obj = $('LibTabBarOverflow');
	//this.menu = $('LibTabBarOverflowMenu');
	//this.menucontainer = $('LibTabBarOverflowContents');
	this.obj = Args.main;
	this.menucontainer = Args.menucontainer;
	this.menu = Args.menu;
	
	this.obj.fade('hide');
	this.menucontainer.fade('hide');
	this.obj.set('tween', {duration: 'short'});
	this.menucontainer.set('tween', {duration: 'short'});
	
	
	this.IsVisible			= function() {	return visible;			};
	this.IsActive			= function() {	return active;				};
	this.IsUserActivated	= function() {	return useractivated;	};
	
	
	this.Show = function() {
		this.obj.fade('in');
		var HighlightThis = function() { this.highlight('#ffd') };
		HighlightThis.delay(1000, this.obj);
		//this.obj.highlight('#ddf');
		this.visible = true;
	};
	this.Hide = function() {
		//console.log(this);
		this.obj.fade('out');
		this.visible = false;
	};
	
	
	this.ToggleMenu = function() {
		/// Check if this method was fired from a DOM event or internally. Rerout it if it was from a DOM event.
		if (!(this instanceof TabBarOverflow)) return TabBarOverflowObj.ToggleMenu();
		
		if (this.active) {
			this.Deactivate();
		}
		else {
			this.Activate();
		}
	}
	
	this.Activate = function() {
		this.menucontainer.fade('in');
		this.active = true;
	}
	this.Deactivate = function() {
		this.menucontainer.fade('out');
		this.active = false;
	}
	
	
	this.AddItem = function(id, text, link) {
		var listitemObj = $('Overflow' + id);
		//console.log(listitemObj, id );
		
		if (listitemObj == null) {
			var itemObj = new Element('li', {'id': 'Overflow' + id});
			var linkObj = new Element('a', {'href': link, 'text': text});
			itemObj.grab(linkObj);
			
			this.menu.grab(itemObj, 'top');
			this.itemcount++;
		}
		HighlightThis(itemObj);
		//var HighlightThis = function() { this.highlight('#eee') };
		//HighlightThis.delay(1000, HighlightThis(this.obj) );
	}
	this.DropItem = function(id) {
		var listitemObj = $('Overflow' + id);
		//var itemtodrop = this.menu.getElement('#' + id);
		if (listitemObj) {
			var removeditem = listitemObj.dispose();
			this.itemcount--;
		}
	}
}

function WindowResizeHandler(event) {
	var windowSizeObj = $(window).getSize();
	//window.alert('The window size width is: ' + windowSizeObj.x);
	//window.alert('The sidebar active state: ' + SidebarObj.active);
	
	if (SideBarObj) {
		if (windowSizeObj.x < AutoMenuOffWidth && SideBarObj.active == true) {
			//if (tmpcount <= 1)	{ step = 0; } //else { step = duration; }
			SideBarObj.Hide(event);
		}
		else if (windowSizeObj.x > AutoMenuOffWidth && SideBarObj.active == false) {
			SideBarObj.Show(event);
		}
	}

	var anytabshidden = false;
	var NavTabs = $$('.NavTab');
	NavTabs.reverse();
	NavTabs.each( function(tabObj, index, array) {
		//var tab6Obj = $('NavIndex6');
		//window.status+= tabObj.id + ', ';
		var tabSize = tabObj.getCoordinates();
		tabSize.fromright = windowSizeObj.x - tabSize.right;
		tabSize.frombottom = windowSizeObj.y - tabSize.top + tabSize.height;
		//console.log(tabSize);
		tabSize.isoffscreen = false;
		if (tabSize.fromright < 0 || tabSize.frombottom < 0) {
			tabSize.isoffscreen = true;
			anytabshidden = true;
		}
		
		if (tabSize.isoffscreen) {
			var linkInTabObj = tabObj.getElement('a');
			TabBarOverflowObj.AddItem(tabObj.id, linkInTabObj.get('text'), linkInTabObj.get('href'));
		}
		else {
			TabBarOverflowObj.DropItem(tabObj.id);
		}
	});
	
	if (TabBarOverflowObj.itemcount > 0) {
		TabBarOverflowObj.Show();
	}
	else {
		TabBarOverflowObj.Hide();
	}
	//console.log(tab6Obj.getPosition());
	
}

function KeyPressHandler(event) {
	//ev = window.event || ev;
	//var target = event.srcElement || event.target;
	var tname = event.target.nodeName;
	
	//if (tname == 'HTML' || tname == 'BODY' || tname == 'DIV' || tname == 'P') {
		/// Do nothing, just continue.
		//return true;
	//}
	//else {
	//	return true;
	//}
	
	if (tname == 'INPUT' || tname == 'TEXTAREA' || tname == 'SELECT') {
		/// Don't bother running the function if we are in a form field.
		return true;
	}
	
	
	//window.alert(event.target.nodeName + ' and key is: ' +event.key);
	//window.alert('pressed a key');
	//console.log(event.target.ownerDocument, event.target.parentNode, event.target.tagName, event.target.nodeName, event.target);
	
	//window.alert(event.target == document ? 'target is document' : 'target is '+event.target);
	
	/// Toggle the menu with comma and period
	if (event.key == 'comma') {
		/// go left, deactivate menu.
		SideBarObj.Hide(event);
	}
	if (event.key == 'period') {
		/// go right, activate menu.
		SideBarObj.Show(event);
	}
	
	//window.alert(event.key);
	/// Load an index based on the number key you press
	var numpadkey = event.key.replace(/^numpad /, '');
	var navtabObj = $('NavIndex' + parseInt(numpadkey || event.key) );
	if (navtabObj) {
		var linkhref = navtabObj.getElement('a').href;
		window.location.href = linkhref;
	}
	//var NavTabs = $$('.NavTab');
	//NavTabs.reverse();
	//NavTabs.each( function(tabObj, array, index) {
}

/*** Events ************************************/

window.addEvent('domready', function() {
	InitializeSideBarOptions();
	InitializeTabBarOverflow();
	InitializeLoginState();
	WindowResizeHandler();
	
	InitializeHours();
	
	window.addEvent('resize', WindowResizeHandler);
	
	/// Add aliases to the keycodes for comma and period
	Event.Keys.comma = 188;
	Event.Keys.period = 190;
	for (var i = 0; i <= 9; i++) {
		Event.Keys['numpad '+i] = i + 96;
	}
	
	$(document.body).addEvent('keydown', KeyPressHandler);
	window.addEvent('keydown', KeyPressHandler);
	
	var NavTabs = $$('.NavTab');
	//NavTabs.reverse();
	NavTabs.each( function(tabObj, index, array) {
		tabObj.getElement('a').title+= ' - Keyboard Shortcut: Use [' + (index+1) + '] to activate this index tab.';
	});
	var sidebaroptionsObj = $('LibSideBarOptionsContents')
	if (sidebaroptionsObj) {
		sidebaroptionsObj.title = 'Keyboard Shortcut: Use the < and > keys to toggle the side menu.';
	}
});




