﻿function initWordCompletion()
{
	word_completion.current_form;
	word_completion.current_input_field;
	word_completion.originial_string;
	word_completion.current_url_queue = new Array();
	word_completion.current_list;
	word_completion.current_selected_index = -1;
	word_completion.list_a_elms = new Array();
	word_completion.words = new Array();
	word_completion.dicts = new Array();
	word_completion.current_list_no_elms = 0;
	word_completion.current_list_left_pos;
	word_completion.current_window_width;
	word_completion.last_window_pos = {};
	
	word_completion.current_form = document.getElementById('searchform');

	if(word_completion.current_form != undefined && word_completion.current_form != null)
	{	
		word_completion.current_input_field = word_completion.current_form.word;
			
		if (window.attachEvent)
		{
			word_completion.current_input_field.attachEvent("onkeyup", startWordCompletion);
			document.attachEvent("onclick", closeAutoSuggest);
			//document.attachEvent("onclick", openAutoSuggest); // Gør den ikke hos Google
			word_completion.current_input_field.attachEvent("onblur", closeAutoSuggest); // Fixet ved tjek på key
			//word_completion.current_input_field.attachEvent("onfocus", openAutoSuggest); // Gør den ikke hos Google
			
			window.attachEvent("onresize", positionAutoSuggestList);
		} else
		{
			word_completion.current_input_field.addEventListener("keyup", startWordCompletion, true);
			document.addEventListener("click", closeAutoSuggest, true);
			//document.addEventListener("click", openAutoSuggest, true); // Gør den ikke hos Google
			word_completion.current_input_field.addEventListener("blur", closeAutoSuggest, true); // Fixet ved tjek på key
			//word_completion.current_input_field.addEventListener("focus", openAutoSuggest, true); // Gør den ikke hos Google
			
			window.addEventListener("resize", positionAutoSuggestList, true);
		}
	}
}

function closeAutoSuggest(evtObj)
{
	if(evtObj != null && evtObj != undefined)
	{
		srcElement = getEventOrigin(evtObj);
			
		if(evtObj.type != 'blur')
		{
			if(document.getElementById('wordcompletion-list') != srcElement && word_completion.current_input_field != srcElement)
			{
				document.getElementById('wordcompletion-list').style.display = 'none';
			}
		} else {
			//alert(word_completion.current_input_field == srcElement);
			if(word_completion.current_input_field == srcElement)
			{
				setTimeout(function () {document.getElementById('wordcompletion-list').style.display = 'none';}, 500);

				if(window.detachEvent)
				{
					word_completion.current_form.detachEvent('onsubmit', cancelFormSubmit);
				} else
				{
					word_completion.current_form.removeEventListener('submit', cancelFormSubmit, true);
				}
			}
		}
	} else
	{
		document.getElementById('wordcompletion-list').style.display = 'none';
	}
}

function getEventOrigin(e)
{
	eventObj = e;
	
	var eventOrigin = null;
	if (eventObj.target) 
		var eventOrigin = eventObj.target;
	else if (eventObj.srcElement) 
		var eventOrigin = eventObj.srcElement;

	return eventOrigin;
}

function startWordCompletion(e)
{
	var keyCode;
	var eventObj;
	var dict;
			
	if(e)
	{
		eventObj = e;
		
		if(e.which)
			keyCode = e.which;
		else
			keyCode = e.keyCode
	}
	else 
	{
		eventObj = event;
		keyCode = event.keyCode
	}
	
	var eventOrigin = null;
	if (eventObj.target) 
		var eventOrigin = eventObj.target;
	else if (eventObj.srcElement) 
		var eventOrigin = eventObj.srcElement;
	
	if(keyCode == 8 || keyCode == 32 || keyCode == 46 || (keyCode >= 65 && keyCode <= 90) || keyCode == 109 || keyCode == 192 || keyCode == 221 || keyCode == 222)
	{
		if(word_completion.current_form.dict && word_completion.current_form.dict.nodeName == 'SELECT') // Hvis brugeren står et sted på siden, hvor man kan vølge ordbog i dropdown-boksen
		{
			dict = word_completion.current_form.dict.value;
		} else if(current_url = window.location.search) { // Hvis ikke brugeren står et sted på siden, hvor man kan vælge ordbog i dropdown-boksen, henter man dict fra dict-get i url
			dict = current_url.match(/dict=([a-z0-9]{4})/);
			dict = dict[1];
		} else {
			dict = "auto";
		}
		
		search_string = word_completion.current_input_field.value;
		
		if(eventObj.type == 'keyup')
		{
			word_completion.originial_string = search_string;
			string_length = search_string.length;
						
			if(string_length > 2)
			{
				word_completion.current_url_queue = Array('string='+escape(search_string)+'&dict='+dict);
				getSuggestedWord(search_string, dict);
			} else 
			{
				closeAutoSuggest();
			}
		}
	} else if (keyCode == 38 || keyCode == 40) // Pil op og pil ned
	{
		search_string = word_completion.current_input_field.value;
		if(string_length > 2)
		{
			if(word_completion.current_list_no_elms > 0 && document.getElementById('wordcompletion-list').style.display != 'block')
			{
				document.getElementById('wordcompletion-list').style.display = 'block';
			}
			
			moveListPointer(eventObj, keyCode, eventObj.type);
		}
	} else if (keyCode == 13) // Enter
	{
		if(eventObj.type == 'keyup')
		{
			if(word_completion.current_selected_index > -1)
			{
				sendUserToURL();
			}
		}
	} else if (keyCode == 27) // ESC
	{
		closeAutoSuggest();
	}
}

function sendUserToURL()
{
	link = word_completion.list_a_elms[word_completion.current_selected_index].getAttribute('href');
	window.location.href = link;
}

function getSuggestedWord(string, dict)
{
	if(word_completion.current_url_queue.length > 0)
	{
		url_prefix = window.location.protocol + '//' + window.location.hostname;
		url = url_prefix + '/wordcompletion/get_wordsuggestions.php?'+word_completion.current_url_queue.shift();
		
		httpObject = getHTTPObject();
		if (httpObject != null) {
			httpObject.open("GET", url, true);
			httpObject.send(null);
			
			httpObject.onreadystatechange = function() {
				
				if(httpObject.readyState == 4){
					response = httpObject.responseText;
					try
					{
						json_obj = eval("("+response+")");
					}
					catch (e)
					{
						json_obj = [];
					}
					
					//alert(json_obj.length);

					if(json_obj.length > 0) {
						
						word_completion.current_selected_index = -1;
						word_completion.list_a_elms = new Array();
						word_completion.current_list_no_elms = 0;
						word_completion.words = new Array();
						
						setSuggestedWord(json_obj);
					} else
					{
						closeAutoSuggest();
					}
		
					return false;
				}
			};
		}
	} else
	{
		return false;
	}
}

function setSuggestedWord(json_obj)
{
	list = document.getElementById('wordcompletion-list');
	word_completion.current_list = list;
	
	if(list.childNodes.length > 0)
	{
		while(list.firstChild != null && list.firstChild != undefined)
		{
			list.removeChild(list.firstChild);
		}
	}
	
	positionAutoSuggestList('');
	
	url_prefix = window.location.protocol + '//' + window.location.hostname;
	
	if(json_obj.length > 0)
	{
		for(j=0; j<json_obj.length; j++)
		{
			li = document.createElement('li');
			li.className = 'wc_dropdown_elm';
	
			word_span = document.createElement('span');
			word_span.className = 'wc_dropdown_word';
			word_text = document.createTextNode(json_obj[j].word);
			word_span.appendChild(word_text);
			
			dict_span = document.createElement('span');
			dict_span.className = 'wc_dropdown_dict';
			dict_text = document.createTextNode(json_obj[j].dict);
			dict_span.appendChild(dict_text);
			
			link_elm = document.createElement('a');
			link_elm.setAttribute('href', url_prefix+'/opslag.php?word='+escape(json_obj[j].word)+'&dict='+escape(json_obj[j].shortdict));
			
			link_elm.appendChild(word_span);
			//link_elm.appendChild(dict_span);
			
			li.appendChild(link_elm);
			
			word_completion.words.push(json_obj[j].word);
			word_completion.dicts.push(json_obj[j].shortdict);
			word_completion.list_a_elms.push(link_elm);
	
			list.appendChild(li);
		}
		
		word_completion.current_list_no_elms = json_obj.length;
		document.getElementById('wordcompletion-list').style.display = 'block';
		
		word_completion.last_window_pos.top = (window.pageYOffset) ? window.pageYOffset : document.body.scrollTop;
		word_completion.last_window_pos.left = (window.pageXOffset) ? window.pageXOffset : document.body.scrollLeft;
	}
}

function positionAutoSuggestList(e)
{
	isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
	isIE7 = /msie|MSIE 7/.test(navigator.userAgent);

	if(word_completion.current_list != undefined)
	{
		if(e != '')
		{
			var eventObj;
					
			if(e)
			{
				eventObj = e;
				if(e.which)
					keyCode = e.which;
				else
					keyCode = e.keyCode
			}
			else
			{
				eventObj = event;
				keyCode = event.keyCode
			}
		}
		
		var input_scrollLeft = (word_completion.current_input_field.offsetLeft > 0) ? word_completion.current_input_field.offsetLeft : ((document.body.clientWidth - document.getElementById('searchInnerWrap').clientWidth)/2) - 460;
		var input_scrollTop = word_completion.current_input_field.offsetTop;
		var input_width = (word_completion.current_input_field.offsetWidth) ? word_completion.current_input_field.offsetWidth : word_completion.current_input_field.clientWidth;
		var input_height = (word_completion.current_input_field.offsetHeight) ? word_completion.current_input_field.offsetHeight : word_completion.current_input_field.clientHeight;
	
		var list_posTop = ((input_scrollTop + input_height + 2) > 100) ? input_scrollTop + input_height - 2 + 'px' : input_scrollTop + input_height + 8 + 'px';
	
		if(eventObj != undefined && eventObj.type == "resize")
		{
			width_diff = (window.innerWidth) ? word_completion.current_window_width - window.innerWidth : word_completion.current_window_width - document.body.clientWidth;
			width_diff = (width_diff < 0) ? (width_diff * -1) : width_diff;
			offset_diff = parseInt(word_completion.current_list_left_pos) - input_scrollLeft;
			offset_diff = (offset_diff < 0) ? offset_diff * -1 : offset_diff;
			
			if(!isIE6 && !isIE7)
			{
				list_posLeft = (((offset_diff * 2) - width_diff) > 10) ? (input_scrollLeft - 10) : input_scrollLeft;
			}
			else if (isIE6)
			{
				list_posLeft = ((document.body.clientWidth - document.getElementById('searchInnerWrap').clientWidth)/2);
				list_posLeft = list_posLeft < 30 ? list_posLeft + (20 - list_posLeft) : list_posLeft + 30;
			} else if (isIE7)
			{
				list_posTop = parseInt(list_posTop) - 18 + 'px';
				list_posLeft = input_scrollLeft - 15;
			}
		} else
		{
			list_posLeft = input_scrollLeft;

			if(isIE7)
			{
				list_posTop = parseInt(list_posTop) - 18 + 'px';
				list_posLeft = input_scrollLeft - 15;
			}
		}
	
		//word_completion.current_list.style.left = list_posLeft + 'px';
		/*
		word_completion.current_list.style.left = '10px';
		word_completion.current_list.style.top = list_posTop;
		*/
		word_completion.current_list.style.width = input_width - 14 + 'px';
	
		word_completion.current_list_left_pos = list_posLeft;
		word_completion.current_window_width = (window.innerWidth) ? window.innerWidth : document.body.clientWidth;
		
		word_completion.last_window_pos.top = (window.pageYOffset) ? window.pageYOffset : document.body.scrollTop;
		word_completion.last_window_pos.left = (window.pageXOffset) ? window.pageXOffset : document.body.scrollLeft;
	}
}

function moveListPointer(e, keyCode, eventType)
{
	var keyCode;
	var eventObj;
			
	if(e)
	{
		eventObj = e;
		if(e.which)
			keyCode = e.which;
		else
			keyCode = e.keyCode
	}
	else 
	{
		eventObj = event;
		keyCode = event.keyCode
	}
	
	var eventOrigin = null;
	if (eventObj.target) 
		var eventOrigin = eventObj.target;
	else if (eventObj.srcElement) 
		var eventOrigin = eventObj.srcElement;
		
	eventType = eventObj.type;
	
	if(eventType == 'keyup')
	{
		if (keyCode == 40) // Pil ned
		{
			if(word_completion.current_selected_index < 0 && word_completion.current_list_no_elms > 0)
			{
				word_completion.list_a_elms[0].className = 'highlight';
				word_completion.current_selected_index = 0;
				word_completion.current_input_field.value = word_completion.words[0];
				
				if(window.attachEvent)
				{
					word_completion.current_form.attachEvent('onsubmit', cancelFormSubmit);
				} else
				{
					word_completion.current_form.addEventListener('submit', cancelFormSubmit, true);
				}
				
			} else if(word_completion.current_selected_index > -1 && word_completion.current_selected_index < (word_completion.current_list_no_elms - 1))
			{
				word_completion.list_a_elms[word_completion.current_selected_index].className = '';
				word_completion.list_a_elms[word_completion.current_selected_index+1].className = 'highlight';
				word_completion.current_selected_index = word_completion.current_selected_index+1;
				word_completion.current_input_field.value = word_completion.words[word_completion.current_selected_index];
			}
		} else if (keyCode == 38) // Pil op
		{
			if(word_completion.current_selected_index > 0 && word_completion.current_selected_index < (word_completion.current_list_no_elms))
			{
				word_completion.list_a_elms[word_completion.current_selected_index].className = '';
				word_completion.list_a_elms[word_completion.current_selected_index-1].className = 'highlight';
				word_completion.current_selected_index = word_completion.current_selected_index-1;
				word_completion.current_input_field.value = word_completion.words[word_completion.current_selected_index];

			} else if (word_completion.current_selected_index == 0)
			{
				word_completion.list_a_elms[word_completion.current_selected_index].className = '';
				word_completion.current_selected_index = -1;
				word_completion.current_input_field.value = word_completion.originial_string;
				word_completion.current_input_field.focus();
				
				if(window.detachEvent)
				{
					word_completion.current_form.detachEvent('onsubmit', cancelFormSubmit);
				} else
				{
					word_completion.current_form.removeEventListener('submit', cancelFormSubmit, true);
				}
				
			}
		}
		
		word_completion.last_window_pos.top = (window.pageYOffset) ? window.pageYOffset : document.body.scrollTop;
		word_completion.last_window_pos.left = (window.pageXOffset) ? window.pageXOffset : document.body.scrollLeft;
	}
}

function cancelFormSubmit(e)
{
	if(e.stopPropagation)
	{
		e.stopPropagation();
		e.preventDefault();
	} else 
	{
		event.cancelBubble = true;
		return false;
	}
}
