﻿//Version: 1.00, 02/08/2010

var UP = 38;
var DOWN = 40;
var ENTER = 13;
var TAB = 9;
var BACKSPACE = 8;
var SPACE = 32;
var ESC = 27;
var CANC = 46;

var selectedRow = null;
var strDivResultsName;
var strControlName;
var strHiddenName;
var strTableResultsName;

function Suggest(strSuggestID, strAjaxURL, strTableResults, bRequireSelection, strCssClassHighlight, strCssClassDefaultRow, strHelpText, strCSSClassHelpText) {
	this.m_SuggestID = strSuggestID;
	this.m_SuggestTextBox = GetElement(strSuggestID);
	this.m_SuggestHiddenValue = GetElement(strSuggestID + "Value");
	this.m_AjaxURL = strAjaxURL;

	this.m_ToolbarMenu = null;
	this.m_ToolBarMenuName = strSuggestID + "_toolbar";
	this.m_ToolbarMenu = eval(this.m_ToolBarMenuName);
	this.m_ToolbarMenu.SelectedItem = -1;
	this.m_ToolbarMenu.m_Suggest = this;

	this.GetItems = GetItems;
	this.MoveCursorUp = MoveCursorUp;
	this.MoveCursorDown = MoveCursorDown;
	this.ShowSuggest = ShowSuggest;
	this.SelectionControl = SelectionControl;
	this.ModifyText = ModifyText;

	this.ItemClick = ItemClick;

	this.m_word = "";
	this.m_TimerID = null;
	this.m_ShowGranuality = 100;
	this.m_Requireselection = bRequireSelection;
	this.CssClassHighlight = strCssClassHighlight;
	this.CssClassDefaultRow = strCssClassDefaultRow;
	this.HelpText = strHelpText;
	this.CSSClassHelpText = strCSSClassHelpText;

	this.m_SuggestTextBox.setAttribute("autocomplete", "off");

	var objSuggest = this;
	if (this.m_Requireselection)
		RegisterEvent(this.m_SuggestTextBox, 'blur', function () { objSuggest.SelectionControl(); })
	//this.m_SuggestTextBox.onblur = function () { objSuggest.SelectionControl(); }
	this.m_word = this.m_SuggestTextBox.value;
}

function ShowSuggest() {
	this.m_ToolbarMenu.m_MenuItemClicked = null;
	this.m_ToolbarMenu.BuildMenuCallback = BuildMenuCallback;
	this.m_ToolbarMenu.ShowMenu(this.m_SuggestTextBox, this.m_word, true, this.m_AjaxURL);
}

function BuildMenuCallback() {
	//If we have a match make a selection. Do we have a menu?
	if (this.m_SubMenus[0] && this.m_SubMenus[0].element) {
		for (var i = 0; i < this.m_SubMenus[0].element.childNodes.length; ++i) {
			var itemID = this.m_SubMenus[0].element.childNodes[i].id.replace(this.m_MenuID + "_", "").replace("_item", "");
			var strMenuObject = this.m_SubMenus[0].element.childNodes[i];
			var itemName = "";
			//Get the text
			if(strMenuObject.innerText)
				itemName = strMenuObject.innerText;
			else
				itemName = strMenuObject.textContent;
			//Is it the same as the contents of our textbox
			if (this.m_Suggest.m_SuggestTextBox.value.toLowerCase() == itemName.toLowerCase()) {
				this.m_Suggest.ItemClick(itemName, itemID);
				return;
			}
		}
	}
}

function SelectionControl() {
	if (this.m_Requireselection
			&& this.m_SuggestHiddenValue.value == ''
			&& document.activeElement.id != this.m_ToolBarMenuName) {
		this.m_SuggestTextBox.value = '';
		this.m_word = '';
		this.m_SuggestHiddenValue.value = '';
		HelpTextBlur(this.m_SuggestID, this.CSSClassHelpText, this.HelpText)
	}
}

function GetItems(e, tableResults, ObjectID) {
	var keynum
	var keychar
	var numcheck

	if (window.event) // IE
	{
		keynum = e.keyCode
	}
	else if (e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}

	keychar = String.fromCharCode(keynum)

	numcheck = /\d/

	// If the down key is pressed
	if (keynum == DOWN) {
		this.MoveCursorDown();
		return;
	}
	else if (keynum == UP) {
		this.MoveCursorUp();
		return;
	}
	else if (keynum == ENTER || keynum == TAB) {
		if (this.m_ToolbarMenu.SelectedItem > -1) {
			this.m_ToolbarMenu.m_SubMenus[0].element.childNodes[this.m_ToolbarMenu.SelectedItem].onclick();
			this.m_ToolbarMenu.HideAllMenus();
			this.m_ToolbarMenu.SelectedItem = -1;
			// false is returned so that the postback won't occur when the return key is pressed
			return false;
		}
		return true;
	}
	else if (keynum == ESC) {
		this.m_ToolbarMenu.HideAllMenus();
		this.m_ToolbarMenu.SelectedItem = -1;
		return false;
	}

	if ((keynum != DOWN && keynum != UP && keynum >= 65 && keynum <= 90) || (keynum == SPACE) || (keynum == BACKSPACE) || (keynum == CANC)) {
		this.ModifyText(keynum, keychar)
	}

	// Call the server side method

	if (this.m_word != '') {
		clearTimeout(this.m_TimerID);
		var objSuggest = this;
		this.m_TimerID = setTimeout(function () { objSuggest.ShowSuggest(); }, objSuggest.m_ShowGranuality);
	}
	else {
		this.m_ToolbarMenu.HideAllMenus();
		this.m_ToolbarMenu.SelectedItem = -1;
		clearTimeout(this.m_TimerID);
	}
	this.m_SuggestHiddenValue.value = '';
}

function IsFireFox() {
	return (navigator.appName == 'Netscape');
}

function MoveCursorUp() {
	if (this.m_ToolbarMenu.SelectedItem <= 0)
		return;
	this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem - 1;
	if (typeof (this.m_ToolbarMenu.m_SubMenus[0]) != 'undefined') {
		if (this.m_ToolbarMenu.SelectedItem < 0)
			this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem + 1;

		if (this.m_ToolbarMenu.SelectedItem >= 0)
			this.m_ToolbarMenu.m_SubMenus[0].element.childNodes[this.m_ToolbarMenu.SelectedItem + 1].className = this.CssClassDefaultRow;
		this.m_ToolbarMenu.m_SubMenus[0].element.childNodes[this.m_ToolbarMenu.SelectedItem].className = this.CssClassHighlight;
	}
	else {
		this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem + 1;
	}
}

function MoveCursorDown() {
	this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem + 1;
	if (typeof (this.m_ToolbarMenu.m_SubMenus[0]) != 'undefined') {
		if (this.m_ToolbarMenu.SelectedItem >= this.m_ToolbarMenu.m_SubMenus[0].element.childNodes.length)
			this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem - 1;

		if (this.m_ToolbarMenu.SelectedItem > 0)
			this.m_ToolbarMenu.m_SubMenus[0].element.childNodes[this.m_ToolbarMenu.SelectedItem - 1].className = this.CssClassDefaultRow;
		this.m_ToolbarMenu.m_SubMenus[0].element.childNodes[this.m_ToolbarMenu.SelectedItem].className = this.CssClassHighlight;
	}
	else {
		this.m_ToolbarMenu.SelectedItem = this.m_ToolbarMenu.SelectedItem - 1;
	}
}

function ItemClick(itemName, itemID) {
	this.m_SuggestTextBox.value = itemName;
	this.m_SuggestHiddenValue.value = itemID;
	this.m_word = itemName;
	this.m_ToolbarMenu.HideAllMenus();
	this.m_ToolbarMenu.SelectedItem = -1;
	FireEventHandlers(this.m_SuggestTextBox, "focus");
	// false is returned so that the postback won't occur when the return key is pressed
	return false;
}

function ModifyText(keynum, keypress) {
	this.m_word = this.m_SuggestTextBox.value;
}

function HelpTextFocus(strID, strHelpText, strCSSClassHelpText) {
	var objTextBox = GetElement(strID);
	//Are we showwing the help text? Clear it out
	if (strHelpText == objTextBox.value) {
		objTextBox.value = "";
		//Set the CSS class
	}
	objTextBox.className = strCSSClassHelpText;
}

function HelpTextKeyDown(strID, strCSSClass) {
	var objTextBox = GetElement(strID);
}

function HelpTextBlur(strID, strCSSClassHelpText, strHelpText) {
	var objTextBox = GetElement(strID);
	//Are we empty? Show the help text
	if (objTextBox.value == "") {
		objTextBox.value = strHelpText;
		//Set the CSS class
		objTextBox.className = strCSSClassHelpText;
	}
}
