/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Copyright notice and license must remain intact for legal use
 * jSuggest
 * Version: 1.0 (May 26, 2008)
 * Requires: jQuery 1.2.6+
 */
(function($) {
		  
	$.fn.jSuggest = function(options) {
                $(this).attr('autocomplete', 'off');
		// merge users option with default options
		var opts = $.extend({}, $.fn.jSuggest.defaults, options);		
		var jH = ".jSuggestHover";
		var jsH = "jSuggestHover";
		var iniVal = this.value;
		var textBox = this;
		var textVal = this.value;
		var container_id = Math.round(Math.random() * 135);
		var jC = "#jSuggestContainer"+container_id;
		
		$("body").append('<div id="jSuggestContainer'+container_id+'" class="jSuggestContainerDiv"></div>');
		$(jC).hide();
		$(this).attr('autocomplete', 'off');
                // zabrání odeslání formuláře, pokud vybírám prvek z našeptávače pomocí enteru
                $(this).bind("keydown", function(e) {
                    if (e.keyCode == 13 ) {
                        e.cancelBubble = true;
                        e.returnValue = false;

                        if (e.stopPropagation) {
                            e.stopPropagation();
                            e.preventDefault();
                        }
                    }
                });
		$(this).bind("keyup click", function(e) {
                        this.focus();
			textBox = this;
			textVal = this.value;
			if (this.value.length >= opts.minchar && $.trim(this.value)!="Search Terms") {
				var offSet = $(this).offset();
				
				$(jC).css({
					position: "absolute",
					top: offSet.top + $(this).outerHeight() + "px",
					left: offSet.left,
					width: $(this).outerWidth()-2 + "px",
					opacity: opts.opacity,
					zIndex: opts.zindex
				}).show();
				
				// if escape key
				if (e.keyCode == 27 ) {
					$(jC).hide();
				}
				
				// if enter key
				else if (e.keyCode == 13 ) {
                                    //$(jH).trigger('click');
                                    if ($(jH).length == 1)
                                        $(textBox).val($(jH).text());
                                    $(jC).hide();
                                    var inputId = document.getElementById(this.id+'Id');
                                    var suggest = $(jH).attr('suggest');
                                    if(suggest) {
                                        inputId.value = suggest.id;
                                    } else {
                                        inputId.value = 0;
                                    }
                                    iniVal = textBox.value;
                                    if(opts.updateFakulta) {
                                        if(opts.isSelectBox) {
                                            var schoolId = document.getElementById(opts.skolaInput);
                                        } else {
                                            var schoolId = document.getElementById(opts.skolaInput+'Id');
                                        }
                                        var fakultaInput = document.getElementById(opts.fakultaInput);
                                        fakultaInput.value = '';
                                        var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                        fakultaInputId.value = 0;
                                        $("#"+opts.fakultaInput).unbind($.jSuggest);
                                        $("#"+opts.fakultaInput).jSuggest({
                                            url: _SERVER_PATH+"inc/ajax/skola.php?sid="+parseInt(schoolId.value)+"&action=getListOfFakults",
                                            type: "POST",
                                            data: "keyword",
                                            autoChange: false,
                                            skolaInput: opts.skolaInput,
                                            fakultaInput: opts.fakultaInput,
                                            updateFakulta: false,
                                            updateSubject: opts.updateSubject,
                                            updateTeacher: opts.updateTeacher
                                        });
                                    }
                                    if(opts.updateSubject) {
                                        if(opts.isSelectBox) {
                                            var schoolId = document.getElementById(opts.skolaInput);
                                        } else {
                                            var schoolId = document.getElementById(opts.skolaInput+'Id');
                                        }
                                        var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                        var subjectNameId = document.getElementById('subjectNameId');
                                        subjectNameId.value = 0;
                                        var subjectName = document.getElementById('subjectName');
                                        subjectName.value = '';
                                        $("#subjectName").unbind($.jSuggest);
                                        $("#subjectName").jSuggest({
                                            url: _SERVER_PATH+"inc/ajax/predmety.php?sid=" + parseInt(schoolId.value) + "&action=getListOfSubjects&fid="+parseInt(fakultaInputId.value),
                                            type: "POST",
                                            data: "keyword",
                                            autoChange: false
                                        });
                                    }
                                    if(opts.updateTeacher) {
                                        if(opts.isSelectBox) {
                                            var schoolId = document.getElementById(opts.skolaInput);
                                        } else {
                                            var schoolId = document.getElementById(opts.skolaInput+'Id');
                                        }
                                        var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                        var teacherNameId = document.getElementById('teacherNameId');
                                        teacherNameId.value = 0;
                                        var teacherName = document.getElementById('teacherName');
                                        teacherName.value = '';
                                        $("#teacherName").unbind($.jSuggest);
                                        $("#teacherName").jSuggest({
                                            url: _SERVER_PATH+"inc/ajax/materialy.php?sid=" + parseInt(schoolId.value) + "&action=getListOfTeachers&fid="+parseInt(fakultaInputId.value),
                                            type: "POST",
                                            data: "keyword",
                                            autoChange: false
                                        });
                                    }
                                    if(opts.redirect != '') {
                                        //$("#"+opts.submitForm).attr('action');
                                        window.location.href = opts.redirect+suggest.id;
                                    }
                                    return false;
				}
				// if down arrow
				else if (e.keyCode == 40) {
					// if any suggestion is highlighted
					if ($(jH).length == 1) {
						if (!$(jH).next().length == 0) {
							$(jH).next().addClass(jsH);
							$(".jSuggestHover:eq(0)").removeClass(jsH);
							if (opts.autoChange)
								$(textBox).val($(jH).text());
						}
					}
					else {
						$("#jSuggestContainer"+container_id+" ul li:first-child").addClass(jsH);
						if (opts.autoChange)
							$(textBox).val($(jH).text());
					}
					
				}
				
				// if up arrow
				else if (e.keyCode == 38) {
					// if any suggestion is highlighted
					if ($(jH).length == 1 ) {
						if (!$(jH).prev().length == 0) {
							$(jH).prev().addClass(jsH);
							$(".jSuggestHover:eq(1)").removeClass(jsH);
							if (opts.autoChange)
								$(textBox).val($(jH).text());
						}
						// if is first child
						else {
							$(jH).removeClass(jsH);
							$(textBox).val(iniVal);
						}
					}
				}
				// new query detected
				else if (textBox.value != iniVal) {
                                        var inputId = document.getElementById(this.id+'Id');
                                        $('#'+this.id+'Id').val(0);
					iniVal = textBox.value;
					if ($(".jSuggestLoading").length==0)
						$('<div class="jSuggestLoading"><img src="'+opts.loadingImg+'" align="bottom" /> '+ opts.loadingText+'</div>').prependTo("#jSuggestContainer"+container_id);
					
					$(".jSuggestLoading").show();
					$(jC).find('ul').remove();
					
					var data = '';
					if (opts.data == '')
                                            data = $(this).serialize();
					else 
                                            //opts.data = opts.data + "=" + $(this).val();
                                            data = opts.data + "=" + textBox.value;
					// optimize server performance by loading at intervals
					setTimeout(function () {
						$.ajax({
							type: opts.type,
							url: opts.url,
							data: data,
							dataType:   "json",
							scriptCharset: "utf-8",
							cache: false,
							ifModified: false,
							global: false,
							success: function(data) {
								$(".jSuggestLoading").hide();
								$(jC).find('ul').remove();
								var ul_node = document.createElement("ul");
                                                                // Performs generation of an unique ID
                                                                var genUniqueId = function () {
                                                                    var result = "ul_james_" + Math.round(Math.random() * 424242);
                                                                    if (jQuery("#" + result).length > 0) {
                                                                        result = genUniqueId();
                                                                    }
                                                                    return result;
                                                                };
                                                                ul_id = genUniqueId();
                                                                jQuery(ul_node).attr("id", ul_id).addClass("ul_james");
                                                                                //$(jC).append(ul_node);
                                                                                $(jC).html(ul_node);
                                                                // Creating a shortcut
                                                                var ul_element = jQuery("#" + ul_id);
                                                                values = data.listOfValues;
                                                                if(values.length > 0) {
                                                                    var zobrazeno = 0;
									for (var i in values) {
									   if (values[i] !== null && zobrazeno < opts.resultsShowCount) {
									       var li_elem = document.createElement("li");
									       li_elem.suggest = values[i];
									       textBox.value
									       var myArray = (textBox.value).split(' ');
											 if(myArray.length > 1) {
											 	for(var q=0; q<myArray.length; q++) {
											 		if(myArray[q] != '' && myArray[q] != ' ') {
													 	var re = new RegExp(myArray[q],"i");
													 	if(myArray[q] != 'b' && myArray[q] != 'B') {
														 	values[i].nazev = (values[i].nazev).replace(re,'<b>'+ (values[i].nazev).match(re) + '</b>');
														} else {
															var tmpName = values[i].nazev;
															for(var k=0; k<tmpName.length; k++) {
																if(tmpName.charAt(k) == 'b' || tmpName.charAt(k) == 'B') {
																	if(k < tmpName.length-2) {
																		var nextChar = values[i].nazev.charAt(k+1);
																		if(nextChar != '>') {
																			var firstPart = tmpName.substr(0, k);
																			var middlePart = tmpName.substr(k, 1);
																			var secondPart = tmpName.substr(k+1, tmpName.length-k+1);
																			tmpName = firstPart+'<b>'+middlePart+'</b>'+secondPart;
																			k = k+6;
																		}
																	}
																}
															}
															values[i].nazev = tmpName;
														}
													} 
												}
												// Odstranění prefixů v tučném textu
												var delimiter = '<b>';
												var endDelimiter = '</b>';
												//alert(values[i].nazev);
												var fromIndex = values[i].nazev.indexOf(delimiter);
												while(fromIndex > -1) {
													var tmpIndex = fromIndex;
													fromIndex = values[i].nazev.indexOf(delimiter, tmpIndex + 1);
													var endFromIndex = values[i].nazev.indexOf(endDelimiter, tmpIndex + 1);
													if((fromIndex > -1) && (fromIndex < endFromIndex)) {
														var srch = values[i].nazev.substr(fromIndex, endFromIndex-fromIndex+4);
														var srchReplace = values[i].nazev.substr(fromIndex+3, endFromIndex-fromIndex);
// 														var re = new RegExp(srch,"i");
// 														values[i].nazev = (values[i].nazev).replace(re,srchReplace);
														values[i].nazev.replace(srch, srchReplace);
													}
												}
												jQuery(li_elem).append(values[i].nazev);
											 } else {
												var re = new RegExp(textBox.value,"i");
									       	jQuery(li_elem).append((values[i].nazev).replace(re,'<b>'+ (values[i].nazev).match(re) + '</b>'));
											 }
									       jQuery(ul_element).append(li_elem);
									   }
									   if(zobrazeno == opts.resultsShowCount) {
											var li_elem = document.createElement("li");
											jQuery(li_elem).append('<b>Nenašel jsi to, co jsi hledal? Upřesni prosím zadání!</b>');
											jQuery(ul_element).append(li_elem);
										}
									   zobrazeno++;
									}
								} else {
									var li_elem = document.createElement("li");
									jQuery(li_elem).append('<b>'+ textBox.value + '</b> neodpovídá žádnému záznamu v databázi.');
									jQuery(ul_element).append(li_elem);
								}
                                                                if(opts.updateFakulta) {
                                                                    if(opts.isSelectBox) {
                                                                        var schoolId = document.getElementById(opts.skolaInput);
                                                                    } else {
                                                                        var schoolId = document.getElementById(opts.skolaInput+'Id');
                                                                    }
                                                                    var fakultaInput = document.getElementById(opts.fakultaInput);
                                                                    fakultaInput.value = '';
                                                                    var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                                                    fakultaInputId.value = 0;
                                                                    $("#"+opts.fakultaInput).unbind($.jSuggest);
                                                                    $("#"+opts.fakultaInput).jSuggest({
                                                                        url: _SERVER_PATH+"inc/ajax/skola.php?sid="+parseInt(schoolId.value)+"&action=getListOfFakults",
                                                                        type: "POST",
                                                                        data: "keyword",
                                                                        autoChange: false,
                                                                        skolaInput: opts.skolaInput,
                                                                        fakultaInput: opts.fakultaInput,
                                                                        updateFakulta: false,
                                                                        updateSubject: opts.updateSubject,
                                                                        updateTeacher: opts.updateTeacher
                                                                    });
                                                                }
                                                                if(opts.updateSubject) {
                                                                    if(opts.isSelectBox) {
                                                                        var schoolId = document.getElementById(opts.skolaInput);
                                                                    } else {
                                                                        var schoolId = document.getElementById(opts.skolaInput+'Id');
                                                                    }
                                                                    var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                                                    var subjectNameId = document.getElementById('subjectNameId');
                                                                    subjectNameId.value = 0;
                                                                    var subjectName = document.getElementById('subjectName');
                                                                    subjectName.value = '';
                                                                    $("#subjectName").unbind($.jSuggest);
                                                                    $("#subjectName").jSuggest({
                                                                        url: _SERVER_PATH+"inc/ajax/predmety.php?sid=" + parseInt(schoolId.value) + "&action=getListOfSubjects&fid="+parseInt(fakultaInputId.value),
                                                                        type: "POST",
                                                                        data: "keyword",
                                                                        autoChange: false
                                                                    });
                                                                }
                                                                if(opts.updateTeacher) {
                                                                    if(opts.isSelectBox) {
                                                                        var schoolId = document.getElementById(opts.skolaInput);
                                                                    } else {
                                                                        var schoolId = document.getElementById(opts.skolaInput+'Id');
                                                                    }
                                                                    var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
                                                                    var teacherNameId = document.getElementById('teacherNameId');
                                                                    teacherNameId.value = 0;
                                                                    var teacherName = document.getElementById('teacherName');
                                                                    teacherName.value = '';
                                                                    $("#teacherName").unbind($.jSuggest);
                                                                    $("#teacherName").jSuggest({
                                                                        url: _SERVER_PATH+"inc/ajax/materialy.php?sid=" + parseInt(schoolId.value) + "&action=getListOfTeachers&fid="+parseInt(fakultaInputId.value),
                                                                        type: "POST",
                                                                        data: "keyword",
                                                                        autoChange: false
                                                                    });
                                                                }
								//$(jC).append(msg);
								$("#jSuggestContainer"+container_id+" ul li").bind("mouseover",	function(){
                                                                    $(jH).removeClass(jsH);
                                                                    $(this).addClass(jsH);
                                                                    textVal = $(this).text();
                                                                    if (opts.autoChange)
                                                                            $(textBox).val($(jH).text());
								});
								$("#jSuggestContainer"+container_id+" ul li").click(function(){
									$(this).addClass(jsH);
									$(textBox).val(textVal);
									var inputId = document.getElementById($(textBox).attr('id')+'Id');
									var suggest = $(this).attr('suggest');
									if(suggest) {
										inputId.value = suggest.id;
									} else {
										inputId.value = 0;
									}
									if(opts.updateFakulta) {
										if(opts.isSelectBox) {
											var schoolId = document.getElementById(opts.skolaInput);
										} else {
											var schoolId = document.getElementById(opts.skolaInput+'Id');
										}
										var fakultaInput = document.getElementById(opts.fakultaInput);
										fakultaInput.value = '';
										var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
										fakultaInputId.value = 0;
										$("#"+opts.fakultaInput).unbind($.jSuggest);
										$("#"+opts.fakultaInput).jSuggest({
											url: _SERVER_PATH+"inc/ajax/skola.php?sid="+parseInt(schoolId.value)+"&action=getListOfFakults",
											type: "POST",
											data: "keyword",
											autoChange: false,
											skolaInput: opts.skolaInput,
											fakultaInput: opts.fakultaInput,
											updateFakulta: false,
											updateSubject: opts.updateSubject,
											updateTeacher: opts.updateTeacher
										});
									}
									if(opts.updateSubject) {
										if(opts.isSelectBox) {
											var schoolId = document.getElementById(opts.skolaInput);
										} else {
											var schoolId = document.getElementById(opts.skolaInput+'Id');
										}
										var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
										var subjectNameId = document.getElementById('subjectNameId');
										subjectNameId.value = 0;
										var subjectName = document.getElementById('subjectName');
										subjectName.value = '';
										$("#subjectName").unbind($.jSuggest);
										$("#subjectName").jSuggest({
											url: _SERVER_PATH+"inc/ajax/predmety.php?sid=" + parseInt(schoolId.value) + "&action=getListOfSubjects&fid="+parseInt(fakultaInputId.value),
											type: "POST",
											data: "keyword",
											autoChange: false
										});
									}
									if(opts.updateTeacher) {
										if(opts.isSelectBox) {
											var schoolId = document.getElementById(opts.skolaInput);
										} else {
											var schoolId = document.getElementById(opts.skolaInput+'Id');
										}
										var fakultaInputId = document.getElementById(opts.fakultaInput+'Id');
										var teacherNameId = document.getElementById('teacherNameId');
										teacherNameId.value = 0;
										var teacherName = document.getElementById('teacherName');
										teacherName.value = '';
										$("#teacherName").unbind($.jSuggest);
										$("#teacherName").jSuggest({
											url: _SERVER_PATH+"inc/ajax/materialy.php?sid=" + parseInt(schoolId.value) + "&action=getListOfTeachers&fid="+parseInt(fakultaInputId.value),
											type: "POST",
											data: "keyword",
											autoChange: false
										});
									}
									if(opts.redirect != '') {
										//$("#"+opts.submitForm).attr('action');
										window.location.href = opts.redirect+suggest.id;
									}
								});
							},
							error: function (XMLHttpRequest, textStatus, errorThrown) {
							  alert(textStatus+': '+errorThrown);
							}
						});
					}, opts.delay);
				}
			}
			// if text is too short do nothing and hide everything
			else {
				$(jH).removeClass(jsH);
				$(jC).hide();
			}
			
			// no bubbling, click is binded to textBox to prevent document bind from firing
			return false;
		});
		
		// why no use $(this).blur ?, because jSuggest box is hidden before click fires so this is the only way to do it
		// alternate way is to say that text blur will fire before$("#jSuggestContainer ul li") click.
		$(document).bind("click", function(){
			$(jC).hide();
			iniVal = textBox.value;
		});

	};
	
	$.fn.jSuggest.defaults = {
		minchar: 1,
		resultsShowCount: 10,
		opacity: 1.0,
		zindex: 2147483583,
		delay: 10,
		loadingImg: 'images/podklad/jsuggest/ajax-loader.gif',
		loadingText: 'Načítám...',
		autoChange: false,
		url: "",
		type: "GET",
		data: "",
		skolaInput: "",
		fakultaInput: "",
		isSelectBox: false,
		updateFakulta: false,
		updateSubject: false,
		updateTeacher: false,
		onclick: false,
		input: '',
		redirect: ''
	};
		
	
		  

})(jQuery);
