/**
 * @author mk
 */

//	global variables
var suggestRequest = getXMLHTTPRequest();
var keynumber      = 65;
var minKeyNumber   = 0;
var maxKeyNumber   = 10;
var suggestLevel   = -1;
var elementID      = "email_domain";
var dropdownID     = "suggestionList";
var submitCheck    = true;
var enabledSubmit  = false;
var tokenLength    = 0;
var maxTokenLength = 100;
var servletURL 		 = "/DataSuggestionServlet";

//	create request object
function getXMLHTTPRequest() {
	var reqObj  = null;
	var browser = navigator.appName;
	if(browser=="Microsoft Internet Explorer"){								//	if(window.XMLHttpRequest) {
		reqObj = new ActiveXObject("Microsoft.XMLHTTP");				//		reqObj = new XMLHttpRequest();
	} else {																									//	} else if(typeof ActiveXObject != "undefined") {
		reqObj = new XMLHttpRequest();													//		reqObj = new ActiveXObject("Microsoftr.XMLHTTP");
	}																													//	}
	return reqObj;
}

//	send request
function sendRequest(url, HttpMethod) {
	if(!HttpMethod) {
		HttpMethod = "POST"
	}
	if(suggestRequest) {
		suggestRequest.open(HttpMethod, url, true);
	  suggestRequest.onreadystatechange = suggestData_handleResponse;
	  suggestRequest.send(null);
	}
}

//	initialze response
function suggestData_handleResponse() {
	var resultList = "";
	maxTokenLength = 100;
	
	if(suggestRequest.readyState == 4) {				// readyState 4 = complete.
		var str = suggestRequest.responseText;
		str = str.substring(0, (str.length-1));			// cuts of obsolete last semikolon
		var token = str.split(";");
		tokenLength = (token.length > 10) ? 10 : token.length;
		
		for(var i = 0; i < tokenLength; i++) {
			resultList += '<div ';
			resultList += 'onmouseover="suggestOver(this.id);" ';
			resultList += 'onmouseout="suggestOut(this.id);" ';
			resultList +=	'onmousedown="setSearch(\''+ token[i] + '\');" ';
			resultList += 'class="suggestLink" id="resultList' + i + '">' + token[i] + '</div>';
			if(maxTokenLength < ((token[i].length * 6.5) + 16)) {
				maxTokenLength = (token[i].length * 6.5) + 16;
			}
		}
		suggestLevel = -1;

		document.getElementById(dropdownID).innerHTML = resultList;
		document.getElementById(dropdownID).style.width = maxTokenLength + "px";
		document.getElementById(dropdownID).style.visibility = "visible";
	}
	if (document.getElementById(elementID).value == "" || document.getElementById(elementID).value == null) {
		document.getElementById(dropdownID).style.visibility = "hidden";
	}
}

//	handles key event
function keystrokeEvent(e) {
	if(!e) {
	  e = window.event
	} 
	keynumber = e.keyCode;
}

//	[cursor]key + [enter] select
function suggestData_search(fieldID) {
	document.onkeydown = keystrokeEvent;
	if(keynumber >= 65 && keynumber <= 105 || keynumber == 8 || keynumber == 46|| keynumber == 27) { 		// alphabet + back + delete + esc
		elementID = fieldID;
		var searchterm 	= document.getElementById(elementID).value;
		var combinedURL = servletURL + "?searchValue=" + searchterm
		sendRequest(combinedURL, "GET");
	}
	if (keynumber == 13) {
		document.getElementById(dropdownID).style.visibility = "hidden";
		submitCheck = false;
	}
	if (keynumber == 38) {		// highlight goes up - cursor-up-key
		for (var j = 0; j < document.getElementById(dropdownID).childNodes.length; j++) {
			document.getElementById(dropdownID).childNodes[j].className = "suggestLink";
		}
		if (suggestLevel > 0) {
			suggestLevel--;
		}else{
			suggestLevel = (tokenLength-1);
		}
		document.getElementById(dropdownID).childNodes[suggestLevel].className = "suggestLinkOver";
		document.getElementById(elementID).value = document.getElementById(dropdownID).childNodes[suggestLevel].innerHTML;
	}
	if (keynumber == 40) {		// highlight goes down - cursor-down-key
		for (var k = 0; k < document.getElementById(dropdownID).childNodes.length;k++) {
			document.getElementById(dropdownID).childNodes[k].className = "suggestLink";
		}
		if (suggestLevel < (tokenLength-1)){
			suggestLevel++;
		}else{
			suggestLevel = 0;
		}
		document.getElementById(dropdownID).childNodes[suggestLevel].className = "suggestLinkOver";
		document.getElementById(elementID).value = document.getElementById(dropdownID).childNodes[suggestLevel].innerHTML;
	}	
}

// mouseover - set highlight
function suggestOver(divID) {
	document.getElementById(divID).className = "suggestLinkOver";
}

// mouseout - reset highlight
function suggestOut(divID) {
	document.getElementById(divID).className = "suggestLink";
}

// mouseclick select
function setSearch(searchValue) {
	document.getElementById(elementID).value = searchValue;	
	document.getElementById(dropdownID).style.visibility = "hidden";
	document.getElementById(elementID).focus();
}

// disables submit for [return]key
function checkSubmit() {
	document.onkeydown = keystrokeEvent;
	if(enabledSubmit) {
		return true;
	} else {
		submitCheck = (keynumber == 13) ? false : true;
		return (submitCheck) ? true : false ;
	}
}

// enables submit for submitbutton + [enter]key
function enableSubmit(state) {
	enabledSubmit = state;
}