/**
 * Vytvoří instanci našeptávače.
 *
 * @param String paramInputId id textového pole
 * @param String paramUrl url pro získávání dat
 */
function SynonymSuggest(paramInputId, paramUrl1, paramUrl2)
{
	var inputElId = paramInputId;
	var inputEl = document.getElementById(paramInputId);
	
	
	if ( paramUrl1 && paramUrl1 != '' ) {
	//alert('aktivuji naseptavac drive hledanych slov...');
		var suggestEl1 = document.getElementById(paramInputId + '-suggest');
		var url1 = paramUrl1;
	}
	
	if ( paramUrl2 && paramUrl2 != '' )  {
	//alert('aktivuji naseptavac synonym...');
		var suggestEl2a = document.getElementById(paramInputId + '-synonym-suggest-a');
		//var suggestEl2b = document.getElementById(paramInputId + '-synonym-suggest-b');
		
		var suggestEl2box = document.getElementById('synonym-suggest-box');

		var url2 = paramUrl2;
	}
	
	
	var dataTimeoutId = null;
	var hideTimeoutId = null;
	
	var request1 = null;
	var request2 = null;

	var data1 = [];
	
	var data2a = [];
	var data2b = [];
	
	var selectedItem = null;

	var maxCount = 10;
	
	// initializace
	init();
	
	// pokud vstup obsahuje nejaka data, je hned spusten dotaz pro naseptavac synonym
	

	if (inputEl.value != '') {
	
		
			
			// zrušení předchozího požadavku
			if (request2) {
				request2.abort();
				request2 = null;
			}
			
			// naseptavac 2
			if(url2) {
				try {
					
					request2 = getRequest();
					request2.open('GET', url2 + '?&out=json&q=' + inputEl.value, true);
					request2.onreadystatechange = function() {
						if (request2.readyState == 4) {
							try {
								if (request2.status == 200) {
								    try {
								        eval('data2a = (' + request2.responseText + ');');
								        //eval('data2b = (' + request2.responseText + ');');
								        
										show('synonym-suggest');
									} catch (e) {
									    // chybná data od serveru
									}
								}
							} catch (e) {
							    // výjimka vyhozená po abort
							}
						}
					};
					request2.send(null);
				} catch (e) {
					// nepodařilo se vytvořit XMLHttpRequest
					//alert('nepodařilo se vytvořit XMLHttpRequest');
				}
			}
			
		
			
	}


	

	/**
	 * Nastaví našeptávač.
	 *
	 * @access private
	 */
	function init()
	{
		
		// initializace textového pole
	    inputEl.onkeyup = inputKeyUp;
	    if (document.all) {
	        inputEl.onkeydown = inputKeyDown;
	    } else {
	        inputEl.onkeypress = inputKeyDown;
	    }
	    inputEl.onclick = unselectItem;
	    inputEl.onblur = function() {hideTimeoutId = window.setTimeout(hide, 500);}

		
		// initializace našeptávače
		
		if(url1) {
			var list = document.createElement('ul');
			for (var i = 0; i < maxCount; i++) {
				var item = document.createElement('li');
			    item.onclick = suggestItemClick;
				item.onmouseover = suggestItemOver;
				item.onmouseout = suggestItemOut;
				list.appendChild(item);
			}
			suggestEl1.innerHTML = '';
			suggestEl1.appendChild(list);
		}

		
		// initializace našeptávače 2
		if(url2) {
			var list = document.createElement('ul');
			for (var i = 0; i < maxCount; i++) {
				var item = document.createElement('li');
			    //item.onclick = suggestItemClick;
				item.onmouseover = suggestItemOver;
				item.onmouseout = suggestItemOut;
				list.appendChild(item);
			}
			suggestEl2a.innerHTML = '';
			suggestEl2a.appendChild(list);
			
			// vychozi text:
			var item_a = suggestEl2a.firstChild.childNodes[0];
				item_a.innerHTML = 'Nejdříve zadejte hledaný výraz...';
				item_a.style.display = 'inline';
			suggestEl2box.style.display = 'block';
			
			/*
			var list = document.createElement('ul');
			for (var i = 0; i < maxCount; i++) {
				var item = document.createElement('li');
			    //item.onclick = suggestItemClick;
				item.onmouseover = suggestItemOver;
				item.onmouseout = suggestItemOut;
				list.appendChild(item);
			}
			suggestEl2b.innerHTML = '';
			suggestEl2b.appendChild(list);
			*/
		}
		
	};

	/**
	 * Ochytává puštění klávesy v textovém poli.
	 *
	 * @access private
	 * @param Event event
	 */
	function inputKeyUp(event)
	{
	    event = event || window.event;  // IE
		switch (event.keyCode) {
		case 13:    // enter
		case 17:    // ctrl
		case 18:    // alt
		case 27:    // escape
		case 44:    // print screen
		case 45:    // insert
		    break;
		case 8:    // backspace
		case 46:    // delete
            window.clearTimeout(dataTimeoutId);
            unselectItem();
            dataTimeoutId = window.setTimeout(getData, 100);
            break;
		default:
		    if (event.keyCode > 40) {
	            window.clearTimeout(dataTimeoutId);
	            dataTimeoutId = window.setTimeout(getData, 250);
			}
		}
	};
	
	/**
	 * Ochytává stisk klávesy v textovém poli.
	 *
	 * @access private
	 * @param Event event
	 */
	function inputKeyDown(event)
	{
	    event = event || window.event;  // IE
		switch (event.keyCode) {
		case 13:    // enter
		case 39:    // doprava
	        if (selectedItem) {
	            inputEl.value = selectedItem.firstChild.nodeValue;
	            if (event.keyCode != 13) {    // enter spustí vyhledávání, není potřeba našeptávač
					getData();
				}
	        }
		    return true;
		case 38:    // nahoru
		case 40:    // dolů
		    selectItem(event.keyCode);
		    return false;
		case 27:    // escape
		    hide();
		    return true;
		default:
		    return true;
		}
	};
	
	/**
	 * Načte data ze serveru.
	 *
	 * @access private
	 */
	function getData()
	{

		// zrušení předchozího požadavku
		if (request1) {
			request1.abort();
			request1 = null;
		}

		// zrušení předchozího požadavku
		if (request2) {
			request2.abort();
			request2 = null;
		}	

        if (inputEl.value) {
			
			// naseptavac 1
			if(url1) { 
				try {
					
					request1 = getRequest();
					request1.open('GET', url1 + '?&out=json&q=' + inputEl.value, true);
					request1.onreadystatechange = function() {
						if (request1.readyState == 4) {
							try {
								if (request1.status == 200) {
								    try {
										eval('data1 = (' + request1.responseText + ');');
										show('suggest');
									} catch (e) {
									    // chybná data od serveru
									    //alert('chybná data od serveru');
									}
								}
							} catch (e) {
							    // výjimka vyhozená po abort
							    //alert('výjimka vyhozená po abort');
							}
						}
					};
					request1.send(null);
				} catch (e) {
					// nepodařilo se vytvořit XMLHttpRequest
					//alert('nepodařilo se vytvořit XMLHttpRequest');
				}
			}
			
			
			
		
		
			// naseptavac 2
			if(url2) {
				try {
					
					request2 = getRequest();
					request2.open('GET', url2 + '?&out=json&q=' + inputEl.value, true);
					request2.onreadystatechange = function() {
						if (request2.readyState == 4) {
							try {
								if (request2.status == 200) {
								    try {
								        eval('data2a = (' + request2.responseText + ');');
								        //eval('data2b = (' + request2.responseText + ');');
								        
										show('synonym-suggest');
									} catch (e) {
									    // chybná data od serveru
									}
								}
							} catch (e) {
							    // výjimka vyhozená po abort
							}
						}
					};
					request2.send(null);
				} catch (e) {
					// nepodařilo se vytvořit XMLHttpRequest
					//alert('nepodařilo se vytvořit XMLHttpRequest');
				}
			}
		
			
        } else {
            hide();
		}
	};

	/**
	 * Zobrazí našeptávač.
	 *
	 * @access private
	 */
	function show(mode)
	{
        // v MSIE 6 zneviditelnim SELECTy
        var browser = navigator.appName;
		var version = navigator.appVersion;
		//alert('browser: '+browser+' a verze: '+version);
		if (browser == "Microsoft Internet Explorer" && version.indexOf("MSIE 6.")!=-1) {
			var selects = document.getElementsByTagName('select');
			for(var i = 0; i < selects.length; i++){
				selects[i].style.visibility = 'hidden';
			}		
		}


        
		
		//alert(mode);
		window.clearTimeout(hideTimeoutId);
        var show = false;

		if (mode == 'synonym-suggest') {

			for (var i = 0; i < maxCount; i++) {
	            var item_a = suggestEl2a.firstChild.childNodes[i];
	            if (data2a[i]) {
					if ( (i+1) == maxCount || !data2a[(i+1)]) {
						item_a.innerHTML = '<a href="#" onclick="document.getElementById(\'' + inputElId + '\').value += \'|'+data2a[i][0] + '\'; return false;">'+data2a[i][0]+'</a>';
					}
					else {
						item_a.innerHTML = '<a href="#" onclick="document.getElementById(\'' + inputElId + '\').value += \'|'+data2a[i][0] + '\'; return false;">'+data2a[i][0]+'</a>, ';
					}
					item_a.style.display = 'inline';
	                show = true;
	            } else {
	                item_a.innerHTML = '';
	                item_a.style.display = 'none';
	            }
	        }
	        
	        /*
	        for (var i = 0; i < maxCount; i++) {
	            var item_b = suggestEl2b.firstChild.childNodes[i];
				if (data2b[i]) {
					item_b.innerHTML = ' <a href="#" onclick="document.getElementById(\'' + inputElId + '\').value += \' +'+data2b[i][0] + '\'; return false;">'+data2b[i][0]+'</a> ';
	                item_b.style.display = 'inline';
	                show = true;
	            } else {
	                item_b.innerHTML = '';
	                item_b.style.display = 'none';
	            }
	        }
	        */
	        
	        
	        if (show) {
				//suggestEl2a.style.display = 'block';
				//suggestEl2b.style.display = 'block';
				suggestEl2box.style.display = 'block';
				//alert(suggestEl2a.innerHTML);
			} else {
		        unselectItem();
				//suggestEl2box.style.display = 'none';
				
				suggestEl2box.style.display = 'block';
				var item_a = suggestEl2a.firstChild.childNodes[0];
					item_a.innerHTML = 'Nebyla nalezena žádná synonyma...';
					item_a.style.display = 'inline';
				//suggestEl2a.innerHTML = 'Nebyla nalezena žádná synonyma...';
				//suggestEl2b.innerHTML = 'Nebyla nalezena žádná synonyma...';
				
			}
					
		}
		
		if (mode == 'suggest') {
	        for (var i = 0; i < maxCount; i++) {
	            var item = suggestEl1.firstChild.childNodes[i];
	            
	            if (data1[i]) {
					item.innerHTML = data1[i][0] + '<span>' + data1[i][1] + 'x</span>';
	                item.style.display = 'block';
	                show = true;
	            } else {
	                item.innerHTML = '';
	                item.style.display = 'none';
	            }
	        }
	        if (show) {
				suggestEl1.style.display = 'block';
			} else {
		        unselectItem();
				suggestEl1.style.display = 'none';
			}		
		}
		
        
        
	};

	/**
	 * Vybere položku našeptávače.
	 *
	 * @access private
	 * @param integer keyCode kód klávesy
	 */
	function selectItem(keyCode)
	{
        if (data1.length > 0) {
            if (selectedItem) {
                selectedItem.className = '';
                if (keyCode == 40) {	// dolů
                    selectedItem = (selectedItem == suggestEl1.firstChild.childNodes[data1.length - 1])
						? suggestEl1.firstChild.childNodes[0]
						: selectedItem.nextSibling;						
                } else {    // nahoru
                    selectedItem = (selectedItem == suggestEl1.firstChild.childNodes[0])
						? suggestEl1.firstChild.childNodes[data1.length - 1]
						: selectedItem.previousSibling;
                }
            } else {
                var selectedIndex = (keyCode == 40) ? 0 : data1.length - 1;
                selectedItem = suggestEl1.firstChild.childNodes[selectedIndex];
            }

            selectedItem.className = 'active';
        }
	};

	/**
	 * Zruší výběr položky našeptávače.
	 *
	 * @access private
	 */
	function unselectItem()
	{
        if (selectedItem) {
            selectedItem.className = '';
            selectedItem = null;
        }
	};
	
	/**
	 * Skryje našeptávač.
	 *
	 * @access private
	 */
	function hide()
	{
		// je zde kvůli rychlosti, ačkoliv totéž udělá nasledně volaná funkce show()
        if(url1) {
			unselectItem();
			suggestEl1.style.display = 'none';
	
			data1 = [];
			show(); // protože jsou data prázdná, tak našeptávač promaže a skryje
			
			// v MSIE 6 opetovne zobrazime SELECTy
	        var browser = navigator.appName;
			var version = navigator.appVersion;
			//alert('browser: '+browser+' a verze: '+version);
			if (browser == "Microsoft Internet Explorer" && version.indexOf("MSIE 6.")!=-1) {
				var selects = document.getElementsByTagName('select');
				for(var i = 0; i < selects.length; i++){
					selects[i].style.visibility = 'visible';
				}		
			}
		}
	};

	/**
	 * Kliknutí na položku našeptávače.
	 *
	 * @access private
	 * @param Event event
	 */
	function suggestItemClick(event)
	{
		inputEl.value = this.firstChild.nodeValue;
		//inputEl.form.submit();
		return false;
	};

	/**
	 * Najetí na položku našeptáváče.
	 *
	 * @access private
	 * @param Event event
	 */
    function suggestItemOver(event)
    {
        if (selectedItem) {
            selectedItem.className = '';
        }
        selectedItem = this;
        selectedItem.className = 'active';
    };

	/**
	 * Opuštění položky našeptávače.
	 *
	 * @access private
	 * @param Event event
	 */
    function suggestItemOut(event)
    {
		unselectItem();
	};

	/**
	 * Vrátí instanci XMLHttpRequestu.
	 *
	 * @access private
	 * @return XMLHttpRequest
	 * @throws Error když se nepodaří vytvořit instanci
	 */
	function getRequest()
	{
		
		if (typeof XMLHttpRequest != 'undefined') {
			return new XMLHttpRequest();
		} else {
			
			try {
				return new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e) {
				try {
					return new ActiveXObject('Microsoft.XMLHTTP');
				} catch (E) {
					throw new Error('XMLHttpRequest není dostupný.');
				}
			}
		}
	};
};

