framework.widget.suggest = {
init:function(elementId, listArray, functionName, defaultText)
{
	if (!framework.util.isType(elementId, framework.DataType.STRING) ||
	    !framework.util.isType(defaultText, framework.DataType.STRING) ||
		!framework.util.isType(listArray, framework.DataType.ARRAY) ||
		!framework.util.isType(functionName, framework.DataType.FUNCTION))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var element = document.getElementById(elementId);
	if (framework.util.isUndefinedOrNull(element))
	{
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	element._suggestAlways = element.getAttribute("suggestAlways") == "true" ? true : false;
	if (listArray.length>0 || element._suggestAlways === true){	
		framework.eventmodel.addElementEvent(elementId, framework.EventType.KEYDOWN, framework.widget.suggest._suggestOnKeyDownEventHandler);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.KEYUP, framework.widget.suggest._search);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.CLICK, framework.widget.suggest._textBoxOnClickEventHandler);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOff);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.BLUR, framework.widget.suggest._suggestTextBoxOnBlurEventHandler);
	}
	var lookupButtonId = elementId + "._LookupButton";		
	if (listArray.length>0 || element._suggestAlways === true){
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.CLICK, framework.widget.suggest._search);
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOn);
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.BLUR, framework.widget.suggest._setFocusIdOff);
		framework.widget.suggest._listArray[elementId] = listArray;
		element.value = defaultText;
		framework.util.setElementVisible(lookupButtonId, true);
	} else {
		element.value = "";
		framework.util.setElementVisible(lookupButtonId, false);
	}
	framework.widget.suggest._functionName[elementId] = functionName;
	framework.widget.suggest._defaultText[elementId] = defaultText;
	return framework.Status.SUCCESS;
},
updateListArray:function(elementId, listArray)
{
	if (!framework.util.isType(elementId, framework.DataType.STRING) ||
		!framework.util.isType(listArray, framework.DataType.ARRAY))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	framework.widget.suggest._listArray[elementId] = listArray;
	var lookupButtonId = elementId + "._LookupButton";		
	var element = document.getElementById(elementId);
	if (listArray.length>0 || element._suggestAlways === true){	
		framework.eventmodel.addElementEvent(elementId, framework.EventType.KEYDOWN, framework.widget.suggest._suggestOnKeyDownEventHandler);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.KEYUP, framework.widget.suggest._search);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOff);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.BLUR, framework.widget.suggest._suggestTextBoxOnBlurEventHandler);
		framework.eventmodel.addElementEvent(elementId, framework.EventType.CLICK, framework.widget.suggest._textBoxOnClickEventHandler);
		if (element.value === "" && !framework.util.isUndefinedOrNull(framework.widget.suggest._defaultText[elementId]))
		{
			element.value = framework.widget.suggest._defaultText[elementId];
		}
		framework.util.setElementVisible(lookupButtonId, true);
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.CLICK, framework.widget.suggest._search);
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOn);
		framework.eventmodel.addElementEvent(lookupButtonId, framework.EventType.BLUR, framework.widget.suggest._setFocusIdOff);
	}
	else
	{
		framework.eventmodel.removeElementEvent(elementId, framework.EventType.KEYDOWN, framework.widget.suggest._suggestOnKeyDownEventHandler);
		framework.eventmodel.removeElementEvent(elementId, framework.EventType.KEYUP, framework.widget.suggest._search);
		framework.eventmodel.removeElementEvent(elementId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOff);
		framework.eventmodel.removeElementEvent(elementId, framework.EventType.BLUR, framework.widget.suggest._suggestTextBoxOnBlurEventHandler);
		framework.eventmodel.removeElementEvent(elementId, framework.EventType.CLICK, framework.widget.suggest._textBoxOnClickEventHandler);
		if (element.value == framework.widget.suggest._defaultText[elementId])
		{
			element.value = "";
		}
		framework.util.setElementVisible(lookupButtonId, false);
	}
	return framework.Status.SUCCESS;
},
listEntry:function(key, name) 
{
	if (!framework.util.isType(key, framework.DataType.STRING) ||
		!framework.util.isType(name, framework.DataType.STRING))
	{
		return framework.Status.UNDEFINED_ARGUMENT;
	}
    this.key = key;
	this.name = name;
	return framework.Status.SUCCESS;
},
listEntryFF:function(key, name) 
{
	this.key = key;
	this.name = name;
	return framework.Status.SUCCESS;
},
_clickedopen:false,
_holdTextElementId:"",
_holdFunctionName:"",
_holdFocusId:"",
_listArray:new Array(),
_functionName:new Array(),
_defaultText:new Array(),
_setFocusIdOff:function()
{
	framework.widget.suggest._holdFocusId = "";
	return framework.Status.SUCCESS;
},
_setFocusIdOn:function()
{
	framework.widget.suggest._holdFocusId = "on";
	return framework.Status.SUCCESS;
},
_textBoxOnClickEventHandler:function()
{
	var element = document.getElementById(this.id);
	if (element.value == framework.widget.suggest._defaultText[this.id])
	{
		element.value = "";
	}
	framework.widget.suggest._clickedopen = false;
	return framework.Status.SUCCESS;
},
_suggestOnKeyDownEventHandler:function(event)
{
	if (framework.util.isUndefinedOrNull(event.keyCode))
	{
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	else
	{
		if (event.keyCode == framework.KeyCode.KEY_TAB)
		{
			framework.util.hideElement(this.id + "._Dropdown");
		}
		else if (event.keyCode == framework.KeyCode.KEY_DOWN_ARROW || event.keyCode == framework.KeyCode.KEY_UP_ARROW)
		{
			framework.widget.suggest._setFocusIdOn();
		}
	}
	return framework.Status.SUCCESS;
},
_suggestTextBoxOnBlurEventHandler:function(event)
{
	var element = document.getElementById(this.id);
	if (framework.util.isEmpty(element.value))
	{
		element.value = framework.widget.suggest._defaultText[this.id];
	}
	if (framework.util.isEmpty(framework.widget.suggest._holdFocusId))
	{
		framework.util.hideElement(this.id + "._Dropdown");
	}
	return framework.Status.SUCCESS;
},
_suggestSelectOnBlurEventHandler:function()
{
	var innerid = this.id;
	var index = this.id.indexOf("._InputSelect");
	if (index > -1)
	{ 
		innerid = this.id.substr(0, index);
	}
	if (framework.util.isEmpty(framework.widget.suggest._holdFocusId))
	{
		framework.util.hideElement(innerid + "._Dropdown");
	}
	var element = document.getElementById(innerid);
	if (framework.util.isEmpty(element.value))
	{
		element.value = framework.widget.suggest._defaultText[innerid];
	}
	return framework.Status.SUCCESS;
},
_search:function(event)
{
	var fromclick = false;
	if (framework.widget.suggest._getKeyCodeFromEvent(event) == framework.KeyCode.KEY_NONE)
	{
		fromclick = true;
	}
	var innerid = this.id;
	var index = this.id.indexOf("._LookupButton");
	if (index > -1)
	{
		innerid = this.id.substr(0, index);
	}
	framework.widget.suggest._searchText(event, fromclick, innerid, framework.widget.suggest._listArray[innerid], framework.widget.suggest._functionName[innerid]);
	return framework.Status.SUCCESS;
},
_searchText:function(event,fromClick, textElementId, listArray, functionName) 
{
	if (!framework.util.isType(fromClick, framework.DataType.BOOLEAN) ||
		!framework.util.isType(textElementId, framework.DataType.STRING) ||
		!framework.util.isType(listArray, framework.DataType.ARRAY) ||
		!framework.util.isType(functionName, framework.DataType.FUNCTION))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var dropdownId = textElementId + "._Dropdown";
	var keyCode = framework.widget.suggest._getKeyCodeFromEvent(event);
	if (keyCode == framework.KeyCode.KEY_ESCAPE || keyCode == framework.KeyCode.KEY_TAB)
	{
    	framework.util.hideElement(dropdownId);
		framework.widget.suggest._clickedopen = false;
		return true;
  	}
	framework.widget.suggest._holdTextElementId = textElementId;
	framework.widget.suggest._holdFunctionName = functionName;
	if (framework.widget.suggest._clickedopen && fromClick) 
	{
		framework.util.hideElement(dropdownId);
		framework.widget.suggest._clickedopen = false;
	}
	else
	{
		var textElement = document.getElementById(textElementId);
		var capturedtext = textElement.value;
		textElement._listSize = parseInt(textElement.getAttribute("listSize"));
		if (framework.util.isUndefinedOrNull(capturedtext))
		{
			
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
		var capturedTextLowerCase = capturedtext.toLowerCase();
		var innerdiv = document.getElementById(dropdownId);
		if (framework.util.isUndefinedOrNull(innerdiv))
		{
			
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
		var html = new Array;
		var results = 0;
		var listsize = 0;
		var first = true;
		var item = "";
		var capturedTextIndex = -1;
		var htmlString = "";
		framework.widget.suggest._clickedopen = true;
		for (var i = 0; i < listArray.length; i += 1) 
		{
			item = listArray[i].name.toLowerCase();
			capturedTextIndex = item.indexOf(capturedTextLowerCase);
			if (capturedTextIndex === 0 ||
				item.indexOf(" " + capturedTextLowerCase) > -1 ||
				fromClick ||
				(keyCode == framework.KeyCode.KEY_DOWN_ARROW && capturedTextIndex === 0))
			{
				if (first)
				{
					html.push("<option value=\"");
					html.push(listArray[i].key);
					html.push("\" selected>");
					html.push(listArray[i].name);
					html.push("</option>");
					first = false;
				}
				else
				{
					html.push("<option value=\"");
					html.push(listArray[i].key);
					html.push("\">");
					html.push(listArray[i].name);
					html.push("</option>");
				}
				results += 1;
			}			
		}
		htmlString = html.join("");
		listsize = results;
		if (listsize > textElement._listSize)
		{
			listsize = textElement._listSize;
		}
		var inputSelectId = textElementId + "._InputSelect";
		var elementWidth = textElement.clientWidth > textElement.innerWidth? textElement.clientWidth:textElement.innerWidth;
		var innerHTML = "<select id=\"" + inputSelectId + "\"" +
			" name=\"" + inputSelectId + "\"" +
			" size=\"" + listsize + "\"" +
			" style=\"width:" +
			(elementWidth + 4) + 
			"px\">" +
			htmlString + "</select>";
		innerdiv.innerHTML = innerHTML;
		framework.util.showElement(dropdownId);
		if (results === 0) 
		{
			framework.util.hideElement(inputSelectId);
			framework.widget.suggest._clickedopen = false;
		}
		else
		{
			if (keyCode == framework.KeyCode.KEY_DOWN_ARROW || keyCode == framework.KeyCode.KEY_UP_ARROW || keyCode == framework.KeyCode.KEY_NONE) 
			{  
			    framework.util.showElement(dropdownId);  
			    document.getElementById(inputSelectId).focus();				
	    	}
			if (keyCode == framework.KeyCode.KEY_ENTER) 
			{
				try
				{
					eval("framework.widget.suggest._populateElement()");
				}
				catch (e)
				{
				}
	  		}
		}
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.KEYDOWN, framework.widget.suggest._populateNameKeyPress);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.CLICK, framework.widget.suggest._populateElement);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.BLUR, framework.widget.suggest._setFocusIdOff);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.BLUR, framework.widget.suggest._suggestSelectOnBlurEventHandler);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.FOCUS, framework.widget.suggest._setFocusIdOn);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.MOUSEOVER, framework.widget.suggest._setFocusIdOn);
		framework.eventmodel.addElementEvent(inputSelectId, framework.EventType.MOUSEOUT, framework.widget.suggest._setFocusIdOff);
	}
	return framework.Status.SUCCESS;
},
_populateElement:function(event)
{
	var inputSelectElement = document.getElementById(framework.widget.suggest._holdTextElementId + "._InputSelect");
	var selectedOption = inputSelectElement.options[inputSelectElement.selectedIndex];
	var selectText = selectedOption.text;
	var selectValue = selectedOption.value;
	framework.widget.suggest._clickedopen = false; 
	document.getElementById(framework.widget.suggest._holdTextElementId).focus();
	framework.util.hideElement(framework.widget.suggest._holdTextElementId + "._Dropdown");
	var myFunction = framework.widget.suggest._holdFunctionName.toString().match(/^\s*function\s+([^\s\(]+)/);
	try
	{
		eval(myFunction[1] + "(\"" + selectValue + "\",\"" + selectText + "\",\"" + framework.widget.suggest._holdTextElementId + "\")");
	}
	catch (e)
	{
	}
	return framework.Status.SUCCESS;
},
_populateNameKeyPress:function(event)
{
	var keyCode = framework.widget.suggest._getKeyCodeFromEvent(event);
	if (keyCode == framework.KeyCode.KEY_ESCAPE || keyCode == framework.KeyCode.KEY_TAB)
	{
		framework.util.hideElement(framework.widget.suggest._holdTextElementId + "._Dropdown");
		framework.widget.suggest._clickedopen = false;
		return framework.Status.SUCCESS;
	}
	else if (keyCode == framework.KeyCode.KEY_ENTER) 
	{
		framework.widget.suggest._populateElement(event);
	}
	event.stopPropagation();
	return framework.Status.SUCCESS;
},
_getKeyCodeFromEvent:function(event)
{
	var keyCode = framework.KeyCode.KEY_NONE;
	try
	{
		if (!framework.util.isUndefinedOrNull(event.keyCode))
		{
			keyCode = event.keyCode;
		}
	}
	catch (e)
	{
	}
	return keyCode;
},
loaded:true
};//Version 3.4
