var maxListLength = 10;

var currentPage = 0;
var currentMark = -1;
var hit = false;

var hitDisplay = new Array();
var hitValues = new Array();
var hitInputs = new Array();

var displayString = "";
var inputString = "";
var moveDirection = false;

var userBrowser=navigator.userAgent.toLowerCase();

/*
	Shorthand of document.getElementById
*/
function gebi(target) {
	return document.getElementById(target);
}

/*
	Show the DIV list
*/
function showlist(targetDIV){
	gebi(targetDIV).style.visibility = "visible";
	if (userBrowser.indexOf("msie 5.")!=-1 || userBrowser.indexOf("msie 6.")!=-1){
		gebi("areas").style.visibility = "hidden";
	}
}

/*
	Hide the DIV list
*/
function hidelist(targetDIV){
	gebi(targetDIV).style.visibility = "hidden";
	if (userBrowser.indexOf("msie 5.")!=-1 || userBrowser.indexOf("msie 6.")!=-1){
		gebi("areas").style.visibility = "visible";
	}
}

/*
	Disable enter key in the search field, unless there is data in the search field
*/
function noenter(browserEvent, targetDIV, searchFieldName){
	if (checkKey(browserEvent) == "keyenter") {
		if (gebi("search").value != "" && moveDirection == false) {
			selector(targetDIV,searchFieldName);
			submitForm(true);
		}
  		return false;
	}
}

/*
	Find the compareValue in the StringToSearch
*/
function findValueInString(compareValue, StringToSearch) {
	var result = "";
	var clen = compareValue.length;

	if (clen > 1) {
		var tpos = StringToSearch.toLowerCase().indexOf(compareValue.toLowerCase())

		if (tpos != -1) {
		hit = true;
			result = StringToSearch.substring(0, tpos) + "<b>" + StringToSearch.substring(tpos, tpos+clen) + "</b>" + StringToSearch.substring(tpos+clen, StringToSearch.length);

			return result;
		}
	}

	return false;
}

/*
	Draw the DIV containing the dropdown
*/
function drawDropDownDiv(targetDIV, searchFieldName, prev_page, next_page){
	var contents = "";
	var startitem = currentPage*maxListLength;

	// If currentpage is more than 0, add the link to Previous page
	if (currentPage) {
		contents += '<div onmousedown="currentPage--; drawDropDownDiv(\''+targetDIV+'\',\''+searchFieldName+'\',\''+prev_page+'\',\''+next_page+'\');" onmouseover="pageMove(\'prev\');" id="prevpage"><i><b>' + prev_page + '</b></i></div>';
	}

	// Iterate through all elements (upto maxListLength) and display them
	for (j=startitem; j<hitDisplay.length && j<startitem+maxListLength; j++){
		// The contents contain the following actions:
		// onMouseDown: set the Currentmark and call the selector, if the element contains data
		// the value will be sent to the searchfield

		// onMouseOver: highlight the selected item

		contents += '<div onmousedown="currentMark='+j+'; selector(\''+targetDIV+'\',\''+searchFieldName+'\');" onmouseover="highlightElement('+j+');" id="'+hitValues[j]+'">'+hitDisplay[j]+'</div>';
	}

	// If there are more results than the current list, add a link to Next page
	if (startitem+maxListLength <= hitDisplay.length){
		contents += '<div onmousedown="currentPage++; drawDropDownDiv(\''+targetDIV+'\',\''+searchFieldName+'\',\''+prev_page+'\',\''+next_page+'\');" onmouseover="pageMove(\'next\');" id="nextpage"><i><b>' + next_page + '</b></i></div>';
	}

	gebi(targetDIV).innerHTML = contents;
	moveDirection = false;
	if (hitDisplay.length == 1) {
		currentMark = startitem;
		highlightElement(startitem);
	}
	if (hitDisplay){
		showlist(targetDIV);
	} else {
		hidelist(targetDIV);
	}
}

/*
	Highlight the selected element in the list
*/
function highlightElement(newmark){
	if (typeof(gebi(hitValues[currentMark])) == "object") {
		if (moveDirection == "next") {
			gebi("nextpage").className = "noselection";
			currentMark = newmark;
		} else if(moveDirection == "prev") {
			gebi("prevpage").className = "noselection";
			currentMark = newmark;
		} else {
			if(currentMark == -1) {
				currentMark = 0;
			}
			if(gebi(hitValues[currentMark]) != null) {
				gebi(hitValues[currentMark]).className = "noselection";
			}
			currentMark = newmark;
		}
		moveDirection = false;
		gebi(hitValues[currentMark]).className = "selection";
	}
}

/*
	Move back and forward through the pages
*/
function pageMove(dir){
	if (typeof(gebi(hitValues[currentMark])) == "object") {
		if (dir == "prev"){
			if(gebi(hitValues[currentMark]) != null) {
				gebi(hitValues[currentMark]).className = "noselection";
			}
			gebi("prevpage").className = "selection";
			currentMark--;
			moveDirection="prev";
		} else if(dir == "next"){
			if(gebi(hitValues[currentMark]) != null) {
				gebi(hitValues[currentMark]).className = "noselection";
			}
			gebi("nextpage").className = "selection";
			currentMark++;
			moveDirection="next";
		}
	}
}

/*
	Move up and down through the current page
*/
function keyMove(e){
	if (checkKey(e) == "keyup"){
		if (currentMark > currentPage*maxListLength && currentMark!=0){
			highlightElement(currentMark-1);
		} else if (currentMark==currentPage*maxListLength && currentMark!=0){
			pageMove("prev");
		}
  } else if (checkKey(e) == "keydown"){
		if (currentMark < currentPage*maxListLength+maxListLength-1 && currentMark!=hitDisplay.length-1){
			highlightElement(currentMark+1);
		} else if (currentMark == (currentPage+1)*maxListLength-1 && currentMark!=hitDisplay.length-1){
			pageMove("next");
		}
	}
}

/*
	When the user clicks on an item og presses enter
	update the searchfield with the selected value
*/
function selector(targetDIV, searchFieldName) {
	var currentValue = gebi(searchFieldName).value;

	if (hitInputs[currentMark] && currentValue != "") {
		gebi(searchFieldName).value = hitInputs[currentMark];
		gebi(searchFieldName + "_hidden").value = hitValues[currentMark];
	} else {
		// Allow submitting of 'invalid values'
		//currentMark = 0;
		//currentPage = 0;
	}

	hidelist(targetDIV);
}

/*
	Check what key is pressed
*/
function checkKey(browserEvent) {
	var keyUp = 38;
	var keyDown = 40;
	var keyEnter = 13;

	if (browserEvent.which == keyUp || browserEvent.keyCode == keyUp) {
		return "keyup";
	} else if (browserEvent.which == keyDown || browserEvent.keyCode == keyDown) {
		return "keydown";
	} else if (browserEvent.which == keyEnter || browserEvent.keyCode == keyEnter) {
		return "keyenter";
	} else {
		return "keyother";
	}
}

function auto_complete(e, compareValue, targetDIV, searchFieldName, prev_page, next_page){
	if (compareValue) {
		if (checkKey(e) == "keyup" || checkKey(e) == "keydown"){
			keyMove(e);
	  	} else if (checkKey(e) == "keyenter") {
			if (moveDirection=="next"){
				currentPage++;
				drawDropDownDiv(targetDIV, searchFieldName, prev_page, next_page);
			} else if(moveDirection=="prev"){
				currentPage--;
				drawDropDownDiv(targetDIV, searchFieldName, prev_page, next_page);
			} else {
				selector(targetDIV, searchFieldName);
			}
		} else {
			// No control key was pressed, a letter was probably pressed
			// Lets instead run through the arrays to see what we got that matches

			// Empty targetId arrays

			// Reset pages and current currentMark
			currentPage = 0;
//			currentMark = 0;

			hitDisplay = new Array();
			hitValues = new Array();
			hitInputs = new Array();

			var arrayLength = Cities.length;

			for (i=0; i < arrayLength; i++) {
				hit = false;
				displayString = ""; // The value shown in the DIV, includes formatting
				inputString = ""; // The value copied to the input field

				// Check for hits
				cityHit = findValueInString(compareValue, Cities[i]);
				regionHit = findValueInString(compareValue, Regions[i]);
				resortHit = findValueInString(compareValue, Resorts[i]);
				informationHit = findValueInString(compareValue, Informations[i]);

				// Build the string to show to the user
				if (hit) {
					// Order of the listed in order of preference if available Resort, City, Region
					if (Informations[i].length > 0) {
						displayString += informationHit ? informationHit : Informations[i];
						displayString += ", ";

						inputString += Informations[i] + ", ";
					}

					if (Resorts[i].length > 0) {
						displayString += resortHit ? resortHit : Resorts[i];
						displayString += ", ";

						inputString += Resorts[i] + ", ";
					}

					if (Cities[i].length > 0) {
						displayString += cityHit ? cityHit : Cities[i];
						displayString += " ";

						inputString += Cities[i] + " ";
					}

					if (Regions[i].length > 0) {
						if (Informations[i].length == 0 && Resorts[i].length == 0 && Cities[i].length == 0)
						{
							displayString += "" + (regionHit ? regionHit : Regions[i]) + "";
						}
						else
						{
						displayString += "(" + (regionHit ? regionHit : Regions[i]) + ")";
						}
						

						inputString += Regions[i];
					}

					// Store Hits in arrays
					hitDisplay[hitDisplay.length] = displayString;
					hitInputs[hitInputs.length] = inputString;
					hitValues[hitValues.length] = Cities_Ids[i] + "|" + Regions_Ids[i] + "|" + Resorts_Ids[i] + "|" + Informations_Ids[i];
				}
			}
			if (hitDisplay.length){
				// If hitDisplay contain data, draw the DIV
				drawDropDownDiv(targetDIV, searchFieldName, prev_page, next_page);
			} else {
				// Hide the list
				hidelist(targetDIV);
			}
		}
	} else {
		// Hide the List
		hidelist(targetDIV);
	}
}

function submitForm(doSubmit) {
	var inputField = gebi("search").value;

	if (inputField != "") {
		var hiddenField = gebi("search_hidden").value;

		var TargetArray = hiddenField.split("|");
		var newTarget = "";

		if (TargetArray[3] > 0) {
			newTarget = "texti_" + TargetArray[3] + ".asp";
		} else if (TargetArray[2] > 0) {
			newTarget = "resortr_" + TargetArray[2] + ".asp";
		} else if (TargetArray[0] > 0) {
			newTarget = "textc_" + TargetArray[0] + ".asp";
		} else if (TargetArray[1] > 0) {
			newTarget = "regionr_" + TargetArray[1] + ".asp";
		}

		if (doSubmit) {
			if (newTarget != "") {
				gebi("searchForm").action = newTarget;
			}
			gebi("searchForm").submit();
		}

		return true;
	}

	return false;
}
