var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

BrowserDetect.init();
browser = BrowserDetect.browser;

/**
 * Ajax dropdown 1.0
 * 
 * @author Lee Johnson <lee@kumadigital.com>
 */

function Dropdown() {
	// unique id of this dropdown
	this.id = null;
	
	// text
	this.selectedText  = null;
	this.selectedValue = null;
	this.lastText = '';
	this.lastRequest;
	this.searchTermField;
	this.searchList;
	this.searchUrl;
	this.lastSelectedIndex = -1;
	this.focused = false;
	this.enabled = true;
	
	this.init = function(params)
	{
		this.id = params.id;
		this.searchTermField = params.searchTermField;
		this.searchUrl = params.searchUrl;
		this.createListHtml();
	
		var _this = this;
				
		$(this.searchTermField).keyup(function(e) {
			_this.keyHandlerField(e.keyCode);
		});
		
		$(this.searchList).keyup(function(e) {
			_this.keyHandlerSelect(e.keyCode);
		});		
	}
	
	this.keyHandlerField = function(keyCode) {
		switch(keyCode) {
			case 40: // Down Arrow
				this.setListFocus();
				break;
			case 9999:
				this.search();
				break;
			default:
				if( this.enabled )
				{
				this.search();
				break;
				} else {

				break;	
				}
		}
	}

	this.keyHandlerSelect = function(keyCode) {
		switch(keyCode) {
			case 38: // Up Arrow
				if (this.lastSelectedIndex == 0 && this.searchList.selectedIndex  == 0) {
					this.setFieldFocus();
				} 
				this.lastSelectedIndex = this.searchList.selectedIndex;
				break;
			case 40: // Down Arrow
				this.lastSelectedIndex = this.searchList.selectedIndex;
				break;
			case 13: // Enter key
				this.selectItem();
				break;
		}
	}

	this.setListFocus = function() {
		$(this.searchList).focus();
	}

	this.setFieldFocus = function() {
		$(this.searchTermField).focus();
	}
	
	this.clear = function() {
		this.selectHtml = "";	
	}
	
	this.createListHtml = function() {
		// create list
		selectHtml  = "<select size='5' id='searchList" + this.id + "' name='searchList" + this.id + "' style='position: absolute; display: none;z-index: 100;'>";
		selectHtml += "</select>";
		$(selectHtml).appendTo("body");
		this.searchList = $('#searchList' + this.id)[0];
		
		// attach click event to list
		var _this = this;				
		$(this.searchList).click( function() { _this.selectItem(); } );
		
		// browser difference offsets
		if (browser == "Firefox") {
			hei = 22;
			wid = 4;
			left = 0;
		} else if(browser == "Safari") {
			hei = 30;
			wid = 6;
			left = 0;
		} else if (browser == "Explorer") {
			hei = 20;
			wid = 10;
			left = -2;
		}

		$(this.searchList).css(
						{
							left:  $(this.searchTermField).offset().left + left, 
						 	top:   $(this.searchTermField).offset().top + hei,
						 	width: $(this.searchTermField).width() + wid,
						 	borderWidth: $(this.searchTermField).css.borderWidth,
						 	borderColor: $(this.searchTermField).css.borderColor,
						 	color: $(this.searchTermField).css.color
						});
	}
				
	this.selectItem = function()
	{
		this.selectedValue = this.searchList.value;
		this.selectedText  = this.searchList.options[this.searchList.selectedIndex].text;
		this.searchTermField.value = this.selectedText;
		this.setFieldFocus();
		this.hideSelect();		
	}
	
	this.hideSelect = function()
	{ 
		this.searchList.style.display = "none";
	}
	
	this.showSelect = function()
	{
		this.searchList.style.display = "block";
	}
	
	this.doAjaxSearch = function()
	{
		var _this = this;
		
		// Abort previous request
		if (_this.lastRequest) 
			_this.lastRequest.abort();
		
		// Reset previous request
		_this.lastRequest = $.ajax({
		   type: "POST",
		   url: _this.searchUrl,
		   data: "searchTerm=" + _this.searchTermField.value,
		   dataType: "json",
		   error: function(xhr,err,e) {
		   		// TODO: Handle Error
		   },
		   success: function(response) {
				if (response.matches.length > 0) {
					_this.refreshList(response.matches);
					_this.showSelect();
				} else {
					_this.hideSelect();
				}
		   }
		 });
		
	}
	
	this.refreshList = function(listItems)
	{
		$(this.searchList).empty();
		var _this = this;
		$(listItems).each(function() {
			var newIndex = _this.searchList.length;
			_this.searchList.options[newIndex] = new Option(this.name); 
			_this.searchList.options[newIndex].value = this.id;

		});
	}
	
	this.search = function()
	{
		if (this.searchTermField.value) {
			if (this.searchTermField.value != this.lastText) {
				this.doAjaxSearch();
				this.lastText = this.searchTermField.value;
			}
		} else {
			$(this.searchList).empty();
			this.hideSelect();
		}
		
		// reset previously selected value
		this.selectedValue = '';
	}
}

