var byu__showQuickFinder = false;
var byu__scrolling = false;
var byu__dragging = false;

var byu__lowerCaseIndex = new Array();
var byu__quickFinderLayer;
var byu__scrollWindow;
var byu__dragRegion;
var byu__scrollSlider;
var byu__ulList;
var byu__liElements;

var byu__layerHeight;
var byu__drapRegionTop;
var byu__dragRegionUsableHeight;//height of drag region minus height of slider image
var byu__maxTop = 0;
var byu__clipTop = 0;
var byu__mouseY = 0;

var byu__currentlySelectedIndex = -1;
var byu__visibleElements = new Array();

function byu__generateQuickFinderForm()
{
	byu__quickFinderLayer = document.getElementById("QuickFinder");
	byu__ulList = byu__getImmediateChildrenByTagName(byu__quickFinderLayer, 'UL');
	byu__quickFinderLayer.removeChild(byu__ulList[0]);
	
	byu__scrollWindow = document.createElement('div');
	byu__scrollWindow.id = "ScrollWindow";
	byu__scrollWindow.onclick = function(){byu__showQuickFinder=true;};
	byu__scrollWindow.onmouseout = function(){byu__showQuickFinder=false;};
	byu__quickFinderLayer.appendChild(byu__scrollWindow);

	var scrollBar = document.createElement('div');
	scrollBar.id = "ScrollBar";
	byu__scrollWindow.appendChild(scrollBar);

		var upArrow = document.createElement('a');
		upArrow.href = "javascript:;";
		upArrow.className = "scrollUp";
		upArrow.onmousedown = function(){byu__scrollOn('up');};
		upArrow.onmouseup = function(){byu__scrollOff();};
		scrollBar.appendChild(upArrow);

		byu__dragRegion = document.createElement('div');
		byu__dragRegion.id = "DragRegion";
		scrollBar.appendChild(byu__dragRegion);
			
			byu__scrollSlider = document.createElement('div');
			byu__scrollSlider.className = "scrollSlider";
			byu__scrollSlider.onmousedown = function(){byu__dragOn();};
			byu__scrollSlider.onmouseup = function(){byu__dragOff();};
			byu__dragRegion.appendChild(byu__scrollSlider);
		
		var downArrow = document.createElement('a');
		downArrow.href = "javascript:;";
		downArrow.className = "scrollDown";
		
		downArrow.onmousedown = function(){byu__scrollOn('down');};
		downArrow.onmouseup = function(){byu__scrollOff();};
		scrollBar.appendChild(downArrow);

	var noMatchMessage = document.createElement('div');
	noMatchMessage.innerHTML = "<b>No matches found.</b><br /><br />Hit ENTER to search for the word(s) you have typed.";
	noMatchMessage.className = "noMatch";
	byu__scrollWindow.appendChild(noMatchMessage);
	byu__scrollWindow.appendChild(byu__ulList[0]);

	var closeLink = document.createElement('a');
	closeLink.className = "close";
	closeLink.href = "javascript:byu__closeQuickFinder();";
	closeLink.innerHTML = "Close";
	byu__quickFinderLayer.appendChild(closeLink);
};

function byu__initAZIndex()
{
	byu__generateQuickFinderForm();

	document.forms.quickFinderForm.filterString.value = "";

	byu__liElements = byu__getImmediateChildrenByTagName(byu__ulList[0], 'LI');
	byu__currentlySelectedIndex = -1;
	byu__layerHeight = byu__scrollWindow.offsetHeight - 4;

	byu__dragRegionUsableHeight = byu__dragRegion.offsetHeight - byu__scrollSlider.offsetHeight;
	byu__dragRegionTop = byu__dragRegion.offsetTop;
	
	for(var i=0; i<byu__liElements.length; ++i)
	{
		var aElement = byu__getImmediateChildrenByTagName(byu__liElements[i],'A');
		if(aElement.length > 0 && aElement[0].childNodes.length > 0)
		{
			byu__lowerCaseIndex[i] = aElement[0].firstChild.nodeValue.toLowerCase();
		}
		else
		{
			byu__lowerCaseIndex[i] = "";
		}
	}
	byu__quickFinderLayer.style.display = "none";
};
byu__registerOnLoadHandler(byu__initAZIndex);

function byu__resetQuickFinder()
{
	byu__dragging = false;
	byu__currentlySelectedIndex = -1;
	layerOffset = 0;
	byu__visibleElements = new Array();
	byu__scrollSlider.style.top = '0px';
	byu__clipTop = 0;
	byu__ulList[0].style.top = byu__clipTop;
	if(document.getElementById || document.all)
	{
		clipstring = 'rect(' + byu__clipTop + 'px, auto,' + byu__layerHeight + 'px,auto)';
		byu__ulList[0].style.clip = clipstring;
	}
	else if(document.layers)
	{
		byu__ulList[0].style.clip.top = byu__clipTop;
		byu__ulList[0].style.clip.bottom = byu__layerHeight;
	}
};

function byu__dragOn(evt)
{
	byu__mouseY = 0;
	byu__dragging = true;
	document.onmousemove = byu__drag;
	document.onmouseup = byu__dragOff;
};

function byu__dragOff()
{
	byu__dragging = false;
	document.onmousemove = "";
	document.onmouseup = "";
	byu__showQuickFinder = true;
};

function byu__drag(evt)
{
	if(byu__dragging)
	{
		var newMouseY = byu__getMouseY(evt);
		
		if(byu__mouseY == 0)
		{
			byu__mouseY = newMouseY;
			return false;
		}

		byu__scrolling = true;
		byu__scroll((byu__maxTop * (newMouseY - byu__mouseY))/byu__dragRegionUsableHeight);
		byu__scrolling = false;
		byu__mouseY = newMouseY;
	}
	return false;
};

function byu__getMouseY(evt)
{
	if(document.all && event.clientY)
	{
		return event.clientY + (document.documentElement.scrollTop ?
										document.documentElement.scrollTop :
										document.body.scrollTop);
	}
	else if(evt.pageY)
	{
		return evt.pageY;
	}
	else
	{
		return null;
	}
};

function byu__moveScrollSlider()
{
	if(byu__maxTop > 0)
	{
		var newTop = byu__dragRegionUsableHeight * (byu__clipTop / byu__maxTop);
		byu__scrollSlider.style.top = newTop + "px";
	}
};

function byu__makeSelectedVisible(selectedElementIndex)
{
	var selectedElement = byu__liElements[byu__visibleElements[selectedElementIndex]];
	if(selectedElement.offsetTop + selectedElement.offsetHeight > byu__clipTop + byu__layerHeight - 3)
	{
		var scrollIncrement = selectedElement.offsetHeight + 1.4;
		if(byu__visibleElements.length > selectedElementIndex + 1)//get top of next element
		{
			newTop = byu__liElements[byu__visibleElements[selectedElementIndex + 1]].offsetTop - byu__layerHeight;
			scrollIncrement = newTop - byu__clipTop;
		}
		byu__scrolling = true;
		byu__scroll(scrollIncrement);
		byu__scrolling = false;
	}
	else if(selectedElement.offsetTop < byu__clipTop)
	{
		byu__scrolling = true;
		byu__scroll(-1 * (selectedElement.offsetHeight));
		byu__scrolling = false;
	}
};

function byu__scroll(increment)
{
	if(byu__scrolling)
	{
		var newClipTop = byu__clipTop + increment;

		if(newClipTop < 0)//pushed up to high
		{	
			newClipTop = 0;
		}
		if(newClipTop > byu__maxTop)//pushed to low
		{
			newClipTop = byu__maxTop;
		}

		byu__clipTop = newClipTop;
		clipBottom = byu__clipTop + byu__layerHeight;

		if(document.getElementById || document.all)
		{
			clipstring = 'rect(' + byu__clipTop + 'px, auto,' + clipBottom + 'px,auto)';
			byu__ulList[0].style.clip = clipstring;
			byu__ulList[0].style.top = (-1 * byu__clipTop) + "px";
		}
		else if(document.layers)
		{
			byu__ulList[0].style.clip.top = byu__clipTop;
			byu__ulList[0].style.clip.bottom = clipBottom;
			byu__ulList[0].style.top = (-1 * byu__clipTop) + "px";
		}
		byu__moveScrollSlider();
		window.setTimeout("byu__scroll(" + increment + ")",70);
	}
};

function byu__scrollOff()
{
	byu__showQuickFinder = false;
	byu__scrolling = false;
};

function byu__scrollOn(direction)
{
	byu__showQuickFinder = true;
	byu__scrolling = true;

	if(direction == "down")
	{
		byu__scroll(10);
	}
	else if(direction == "up")
	{
		byu__scroll(-10);
	}
};

function byu__adjustSelection(keyCode, filterString)
{
	if(keyCode == 13)//enter key
	{
		if(byu__currentlySelectedIndex >= 0)//take directly to selected link
		{
			var anchor = byu__getImmediateChildrenByTagName(byu__liElements[byu__visibleElements[byu__currentlySelectedIndex]], 'A');
			document.location = anchor[0].href;
		}
		else//perform search on terms
		{
			if(byu__IsDefined("byu__baseSearchURL"))
			{
				document.location = byu__baseSearchURL + filterString;
			}
			else
			{
				document.location = "http://www.google.com/u/BYU?q=" + filterString;
			}
		}
	}
	if (keyCode == 40)//arrow down
	{
		byu__currentlySelectedIndex = byu__currentlySelectedIndex + 1;
		if(byu__currentlySelectedIndex >= byu__visibleElements.length)
		{
			byu__currentlySelectedIndex = byu__visibleElements.length - 1;
		}
		if(byu__currentlySelectedIndex != 0)
		{
			byu__liElements[byu__visibleElements[byu__currentlySelectedIndex - 1]].className = "";
		}
	}
	else if (keyCode == 38)//arrow up
	{
		byu__currentlySelectedIndex = byu__currentlySelectedIndex - 1;
		if(byu__currentlySelectedIndex < -1)
		{
			byu__currentlySelectedIndex = -1;
		}
		byu__liElements[byu__visibleElements[byu__currentlySelectedIndex + 1]].className = "";
	}

	if(byu__currentlySelectedIndex >= 0 && byu__currentlySelectedIndex < byu__visibleElements.length)
	{
		byu__liElements[byu__visibleElements[byu__currentlySelectedIndex]].className = "selected";
		byu__makeSelectedVisible(byu__currentlySelectedIndex);
	}
};

function byu__filterAZIndex(evt, filterString)
{
	var keyCode = document.layers ? evt.which : 
						document.all ? event.keyCode : 
						document.getElementById ? evt.keyCode : 
						0;
	
	if(keyCode != 40 && keyCode != 38 && keyCode != 13)//not an up or down arrow or enter key
	{
		byu__resetQuickFinder();		
		var visibleIndex = 0;

		if(filterString.length > 0)
		{
			byu__quickFinderLayer.style.display = "block";
			byu__quickFinderLayer.className = '';
			filterString = filterString.toLowerCase();

			for(var i=0; i<byu__lowerCaseIndex.length; ++i)
			{
				if(byu__lowerCaseIndex[i].match(filterString))//only select elements that match
				{
					if(byu__liElements[i].className != "")
					{
						byu__liElements[i].className = "";
					}
					byu__visibleElements[visibleIndex] = i;
					visibleIndex = visibleIndex + 1;
				}
				else
				{
					if(byu__liElements[i].className != "hidden")
					{
						byu__liElements[i].className = "hidden";
					}
				}
			}
			if(visibleIndex == 0)
			{
				byu__quickFinderLayer.className = 'noMatch';
			}
			
			byu__maxTop = byu__ulList[0].scrollHeight - 30;
		}
		else
		{
			byu__quickFinderLayer.style.display = "none";
		}
	}
	else
	{
		byu__adjustSelection(keyCode, filterString);
		return false;
	}
	return true;
};

function byu__openQuickFinder(filterString)
{
	if(filterString.length > 0)
	{
		byu__showQuickFinder = true;
		byu__quickFinderLayer.style.display = "block";
	}
};
function byu__closeQuickFinder()
{
	if(!byu__showQuickFinder)
	{
		byu__quickFinderLayer.style.display = "none";
	}
	byu__showQuickFinder = false;
};