	/************************************************************************************************************
	(C) www.dhtmlgoodies.com, April 2006

	This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.

	Terms of use:
	You are free to use this script as long as the copyright message is kept intact. However, you may not
	redistribute, sell or repost it without our permission.

	Thank you!

	www.dhtmlgoodies.com
	Alf Magne Kalleland

	************************************************************************************************************/

	var ajaxBox_offsetX = 0;
	var ajaxBox_offsetY = 0;
	var ajax_list_externalFile = '/4DCGI/TypeAhead';	// Path to external file   //BASIS
	var minimumLettersBeforeLookup = 1;	// Number of letters entered before a lookup is performed.

	var ajax_list_objects = new Array();
	var ajax_list_cachedLists = new Array();
	var ajax_list_activeInput = false;
	var ajax_list_activeItem;
	var ajax_list_optionDivFirstItem = false;
	var ajax_list_currentLetters = new Array();
	var ajax_optionDiv = false;
	var ajax_optionDiv_iframe = false;
	var ajax_list_autoSubmitForm;  //BASIS autosubmit
	var ajax_optionDiv_objWidth = false; //BASIS
	var ajax_optionDiv_objHeightMax = 0; //BASIS
	var ajax_lastFocusObj = false;  //BASIS

	var ajax_list_MSIE = false;
	if(navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Opera')<0)ajax_list_MSIE=true;

	var currentListIndex = 0;

	function ajax_getTopPos(inputObj)
	{

	  var returnValue = inputObj.offsetTop;
	  while((inputObj = inputObj.offsetParent) != null){
	  	returnValue += inputObj.offsetTop;
	  }
	  return returnValue;
	}
	function ajax_list_cancelEvent()
	{
		return false;
	}

	function ajax_getLeftPos(inputObj)
	{
	  var returnValue = inputObj.offsetLeft;
	  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;

	  return returnValue;
	}

	function ajax_option_setValue(e,inputObj)
	{
		if(!inputObj)inputObj=this;
		var tmpValue = inputObj.innerHTML;
		if(ajax_list_MSIE)tmpValue = inputObj.innerText;else tmpValue = inputObj.textContent;
		if(!tmpValue)tmpValue = inputObj.innerHTML;
		ajax_list_activeInput.value = tmpValue;
		if(document.getElementById(ajax_list_activeInput.name + '_hidden'))document.getElementById(ajax_list_activeInput.name + '_hidden').value = inputObj.id;

  		var f1=setTimeout('ajax_list_activeInput.focus()',1);
  		var f2=setTimeout('ajax_list_activeInput.value = ajax_list_activeInput.value',1);

		ajax_options_hide();
		ajax_list_autoSubmitForm.submit()  //BASIS autosubmit

	}

	function ajax_options_hide()
	{
		if(ajax_optionDiv)ajax_optionDiv.style.display='none';
		if(ajax_optionDiv_iframe)ajax_optionDiv_iframe.style.display='none';
	}

	function ajax_options_rollOverActiveItem(item,fromKeyBoard)
	{
		if(ajax_list_activeItem)ajax_list_activeItem.className='optionDiv';
		item.className='optionDivSelected';
		ajax_list_activeItem = item;

		if(fromKeyBoard){
			if(ajax_list_activeItem.offsetTop>ajax_optionDiv.offsetHeight){
				ajax_optionDiv.scrollTop = ajax_list_activeItem.offsetTop - ajax_optionDiv.offsetHeight + ajax_list_activeItem.offsetHeight + 2 ;
			}
			if(ajax_list_activeItem.offsetTop<ajax_optionDiv.scrollTop)
			{
				ajax_optionDiv.scrollTop = 0;
			}
		}
	}

	function ajax_option_list_buildList(letters,paramToExternalFile)
	{

		ajax_optionDiv.innerHTML = '';
		ajax_list_activeItem = false;
		if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length<=1){  //BASIS - note this seems to assume a trailing | in the data, else should be ==1
			ajax_options_hide();
			return;
		}



		ajax_list_optionDivFirstItem = false;
		var optionsAdded = false;
		for(var no=0;no<ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length;no++){
			if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()][no].length==0)continue;
			optionsAdded = true;
			var div = document.createElement('DIV');
			var items = ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()][no].split(/###/gi);

				//BASIS changed following test to kill list if value matches single item non-case-sensitively 
				//     was if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length==1 && ajax_list_activeInput.value == items[0])

			if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length==2 && ajax_list_activeInput.value.toLowerCase() == items[1].toLowerCase()){     
				ajax_options_hide();
				return;
			}

			div.innerHTML = items[1]; //BASIS was the last item - now assume 1st so there must be two items
			if(items.length>2){div.title = items[2]}; //BASIS allows tip as 3rd item
			div.id = items[0];  //note first item of selected can be stored in "..._hidden" var
			div.className='optionDiv';
			div.onmouseover = function(){ ajax_options_rollOverActiveItem(this,false) }
			div.onclick = ajax_option_setValue;
			if(!ajax_list_optionDivFirstItem)ajax_list_optionDivFirstItem = div;
			ajax_optionDiv.appendChild(div);
		}
		if(optionsAdded){
			ajax_optionDiv.style.display='block';
			ajax_option_resize(ajax_list_activeInput); //BASIS if want size to adjust to fit 
			if(ajax_optionDiv_iframe)ajax_optionDiv_iframe.style.display='';
			// ajax_options_rollOverActiveItem(ajax_list_optionDivFirstItem,true);   //BASIS commented this out to prevent auto highlight of first list item
		}

	}

	function ajax_option_list_showContent(ajaxIndex,inputObj,paramToExternalFile,whichIndex)
	{
		if(whichIndex!=currentListIndex)return;
		var letters = inputObj.value;
		var content = ajax_list_objects[ajaxIndex].response;
		var elements = content.split('|');
		ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()] = elements;
		ajax_option_list_buildList(letters,paramToExternalFile);

	}

	function ajax_option_resize(inputObj)
	{
		if(ajax_optionDiv_objWidth){  //BASIS option
			ajax_optionDiv.style.width = inputObj.offsetWidth + 'px';
		}
		if(ajax_optionDiv_objHeightMax!=0){  //BASIS option
			if(ajax_optionDiv_objHeightMax<ajax_optionDiv.scrollHeight) {
				ajax_optionDiv.style.height = ajax_optionDiv_objHeightMax + 'px';
			} else {ajax_optionDiv.style.height = ''}
		}
		ajax_optionDiv.style.top = (ajax_getTopPos(inputObj) + inputObj.offsetHeight + ajaxBox_offsetY) + 'px';
		ajax_optionDiv.style.left = (ajax_getLeftPos(inputObj) + ajaxBox_offsetX) + 'px';
		if(ajax_optionDiv_iframe){
			//if(ajax_optionDiv_objWidth){  //BASIS option
				ajax_optionDiv_iframe.style.width = ajax_optionDiv.clientWidth + 'px';
			//}
			//if(ajax_optionDiv_objHeightMax!=0){  //BASIS option
				ajax_optionDiv_iframe.style.height = ajax_optionDiv.clientHeight + 'px';
			//}
			ajax_optionDiv_iframe.style.left = ajax_optionDiv.style.left;
			ajax_optionDiv_iframe.style.top = ajax_optionDiv.style.top;
		}

	}

	function ajax_showOptions_autosubmit(inputObj,paramToExternalFile,e,f)   //BASIS autosubmit
	{
		ajax_list_autoSubmitForm=f
		minimumLettersBeforeLookup = 1
		ajax_optionDiv_objWidth = false
		if(ajax_optionDiv)ajax_optionDiv.style.width = ''
		ajax_optionDiv_objHeightMax = 0
		if(ajax_optionDiv)ajax_optionDiv.style.height = ''
		ajax_showOptions(inputObj,paramToExternalFile,e)
	}

	function ajax_showOptions_cl(inputObj,paramToExternalFile,e)   //BASIS clist
	{
		ajax_list_autoSubmitForm=''
		minimumLettersBeforeLookup = 0
		ajax_optionDiv_objWidth = true
		ajax_optionDiv_objHeightMax = 150
		ajax_showOptions(inputObj,paramToExternalFile,e)
	}

	function ajax_showOptions(inputObj,paramToExternalFile,e)
	{
		if(e.keyCode==13 || e.keyCode==9)return;
		if((ajax_list_currentLetters[inputObj.name]==inputObj.value) && (e.type!=='focus'))return;   //BASIS add focus test to allow on focus
		if((e.type=='focus')&&(ajax_lastFocusObj == inputObj.name))return;   //BASIS suppress repeated on focus
		if(document.getElementById(ajax_list_activeInput.name + '_hidden'))document.getElementById(ajax_list_activeInput.name + '_hidden').value = '';  //BASIS generically need to clear this field if change criterion after select
		if(!ajax_list_cachedLists[paramToExternalFile])ajax_list_cachedLists[paramToExternalFile] = new Array();
		ajax_lastFocusObj=inputObj.name;  //BASIS used to suppress subsequent on focus
		var valueToUse=((e.type=='focus')?'':inputObj.value);  //BASIS use blank on focus - then use valueToUse below in place of inputObj.value
		ajax_list_currentLetters[inputObj.name] = valueToUse; 
		if(!ajax_optionDiv){
			ajax_optionDiv = document.createElement('DIV');
			ajax_optionDiv.id = 'ajax_listOfOptions';
			document.body.appendChild(ajax_optionDiv);

			if(ajax_list_MSIE){
				ajax_optionDiv_iframe = document.createElement('IFRAME');
				ajax_optionDiv_iframe.border='0';
				ajax_optionDiv_iframe.style.width = ajax_optionDiv.clientWidth + 'px';
				ajax_optionDiv_iframe.style.height = ajax_optionDiv.clientHeight + 'px';
				ajax_optionDiv_iframe.id = 'ajax_listOfOptions_iframe';

				document.body.appendChild(ajax_optionDiv_iframe);
			}

			var allInputs = document.getElementsByTagName('INPUT');
			for(var no=0;no<allInputs.length;no++){
				if(!allInputs[no].onfocus)allInputs[no].onfocus = ajax_options_hide; //BASIS changed test from onkeyup to onfocus so does not kill other onfocus events
			}
			var allSelects = document.getElementsByTagName('SELECT');
			for(var no=0;no<allSelects.length;no++){
				if(!allSelects[no].onfocus)allSelects[no].onfocus = ajax_options_hide; //BASIS added test for existing onfocus
			}

			var oldonkeydown=document.body.onkeydown;
			if(typeof oldonkeydown!='function'){
				document.body.onkeydown=ajax_option_keyNavigation;
			}else{
				document.body.onkeydown=function(){
					oldonkeydown();
				ajax_option_keyNavigation() ;}
			}
			var oldonresize=document.body.onresize;
			if(typeof oldonresize!='function'){
				document.body.onresize=function() {ajax_option_resize(inputObj); };
			}else{
				document.body.onresize=function(){oldonresize();
				ajax_option_resize(inputObj) ;}
			}

		}

		if((inputObj.value.length<minimumLettersBeforeLookup) && (e.type!=='focus')){
			ajax_options_hide();
			return;
		}

		//inputObj.onblur= ajax_options_hide; //BASIS tried for more reliable hiding e.g. click in address bar; also only kills this object's onblur handler - but acts before next event and so kills the setvalue!

/* BASIS following chunk was same as resize
		ajax_optionDiv.style.top = (ajax_getTopPos(inputObj) + inputObj.offsetHeight + ajaxBox_offsetY) + 'px';
		ajax_optionDiv.style.left = (ajax_getLeftPos(inputObj) + ajaxBox_offsetX) + 'px';
		if(ajax_optionDiv_objWidth){  //BASIS option
			if(ajax_optionDiv.offsetWidth< inputObj.scrollWidth) {
				ajax_optionDiv.style.width = inputObj.offsetWidth;
			}
		}
		if(ajax_optionDiv_objHeightMax!=0){  //BASIS option
			if(ajax_optionDiv_objHeightMax<ajax_optionDiv.scrollHeight) {
				ajax_optionDiv.style.height = ajax_optionDiv_objHeightMax
			} else {ajax_optionDiv.style.height = ''}
		}
		if(ajax_optionDiv_iframe){
			ajax_optionDiv_iframe.style.left = ajax_optionDiv.style.left;
			ajax_optionDiv_iframe.style.top = ajax_optionDiv.style.top;
			if(ajax_optionDiv_objWidth){  //BASIS option
				ajax_optionDiv_iframe.style.width = ajax_optionDiv.style.width;
			}
			if(ajax_optionDiv_objHeightMax!=0){  //BASIS option
				ajax_optionDiv_iframe.style.height = ajax_optionDiv.style.height;
			}
		}
*/

		ajax_option_resize(inputObj);  //BASIS replaces above for simplicity

		ajax_list_activeInput = inputObj;
		ajax_optionDiv.onselectstart =  ajax_list_cancelEvent;
		currentListIndex++;
		if(ajax_list_cachedLists[paramToExternalFile][valueToUse.toLowerCase()]){
			ajax_option_list_buildList(valueToUse,paramToExternalFile,currentListIndex);
		}else{
			var tmpIndex=currentListIndex/1;
			ajax_optionDiv.innerHTML = '';
			var ajaxIndex = ajax_list_objects.length;
			ajax_list_objects[ajaxIndex] = new sack();
			
			var url = ajax_list_externalFile + '?' + 'option=' + paramToExternalFile + '&letters=' + valueToUse.replace(" ","+");   //BASIS
			ajax_list_objects[ajaxIndex].requestFile = url;	// Specifying which file to get
			ajax_list_objects[ajaxIndex].onCompletion = function(){ ajax_option_list_showContent(ajaxIndex,inputObj,paramToExternalFile,tmpIndex); };	// Specify function that will be executed after file has been found
			ajax_list_objects[ajaxIndex].runAJAX();		// Execute AJAX function
		}


	}

	function ajax_option_keyNavigation(e)
	{
		if(document.all)e = event;

		if(!ajax_optionDiv)return;
		if(ajax_optionDiv.style.display=='none')return;

		if(e.keyCode==38){	// Up arrow
			if(!ajax_list_activeItem)return;
			if(ajax_list_activeItem && !ajax_list_activeItem.previousSibling)return;
			ajax_options_rollOverActiveItem(ajax_list_activeItem.previousSibling,true);
		}

		if(e.keyCode==40){	// Down arrow
			if(!ajax_list_activeItem){
				ajax_options_rollOverActiveItem(ajax_list_optionDivFirstItem,true);
			}else{
				if(!ajax_list_activeItem.nextSibling)return;
				ajax_options_rollOverActiveItem(ajax_list_activeItem.nextSibling,true);
			}
		}

		if(e.keyCode==13 || e.keyCode==9){	// Enter key or tab key
			if(ajax_list_activeItem && ajax_list_activeItem.className=='optionDivSelected')ajax_option_setValue(false,ajax_list_activeItem);
			ajax_options_hide();   //BASIS hide if go from one list field to another
			ajax_list_autoSubmitForm.submit()  //BASIS autosubmit
			if(e.keyCode==13)return false; else return true;
		}
		if(e.keyCode==27){	// Escape key
			ajax_options_hide();
		}
	}


	document.documentElement.onclick = autoHideList;

	function autoHideList(e)
	{
		if(document.all)e = event;

		if (e.target) source = e.target;
			else if (e.srcElement) source = e.srcElement;
			if (source.nodeType == 3) // defeat Safari bug
				source = source.parentNode;
		if(source.tagName.toLowerCase()!='input' && source.tagName.toLowerCase()!='textarea')ajax_options_hide();

	}
