wordListSpeed = '700';
showAutocomplete = null;

//  Returns the caret (cursor) position of the specified text field. Required to allow multiple word replace selection

function doGetCaretPosition (oField) {
	// Initialize
	var iCaretPos = 0;

	// IE Support
	if (document.selection) {
		// Set focus on the element
		oField.focus ();
		// To get cursor position, get empty selection range
		var oSel = document.selection.createRange ();
		// Move selection start to 0 position
		oSel.moveStart ('character', -oField.value.length);
		// The caret position is selection length
		iCaretPos = oSel.text.length;
		// Firefox support
	} else if (oField.selectionStart || oField.selectionStart == '0') {
		iCaretPos = oField.selectionStart;
	}
		// Return results
		return (iCaretPos);
}

//  Sets the caret (cursor) position of the specified text field.

function doSetCaretPosition (oField, iCaretPos) {
	// IE Support
	if (document.selection) { 
		// Set focus on the element
		oField.focus ();

		// Create empty selection range
		var oSel = document.selection.createRange ();

		// Move selection start and end to 0 position
		oSel.moveStart ('character', -oField.value.length);

		// Move selection start and end to desired position
		oSel.moveStart ('character', iCaretPos);
		oSel.moveEnd ('character', 0);
		oSel.select ();

		// Firefox support
	} else if (oField.selectionStart || oField.selectionStart == '0') {
		oField.selectionStart = iCaretPos;
		oField.selectionEnd = iCaretPos;
		oField.focus ();
	}
}

function addWordList(currentID){

	//Generate some vars for use later
	var re = new RegExp('[.]?[0-9]+[.]?[0-9]*');
	var currentIDNumber = currentID.match(re);
	var currentPosition;
	var ajaxRequest;
	var prefix;
	var suffix;
	var $autocomplete = $('<ul class="autocomplete ' + currentID + '"></ul>').hide().insertAfter('#' + currentID);
	var selectedItem = null;

	//turn off standard browser autocomplete
	$('#'+currentID).attr('autocomplete','off');
	
	//set the selected word or phrase in the wordlist window
	var setSelectedItem = function(item) {
		selectedItem = item;
		if(selectedItem !==null){
			if (selectedItem >= $autocomplete.find('li').length) {
				selectedItem = $autocomplete.find('li').length - 1;
			}
			$autocomplete.find('li').removeClass('selected').eq(selectedItem).addClass('selected');
		} else {
			$(".autocomplete").each(function(){
				$(this).find('li').removeClass('selected');
			});
			return;
		}
	};
	
	var setShowAutocomplete = function(show) {
		mouseMove=0;
		setMouseX=0;
		showAutocomplete = show;
		if(showAutocomplete){
			
			//gather width
			var autoCompleteParent = $('#'+ currentID);
			var autoParentWidth = autoCompleteParent.width();
			var autoParentOffset = autoCompleteParent.offset();
			$autocomplete.show().width(autoParentWidth).css("left",autoParentOffset.left);

		} else {
			$autocomplete.hide();
			return;
		}
		return;
	};
	
	setShowAutocomplete(null);

	var populateSearchField = function() {
		if(selectedItem || selectedItem==0)  {
			var replacementText = $('.selected').text();
			//replace space in word with underscore
			replacementText = replacementText.replace(/ /g,'_');
			if(prefix){
				var replacementText = prefix + replacementText;
				prefix = null;
			}
			if(suffix){
				var replacementText = replacementText + suffix;
				suffix = null;
			}
			searchTextArray[arrayPosition-1] = replacementText;
			var combinedArray = searchTextArray.join(" ");
			$('#' + currentID).val(combinedArray);
			setSelectedItem(null);
			setShowAutocomplete(null);
			$('#' + currentID).removeClass('missingWord');
		}
	};
	
	//monitor key presses
	wordListDelay = null;
	
	//Ajax START	
	var runAjax = function () {
		wordListDelay = setTimeout(function(){
			currentPosition = doGetCaretPosition(document.getElementById(currentID));
			var searchText = $('#' + currentID).val();
			var searchText = searchText.replace(/\.\.\./g, "   ");
			var searchText = searchText.replace(/\//g, " ");
			var searchText = searchText.replace(/---/, "   ");
			searchTextArray = new Array();
			searchTextArray = searchText.split(' ');
			
			if(searchText.length==0 || (searchText && searchText.charAt(currentPosition-1)==' ' && currentPosition==searchText.length)){
				searchData='0';
				arrayPosition = searchTextArray.length;
			} else {
				var arrayChars = 0;
				for ( arrayPosition = 0; arrayChars < currentPosition; arrayPosition++){
					arrayChars += searchTextArray[arrayPosition].length + 1;
				}
				if(arrayChars==currentPosition){
					arrayPosition++;
				}
				searchData = searchTextArray[arrayPosition-1];
			}

			if (searchData===undefined || searchData==''){
				searchData='0';
			}

			if(searchData && searchData.length==1 && (searchData=='"'|searchData=="'"|searchData=='~'|searchData=='('|searchData==')')){

			} else if(searchData && !searchData.match(/\*|\?/)){
				//perform conversion of international characters
				var i=0;
				for (i=0;i<=HighBitChars.length -1;i++) {
					var internatChars = new RegExp(HighBitChars.charAt(i));
					searchData = searchData.replace(internatChars,IndexedChars.charAt(i));
				}

				var internat2 = new Array();
				internat2 = HighBitChar1.split(',');
				var iConv2 = new Array();
				iConv2 = IndexedSwaps.split(',');

				var j=0;
				for (j=0;j<=internat2.length -1;j++) {
					var internatChars2 = new RegExp(internat2[j]);
					searchData = searchData.replace(internatChars2,iConv2[j]);
				}

				searchData = searchData.toLowerCase();
				//test for special characters ",',*,?,~,(,)
				//find ",',~,(,) at start or end of word
				if(searchData.charAt(0)== '"' || searchData.charAt(0)== "'" ||searchData.charAt(0)== '~' ||searchData.charAt(0)== '(' ||searchData.charAt(0)== ')'){
					prefix = searchData.charAt(0);
				} else {
					prefix = null;
				}
				if(searchData.length > 1 && (searchData.charAt(searchData.length-1)== '"' || searchData.charAt(searchData.length-1)== "'" ||searchData.charAt(searchData.length-1)== '~' ||searchData.charAt(searchData.length-1)== '(' ||searchData.charAt(searchData.length-1)== ')')){
					suffix = searchData.charAt(searchData.length-1);
				} else {
					suffix = null;
				}
				//strip out ",',*,?,~,(,) for word list generation
				searchData = searchData.replace(/\*|\?|\"|\'|\(|\)|~/g, "");
				searchData = searchData.replace(/_/g, " ");

				//field specific search terms
				if(currentIDNumber > 0){
					currentField = "#Fields" + currentIDNumber;
					currentFieldValue = $(currentField).val();
					if(currentFieldValue!=''){
						searchDataWithStem = $(currentField).val() + searchData;
					} else {
						searchDataWithStem = "@" + searchData;
					}
				} else {
					searchDataWithStem = "@" + searchData;
				}
				
				ajaxRequest = $.ajax({
					'url': 'getwordlist',
					'data': {'word': searchDataWithStem, 'window':wordsDisplayed},
					'dataType': 'json',
					'type': 'GET',
					'success': function(data) {
						if (data.result && data.result===true && data.wordlist!='') {
							$autocomplete.empty();
							var failedMatches = '0';
							$.each(data.wordlist, function(index, term) {
								var qTest = term.indexOf(searchData);
								if(qTest == 0){  
									var sKeyQuery = term.substr(0, searchData.length);
									var sKeyRemainder = term.substr(searchData.length);
									var aMarkup = ["<span style='font-weight:bold'>",
										searchData,
										"</span>",
										sKeyRemainder];
									var formattedTerm =  aMarkup.join("");
								} else {
									var formattedTerm = term;
									failedMatches++;
								}
								if(WordListSpelling==1 && wordsDisplayed==failedMatches){
									$('#' + currentID).addClass('missingWord');
								} else {
									$('#' + currentID).removeClass('missingWord');
								}
							
								$('<li></li>').html(formattedTerm).appendTo($autocomplete).mouseover(function() {
									//IE6 can activate the mouse over and the mousemove event even if the mouse does not move
									//following code tests the position of the mouse to make sure someone has moved the mouse
									//to select from the word list
									if(isIE6){
										if(mouseMove==1){
										setSelectedItem(index);
										}
									} else {
										setSelectedItem(index);
									}
								}).mousedown(function(){
									setTimeout(function(){
										if(mouseMove==0){
											setSelectedItem(index);
										}
										populateSearchField();
										var endPosition = $('#' + currentID).val().length;
										doSetCaretPosition(document.getElementById(currentID), endPosition);
									},100);
								}).mousemove(function(e){
									if(setMouseX==0){
										setMouseX = e.pageX;
										setMouseY = e.pageY;
									}
									if(setMouseX!=e.pageX || setMouseY!=e.pageY){
										mouseMove=1;
									}
								});
	
							});
							setSelectedItem(null);
							setShowAutocomplete(1);
						} else {
							if(data.result===false){
								$(".error").html(data.message);
							}
							setSelectedItem(null);
							setShowAutocomplete(null);
						}
					}
				});
				
			} else {
				setSelectedItem(null);
				setShowAutocomplete(null);
			}

			wordListDelay = null;
		},timeDelay);
	}
	//Ajax END
	
	$('#' + currentID).attr('autocomplete', 'off').keypress(function(event) {
		if ((event.which > 38 && event.which!=46) || event.which==34){
			//keyCode 46 delete
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			timeDelay = wordListSpeed;
			runAjax();
		}
		if (event.which == 13 && selectedItem !== null) {
			// User pressed enter key.
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			populateSearchField();
			setShowAutocomplete(null);
			event.preventDefault();
		}
		if (event.which == 13 && selectedItem === null) {
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			setShowAutocomplete(null);
		}

	}).keydown(function(eventDown){
		//keydown is required as keypress does not find the following events
		if(eventDown.keyCode==40) {
			//eventDown.preventDefault();
			//down arrow
			if(wordListDelay!==null){
				clearTimeout(wordListDelay);
				timeDelay = 1
				runAjax();
			} else if(!showAutocomplete) {
				timeDelay = 1
				runAjax();
			}
			if(selectedItem!==null){
				setSelectedItem(selectedItem + 1);
			} else {
				setSelectedItem(0);
			}
		}
		if (eventDown.keyCode == 38) {
			// Up arrow.
			if(selectedItem!==null && selectedItem < 1){
				setSelectedItem(0);
			} else if(selectedItem!==null){
				setSelectedItem(selectedItem - 1);
			}
		}
		if(eventDown.keyCode == 8 || eventDown.keyCode==46){
			//keycode 8 backspace keycode 46 delete
			$('#' + currentID).removeClass('missingWord');
			if (ajaxRequest) ajaxRequest.abort();
			//setShowAutocomplete(null);
			clearTimeout(wordListDelay);
			timeDelay = wordListSpeed;
			runAjax();
		}
		if (eventDown.keyCode==27){
			//escape
			eventDown.preventDefault();
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			if(showAutocomplete){
				setSelectedItem(null);
				setShowAutocomplete(null);
				backUrl = null;
			} else {
				var backUrl = $('.backbtn').find('a').attr('href');
				if(backUrl){
					document.location = backUrl;
				}
			}
		}
		if (eventDown.keyCode==9){
			//tab
			//eventDown.preventDefault();
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			if(showAutocomplete){
				setSelectedItem(null);
				setShowAutocomplete(null);
				backUrl = null;
			}
		}
		//When IE is inside Heritage it is sometimes refusing to perform the default action, this code is to force this behaviour
		if (eventDown.keyCode==13){
			//Enter
			//eventDown.preventDefault();
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			if(!showAutocomplete){
				var formID = $(this).parents('form:first').submit();
			}
		}
	}).keyup(function(eventUp){
		if(eventUp.keyCode == 32){
			//spacebar -- close wordlist
			if (ajaxRequest) ajaxRequest.abort();
			clearTimeout(wordListDelay);
			setSelectedItem(null);
			setShowAutocomplete(null);
			
		}
	}).blur(function(){
		setTimeout(function(){
			setSelectedItem(null);
			setShowAutocomplete(null);
		}, 250);
	});
}

$(document).ready(function() {
	var IsAdvancedSearch = $.cookie('IsAdvancedSearch');
	WordListContext = 'gen';
	if(IsAdvancedSearch){
		WordListContext = 'adv';
	}

	if(WordListContext=='gen'){
		var currentID = $('#sw_input').attr('id');
		if(IsWordList && currentID){
			addWordList(currentID);
		} else {
			return;
		}
	}
});
