/* konfiguracijske varijable */
var maxShownWords = 6;
var numbersBoxWidth = 45;

/* interne varijeble */
var obj_suggestBox		= null;
var obj_suggestWords	= null;
var obj_suggestNumbers	= null;
var ovj_wordContainer	= null;
var obj_wordInput		= null;
var obj_imgWordsDown	= null;
var obj_imgWordsUp		= null;
var obj_xmlrequest		= null;
var intervalWordCheck	= null;
var inputboxValue		= null;
var searchTerm			= null;
var canMenuBeHidden		= true;
var suggestTuredOff		= false;
var wordSuggestActiv	= false;
var activeLanguage		= 1;
var firstWordPointer	= 0;
var selectedWordPointer	= -1;
var arr_wordsCache		= new Array();
var arr_wordsFromSite	= new Array();

obj_xmlrequest = getXMLHTTPobject();

function loadWordSuggest(){
	/* ako preglednik nezna èitati XML datoteke zaustavi inicijalizaciju */
	if(obj_xmlrequest == null) return;
	
	arr_wordsCache[1] = new Array();
	arr_wordsCache[2] = new Array();

	/* uzima sve potrebne elementa iz DOMa stranice */
	obj_suggestBox		= document.getElementById('suggestBox');
	obj_suggestWords	= document.getElementById('suggestWords');
	obj_suggestNumbers	= document.getElementById('suggestNumbers');
	obj_wordContainer	= document.getElementById('wordContainer');
	obj_wordInput		= document.getElementById('pojam');
	obj_imgWordsUp		= document.getElementById('imgWordsUp');
	obj_imgWordsDown	= document.getElementById('imgWordsDown');
	
	/* pozicionira i definira širinu spremnika za rijeèi */	
	obj_suggestWords.style.top = calculateOffsetTop(obj_wordInput) + obj_wordInput.offsetHeight + 1 + 'px';
	obj_suggestWords.style.left = calculateOffsetLeft(obj_wordInput) + 'px';
	obj_suggestWords.style.width = obj_wordInput.offsetWidth + numbersBoxWidth + 3 + 'px';
	
	obj_suggestNumbers.style.top = calculateOffsetTop(obj_wordInput) + 'px';
	obj_suggestNumbers.style.left = calculateOffsetLeft(obj_wordInput) + obj_wordInput.offsetWidth + 1 + 'px';
	obj_suggestNumbers.style.width = numbersBoxWidth + 'px';
	obj_suggestNumbers.style.height = (obj_wordInput.offsetHeight + 1) + 'px';
	obj_suggestNumbers.style.lineHeight = obj_wordInput.offsetHeight + 'px';
	
	obj_wordInput.onfocus = function(){
		onFocusedInputbox();
	}
	obj_wordInput.onblur = function(){
		onBluredInputbox();
	}
	obj_wordInput.onkeyup = function(event){
		if(!event && window.event){
			event = window.event;
		}
		procesKeyPress(event.keyCode);
	}
	obj_imgWordsUp.onmouseover = obj_imgWordsDown.onmouseover = function(){
		turnOffHiding();
	}
	obj_imgWordsUp.onmouseout = obj_imgWordsDown.onmouseout = function(){
		turnOnHiding();
	}
	obj_imgWordsUp.onclick = function(){
		obj_wordInput.focus();
		//var tmp = selectedWordPointer;
		buildFromWords(firstWordPointer - 1);
		//selectWordIfOnScreen(tmp);
	}
	obj_imgWordsDown.onclick = function(){
		obj_wordInput.focus();
		//var tmp = selectedWordPointer;
		buildFromWords(firstWordPointer + 1);
		//selectWordIfOnScreen(tmp);
	}
}
function onFocusedInputbox(){
	intervalWordCheck = setInterval('checkInputbox()', 250);
	if(obj_wordInput.value.length > 2){
		showWordContainer(true);
	}
}
function onBluredInputbox(){
	clearInterval(intervalWordCheck);
	showWordContainer(false);
}
function checkInputbox(){
	if(suggestTuredOff == true){
		// radi: ništa
	}else if(obj_wordInput.value.length < 3){
		showWordContainer(false);
	}else if(inputboxValue != convertToHtmlEntities(obj_wordInput.value)){
		inputboxValue = convertToHtmlEntities(obj_wordInput.value);
		createWordsArray(inputboxValue);
		showWordContainer(true);
	}
}
function createWordsArray(query){
	query = query.toLowerCase();
	var query_copy = query;
	while(!arr_wordsCache[activeLanguage][query_copy]){
		if(query_copy.length < 4) break;
		query_copy = query_copy.substr(0, query_copy.length-1);
	}
	if(arr_wordsCache[activeLanguage][query]){
		arr_wordsFromSite = arr_wordsCache[activeLanguage][query];
		searchTerm = query;
		buildFromWords(0);
	}else if(arr_wordsCache[activeLanguage][query_copy]){
		var tmparr_wordsCache = arr_wordsCache[activeLanguage][query_copy];
		arr_wordsCache[activeLanguage][query] = new Array();
		for(i in tmparr_wordsCache){
			if(typeof tmparr_wordsCache[i] != 'string') continue;
			if(tmparr_wordsCache[i].substr(0, query.length).toLowerCase() == query){
				arr_wordsCache[activeLanguage][query][(arr_wordsCache[activeLanguage][query].length)] = tmparr_wordsCache[i];
			}
		}
		arr_wordsFromSite = arr_wordsCache[activeLanguage][query];
		searchTerm = query;
		buildFromWords(0);
	}else{
		downloadWords(query);
	}
}
function downloadWords(query){
	if(query.length < 3) return;
	if(obj_xmlrequest && obj_xmlrequest.readyState != 0){
		obj_xmlrequest.abort()
	}
	obj_xmlrequest = getXMLHTTPobject();
	//obj_xmlrequest.open('GET', 'words.js?is=11', true);
	obj_xmlrequest.open('GET', 'rijeci.js.php?pojam='+convertToUrlString(convertFromHtmlEntities(query))+'&sa='+activeLanguage, true);
	obj_xmlrequest.onreadystatechange = function() {
		if(obj_xmlrequest.readyState == 4 && obj_xmlrequest.responseText){
			//document.getElementById('tmpCont').innerHTML = obj_xmlrequest.responseText;
			//alert(obj_xmlrequest.responseText);
			eval(obj_xmlrequest.responseText);
			buildFromWords(0);
		}
	}
	setLoadingState();
	obj_xmlrequest.send(null);
}
function buildFromWords(start){
	if(!start) start = 0;

	/* utvrdi da li treba prikazati strijelicu gore */
	if(start != 0){
		obj_imgWordsUp.style.display = 'block';
	}else{
		obj_imgWordsUp.style.display = 'none';
		turnOnHiding();
	}
	/* utvrdi da li treba prikazati strijelicu dolje */
	if(start + maxShownWords >= arr_wordsFromSite.length){
		obj_imgWordsDown.style.display = 'none';
		turnOnHiding();
	}else{
		obj_imgWordsDown.style.display = 'block';
	}
	var stop = 0;
	var i = 0;
	/* utvrdi pokazivaè na zadnju rijeè koja æe se prikazati */
	if((start + maxShownWords) > arr_wordsFromSite.length){
		stop = arr_wordsFromSite.length
	}else{
		stop = start + maxShownWords;
	}
	var out = '';
	//var tmpSearchTerm = convertToHtmlEntities(searchTerm);
	var tmpSearchTerm = (searchTerm);
	for(i = start; i < stop; i++){
		//out += '<div>'+arr_wordsFromSite[i]+'</div>';
		//out += '<div>'+str_replace(arr_wordsFromSite[i],tmpSearchTerm,'<b>'+tmpSearchTerm+'</b>')+'</div>';
		out += '<div onmouseover="selectWord('+i+')"><b>'+arr_wordsFromSite[i].substr(0, tmpSearchTerm.length)+'</b>'+arr_wordsFromSite[i].substr(tmpSearchTerm.length)+'</div>';
	}
	if(start == stop){
		out = 'No items';
	}
	firstWordPointer = start;
	selectedWordPointer = firstWordPointer - 1;
	obj_wordContainer.innerHTML = out;
	obj_suggestNumbers.innerHTML = '(0/'+arr_wordsFromSite.length+')';
}
function setLoadingState(){
	obj_suggestNumbers.innerHTML = '';
	obj_wordContainer.innerHTML = 'Loading...';
	obj_imgWordsUp.style.display = 'none';
	obj_imgWordsDown.style.display = 'none';
}
function showWordContainer(show){
	if(show){
		obj_suggestWords.style.display = 'block';
		obj_suggestNumbers.style.display = 'block';
		wordSuggestActiv = true;
	}else if(canMenuBeHidden){
		obj_suggestWords.style.display = 'none';
		obj_suggestNumbers.style.display = 'none';
		wordSuggestActiv = false;
	}
}
function turnOffHiding(){
	canMenuBeHidden = false;
}
function turnOnHiding(){
	canMenuBeHidden = true;
}
function procesKeyPress(key){
	if(suggestTuredOff == true && key == 40){
		suggestTuredOff = false;
	}else if(suggestTuredOff == true){
		return true;
	}
	if(!wordSuggestActiv){
		return true;
	}
	switch(key){
		/* Esc */
		case 27:
			showWordContainer(false);
			suggestTuredOff = true;
			obj_wordInput.value = convertFromHtmlEntities(searchTerm);
		break;
		/* Enter */
		case 13:
			return writeWord(selectedWordPointer);
		break;
		/* Strijelica dolje */
		case 40:
			selectWord(selectedWordPointer+1);
			return false;
		break;
		/* Strijelica desno */
		case 39:
			createWordsArray(inputboxValue);
			return false;
		break;
		/* Strijelica gore */
		case 38:
			selectWord(selectedWordPointer-1);
			return false;
		break;
		/* Strijelica lijevo */
		case 37:
			selectWord(-1);
			inputboxValue = searchTerm;
			obj_wordInput.value = convertFromHtmlEntities(searchTerm);
			return false;
		break;
		default:
			return true;
	}
}
function writeWord(wordPointer){
	if(arr_wordsFromSite[wordPointer]){
		showWordContainer(false);
		obj_wordInput.value = arr_wordsFromSite[wordPointer];
		inputboxValue = arr_wordsFromSite[wordPointer];
		return false;
	}else{
		return true;
	}
}
function selectWordIfOnScreen(wordPointer){
	if(	wordPointer >= firstWordPointer && 
		wordPointer < (firstWordPointer + maxShownWords)){
		selectWord(wordPointer);
	}
}
function selectWord(wordPointer){
	var oldNodeId;
	var curentNodeId;
	if(wordPointer < 0){
		selectedWordPointer = -1;
		oldNodeId = selectedWordPointer - firstWordPointer;
		if(oldNodeId > -1 && obj_wordContainer.childNodes[oldNodeId]){
			obj_wordContainer.childNodes[oldNodeId].style.backgroundColor = 'transparent';
		}
		return;
	}
	if(!arr_wordsFromSite[wordPointer]){
		return;
	}
	if(wordPointer - firstWordPointer < 0){
		buildFromWords(firstWordPointer - 1);
		selectWord(wordPointer);
	}
	if(wordPointer >= (firstWordPointer + maxShownWords)){
		buildFromWords(wordPointer - maxShownWords + 1);
		selectWord(wordPointer);
	}
	oldNodeId = selectedWordPointer - firstWordPointer;
	curentNodeId = wordPointer - firstWordPointer;
	if(oldNodeId != -1 && obj_wordContainer.childNodes[oldNodeId]){
		obj_wordContainer.childNodes[oldNodeId].style.backgroundColor = 'transparent';
	}
	if(curentNodeId != -1 && obj_wordContainer.childNodes[curentNodeId]){
		obj_wordContainer.childNodes[curentNodeId].style.backgroundColor = '#CCCCCC';
	}
	inputboxValue = arr_wordsFromSite[wordPointer];
	obj_wordInput.value = convertFromHtmlEntities(arr_wordsFromSite[wordPointer]);
	obj_suggestNumbers.innerHTML = '('+(wordPointer+1)+'/'+arr_wordsFromSite.length+')';
	selectedWordPointer = wordPointer;
}
function sendWords(query, lang, words){
	searchTerm = query;
	arr_wordsCache[lang][query] = words;
	arr_wordsFromSite = words;
}
function setActioveLanguage(language){
	activeLanguage = language;
}



function getXMLHTTPobject(){
	var obj_request = null;
	try{
		obj_request = new ActiveXObject('Msxml2.XMLHTTP')
	}catch(e){
		try{
			obj_request = new ActiveXObject('Microsoft.XMLHTTP')
		} catch(oc){
			obj_request = null
		}
	}
	if(!obj_request && typeof XMLHttpRequest != 'undefined') {
		obj_request = new XMLHttpRequest();
	}
	return obj_request;
}
function calculateOffsetTop(element){
	var size = 0;
	while(element){
		size += element.offsetTop; 
		element=element.offsetParent;
	}
	return size;
}
function calculateOffsetLeft(element){
	var size = 0;
	while(element){
		size += element.offsetLeft; 
		element=element.offsetParent;
	}
	return size;
}
function str_replace(string, search, replace){
	if(!search) return string;
	var pos = 0;

	pos = string.indexOf(search);
	if(pos == -1) return string;

	do{
		string = string.substr(0, pos) + replace 
			+ string.substr(pos+search.length);
	}while((pos = string.indexOf(search, pos + replace.length)) != -1);

	return string;
}
function convertToUrlString(string){
	var new_string = '';
	var i;
	for(i = 0; i <= string.length; i++){
		switch(string.charAt(i)){
			case 'È': new_string += '%8D'; break;
			case 'è': new_string += '%E8'; break;
			case 'Æ': new_string += '%87'; break;
			case 'æ': new_string += '%E6'; break;
			case 'Ð': new_string += '%91'; break;
			case 'ð': new_string += '%F0'; break;
			case 'Š': new_string += '%A1'; break;
			case 'š': new_string += '%9A'; break;
			case 'Ž': new_string += '%BE'; break;
			case 'ž': new_string += '%9E'; break;
			default : new_string += string.charAt(i);
		}
	}
	return new_string;
}
function convertToHtmlEntities(string){
	var new_string = '';
	var i;
	for(i = 0; i <= string.length; i++){
		switch(string.charAt(i)){
			case 'È': new_string += '&#268;'; break;
			case 'è': new_string += '&#269;'; break;			
			case 'Æ': new_string += '&#262;'; break;
			case 'æ': new_string += '&#263;'; break;
			case 'Ð': new_string += '&#272;'; break;
			case 'ð': new_string += '&#273;'; break;
			case 'Š': new_string += '&#352;'; break;
			case 'š': new_string += '&#353;'; break;
			case 'Ž': new_string += '&#381;'; break;
			case 'ž': new_string += '&#382;'; break;
			default:  new_string += string.charAt(i);
		}
	}
	return new_string;
}
function convertFromHtmlEntities(string){
	var new_string = string;
	new_string = str_replace(new_string, '&#268;', 'È');
	new_string = str_replace(new_string, '&#269;', 'è');
	new_string = str_replace(new_string, '&#262;', 'Æ');
	new_string = str_replace(new_string, '&#263;', 'æ');
	new_string = str_replace(new_string, '&#272;', 'Ð');
	new_string = str_replace(new_string, '&#273;', 'ð');
	new_string = str_replace(new_string, '&#352;', 'Š');
	new_string = str_replace(new_string, '&#353;', 'š');
	new_string = str_replace(new_string, '&#381;', 'Ž');
	new_string = str_replace(new_string, '&#382;', 'ž');
	return new_string;
}