/**
 * TODO 
 * chybi osetreni posunu radku pri stisknute klavese sipka dolu nebo nahoru
 * Osetreni pri vyhledavani zakazniku, pokud je odeslan filtr a vyhledavaci pole obsahuje znaky, 
 * ale skryte pole neobsahuje ID - je treba zobrazit varovani
 */

var suggest = null;
function onSuggestFieldFocus(object)
{
	if (suggest) suggest.hide();
	suggest = object;
	if (!suggest.div) {
		suggest.init();
	}
}

function suggestBox (id, file) {
	this.id = id; // identifikace dvou objektu, divID a inputID, vkladame pouze koncove ID
	this.file = file; // cesta k souboru se scriptem
	
	this.selected = false; // id objektu, ktery je oznacen v boxu, ID jsou generovany, prvni polozka v boxu = 0
	this.timer = null;
	this.outTimer = null;
	this.search_min_length = 1; // minimalni delka retezce, kdy bude zobrazen box
	// this.dontClose = false;	// priznak pro zakazani zavreni boxu
	this.isDisplayed = false; // priznak - napovedny box je otevreny / zavreny
		 
	// Inicializace objektu
	this.init = function () {
		this.div = document.getElementById('div' + this.id);
		this.hidden = document.getElementById('hid' + this.id);
		this.div.onmouseover = this.unselectRow; // odznaci radek oznaceny drive klavesnici
				
		this.input = document.getElementById('input' + this.id);
		this.input.onkeyup = this.stahniData;
		this.input.onclick = this.stahniData;
		this.input.onkeypress = this.disableEvent; // FF vola tuto funkci
		this.input.position = getAnchorPosition(this.input.id); // zjisti pozici inputu
		
		// umisteni naseptavace
		//this.div.style.left = this.input.position.x + "px"; 
		//this.div.style.top = this.input.position.y + this.input.offsetHeight + "px";
				
		// Zajisti zmizeni bozu pri kliknuti mysi kdekoliv ve strance, kliknuti do inputu sice box zavre, ale udalost v inputu onfocus ho opet otevre		
		document.all ? document.attachEvent('onclick', this.hide) : document.addEventListener('click', this.hide, false);
	}
	
	// Hlavni vyhodnocovaci funkce
	this.stahniData = function (e) {
		var key = suggest.getKeyCode(e);
		
		// pri odmazani inputu bude i skryty prvek nastaven na prazdny
		if (suggest.hidden && suggest.input.value.length == 0) suggest.hidden.value = '';
		// pocet znaku v inputu je mensi nez pocet potrebny pro vyhledavani, box zavreme 
		if (suggest.input.value.length < suggest.search_min_length) return suggest.hide();
		
		var lastRow = suggest.div.childNodes.length - 1;
		var firstRow = 0;
		var lastSelected = suggest.selected;
					
		// End, Home
		if (key == 35 || key == 36) { 
			if ( !suggest.div.hasChildNodes()) return false;
			var j = (key == 35) ? lastRow : firstRow; // we are going up or down
		
			suggest.selected = j;
			suggest.selectRow(suggest.selected, lastSelected);
		}
		// PageUp, PageDown
		else if (key == 33 || key == 34) { 
			if ( !suggest.div.hasChildNodes()) return false;
			var j = (key == 34) ? 11 : -11; // we are going up or down

			if (suggest.selected === false) suggest.selected = firstRow;
			else if (suggest.isElement(suggest.selected + j)) {
				suggest.selected =  suggest.selected + j;
			}	
			else suggest.selected = (j > 0) ? lastRow : firstRow;

			suggest.selectRow(suggest.selected, lastSelected);
		}
		// Key down, key up
		else if (key == 40 || key == 38) { 
			if ( !suggest.div.hasChildNodes()) return false;
			var j = (key == 40) ? 1 : -1; // we are going up or down

			// if next or before element exist, select him otherwise again select actual row
			if (suggest.selected === false) suggest.selected = firstRow;
			else suggest.selected = suggest.isElement(suggest.selected + j) ? suggest.selected + j : suggest.selected;

			suggest.selectRow(suggest.selected, lastSelected);
		}
		// enter a zaroven je ukazatel na nejake ulici
		else if (key == 13 && suggest.selected !== false) {
			var obj = suggest.div.childNodes[suggest.selected]; 
			suggest.input.value = obj.innerHTML;
			if (suggest.hidden) suggest.hidden.value = obj.id;
			suggest.hide();
			return false;
		}
		// escape
		else if (key == 27) {
			suggest.hide();
		}
		// zmacknuti jine klavesy nes vyse uvedene a klavesy sipka vlevo a vpravo, spusti tuto akci
		else if (key != 37 && key != 39) { // left key, right key
			suggest.selected = false;
			clearTimeout(suggest.timer);
			suggest.timer = setTimeout('suggest.readData()', 300);
		}
	}
	
	// Oznacit nastaveny radek
	this.selectRow = function(row, lastRow) {
		suggest.unselectRow(lastRow);
		suggest.div.childNodes[row].className = 'hover';
		suggest.div.scrollTop = suggest.div.childNodes[row].offsetHeight * row;
	}
	
	// Actual selected row will be unselected
	this.unselectRow = function (row) {
		clearTimeout(suggest.outTimer); // najeti mysi zrusi odpocet zmizeni boxu
		// zmena oznaceni radku, pri pohybu v boxu pres klavesnici
		if (suggest.isElement(row)) suggest.div.childNodes[row].className = '';
		// odznaceni se vola take pri prejeti mysi, row neni v tuto chvili k dispozici
		else if (suggest.selected !== false) suggest.div.childNodes[suggest.selected].className = '';
	}
	
	// Vlozeni oznaceneho textu do inputu
	this.rowClick = function () {
		suggest.input.value = this.innerHTML;
		if (suggest.hidden) suggest.hidden.value = this.id;
		suggest.input.focus();
		suggest.hide();
	}
	
	// nacte a vrati zmacknuty kod klavesy	
	this.getKeyCode = function (e) {
		if (!e) var e = window.event;
		 
		if (e.keyCode) return e.keyCode;
		else if (e.which) return e.which;
	}
	
	// potlaceni udalosti, ktere maji nastat pri posouvani ukazatele v inputu behem listovani v boxu a zabraneni odeslani formulare entrem
	this.disableEvent = function (e) {
		if (suggest.isDisplayed) {
			var key = suggest.getKeyCode(e);
		
 			if (key == 37 || key == 36 || key == 13) { // left arrow, home, enter
				return false;
			}
		}
	}
	
	// Cteni dat z php souboru
	this.readData = function () {
		jQuery.getJSON(suggest.file, {search: suggest.input.value}, function(data){
			suggest.displayBox(data);
		});
	}

	// Overeni zda byl zaslan element
	this.isElement = function (v) {
		if (v !== false && suggest.div.hasChildNodes() && v >=0 && v < suggest.div.childNodes.length) return true;
		else return false;
	}
	
	// Skryti boxu napovedy	
	this.hide = function () {
		suggest.div.style.display = 'none';
		suggest.isDisplayed = false;
		suggest.clearData();
		suggest.selected = false; // zrusime aktivni pole
	}
	
	// Odstraneni obsahu div
	this.clearData = function () {
		if ( suggest.div.hasChildNodes() ) {
		    while ( suggest.div.childNodes.length >= 1 ) {
		        suggest.div.removeChild( suggest.div.firstChild );
		    }
		}
	}

	// Zobrazeni boxu napovedy z objektu JSON
	// Tato varianta nastavuje ID tagu P do skryteho inputu ve strance, jelikoz toto je pro nas dulezita hodnota
	this.displayBox = function (obj) {
		suggest.clearData();

		var count = 0;
		
		for (var key in obj) {
			count++;
			var p = document.createElement("p");
			p.innerHTML = obj[key];
			p.id = key;
			p.onclick = suggest.rowClick;
			suggest.div.appendChild(p);
		}
		
		// if no result or result is allready in input, dont show suggest
		if (count == 0 || count == 1 && p.innerHTML == suggest.input.value) {
			return suggest.hide();
		}
		else {
			suggest.enableBox();			
		}
	}
	
	/** 
	 * Zapne zviditelneni naseptavace
	 * Jakmile je zobrazen naseptavac, je nutne vybrat polozku ze seznamu, jinak nebude nastaveno ID ve skrytem inputu
	 * Pri pouziti s polem hodnot - neni podstatne, pouze pri pouziti objektu hodnot JSON je toto zasadni
	 */
	this.enableBox = function () {
		suggest.div.style.display = '';
		suggest.isDisplayed = true;
		// dulezite vyprazdneni id inputu, jelikoz doslo k dalsimu vyvolani naseptavace
		if (suggest.hidden) suggest.hidden.value = '';
	}
	
	/*
 	// Focus z inputu se ztratil, bylo kliknuto mysi ... 
	this.mouseHide = function (e) {
		if (!e) var e = window.event;
		var targ = e.relatedTarget ? e.relatedTarget : e.toElement;
		//var targ = e.srcElement ? e.srcElement : e.target;
		
		// kliknuto bylo do inputu, jehoz soucasti je i scrollbar, nic se nestane
		alert(targ.id);
  		if (targ.id == suggest.input.id && navigator.appName != 'Netscape') { // FF neprovede naslednou funkci onblur, zakazeme FF provest podminku 
			suggest.dontClose = true;
			// suggest.input.focus();
			return false;
		}
		else {
			clearTimeout(suggest.outTimer);
			suggest.outTimer = setTimeout('suggest.hide()', 300);
		}
	}
*/
}
