/* 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 strpos (haystack, needle, offset)
{
  var i = (haystack+'').indexOf(needle, (offset || 0));
  return i === -1 ? false : i;
}
								
(function($) {
	$.fn.jSuggest = function(options) {
		// 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 textBoxName=$(textBox).attr('name')+'Data';
		var textVal = this.value;
		var intVal = this.value;
		var empty_result = false;
		var textVal0 = '';
		var intVal0 = '';

		var jC = "#jSuggestContainer";
		
		$("form#search-city").bind("submit",	function(){
						if(textVal == undefined || textVal== '' || textVal.length < opts.minchar || textVal==defaultCitySearchStr) {return false;}
		});
		
		$("body").append('<div id="jSuggestContainer"></div>');
		$(jC).hide();
    
        function UpDn(i)
        {
           jj=$(jC).find(jH);
           $(jH).removeClass(jsH);

           if (i>0)
           {
             if ($(jj).size() == 0) jj=$(jC).find('li')[0];  else
             if ($(jj).nextAll().size() == 1) jj=$(jC).find('li')[0]; else
                  jj=$(jj).next();
           }
             else
           {
             if ($(jj).size() == 0) jj=$(jC).find('li:last').prev(); else
             if ($(jj).prevAll().size() == 0) jj=$(jC).find('li:last').prev(); else
             jj=$(jj).prev();
           }
           $(jj).addClass(jsH);
           $('input[name=searchQueryData]').val($(jj).attr('lang'));
        }

		  $(this).bind("keyup click", function(e){
			textBox = this;
			textVal = this.value;

            textVal0 = textVal;
            intVal0 = intVal;





			if (this.value.length >= opts.minchar && $.trim(this.value)!="Search Terms") {
				var offSet = $(this).offset();
				
				$(jC).css({
					position: "absolute",
					top: offSet.top - 1 + $(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();
				}

                else
				if (e.keyCode == 38 ) {
					UpDn(-1);
					
				}
                else
				if (e.keyCode == 40 ) {
						UpDn(+1);
						
				}

				// new query detected
				else if (textBox.value != iniVal && 
									!( iniVal != undefined && empty_result && 
									iniVal == textBox.value.substr(0, iniVal.length) && textBox.value.length > iniVal.length ) 
								)
				{
					iniVal = textBox.value;
					if ($(".jSuggestLoading").length==0)
						$('<div class="jSuggestLoading"><img src="'+opts.loadingImg+'" align="bottom" /> '+ opts.loadingText+'</div>').prependTo("#jSuggestContainer");
					
					$(".jSuggestLoading").show();
					$(jC).find('ul').remove();
					
					if (opts.data == '')
						opts.data = $(this).serialize();
					else{
						var par = opts.data.substr(0,strpos(opts.data, '=') );
						if(par == '') par = opts.data;
						opts.data = par + "=х" + $(this).val();
          }
          $('input[name=searchQueryData]').val('');
					// optimize server performance by loading at intervals

					setTimeout(function () {
						$.ajax({
							type: opts.type,
							url: opts.url,
							data: opts.data,
							success: function(msg){
                    			$(jC).find('ul').remove();
                    			$(jC).append('<ul></ul>');
							  var e = eval( "(" + msg + ")" );
								$(jC).find('ul li').remove();
                                for (i in e)
                                {
                                	if(i == 'empty_msg' || i == 'all') continue;
                                	$(jC).find('ul').append('<li lang="'+i+'">'+e[i]+'</li>');
                                }
                //Добавляем кнопку "показать всё"
                if(e['empty_msg'] == undefined && e['all'] != undefined) 
                		$(jC).find('ul').append('<li lang="all" class="suggestAllResults">'+e['all']+'</li>');
                
								$("#jSuggestContainer ul li").bind("mouseover",	function(){
										$(jH).removeClass(jsH);
										$(this).addClass(jsH);
										textVal = $(this).text();
                                        intVal = $(this).attr('lang');
										if (opts.autoChange)
                                        {
                                            $(textBox).val($(jH).text());
                                            $('input[name=searchQueryData]').val(intVal);
                                        }

								});
								$("#jSuggestContainer ul li").click(function(){
											$(this).addClass(jsH);
											if(intVal != 'all')
											{
												$(textBox).val(textVal);
		                    $('input[name=searchQueryData]').val(intVal);
		                    textVal0=textVal;
		                  }
		                    intVal0=intVal;
		            //!!!!!! Передаём форму по клику !!!!!!!!!!      
											document.forms["search-city"].submit();																	
								});
								$(".jSuggestLoading").hide();
																if(e['empty_msg'] != undefined){
																		$("#jSuggestContainer ul").append('<li class="suggestEmpty">'+e['empty_msg']+'</li>');
																		empty_result = true;
																}
																else empty_result = false;
                                $("#jSuggestContainer ul").append('<li class="suggestClose"><span>'+defaultCitySearchClose+'</span></li>');
                                $("#jSuggestContainer ul li.suggestClose").click(function(){
									$(textBox).val(textVal0);
                                    $('input[name=searchQueryData]').val(intVal0);
                                    textVal=textVal0;
                                    intVal=intVal0;
								});
								$("#jSuggestContainer ul li.suggestClose").bind("mouseover",	function(){
										$(jH).removeClass(jsH);
									$(textBox).val(textVal0);
                                    $('input[name=searchQueryData]').val(intVal0);
                                    textVal=textVal0;
                                    intVal=intVal0;

								});
							}
						});
					}, 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: 3,
		opacity: 1.0,
		zindex: 20000,
		delay: 30,
		loadingImg: '/static/app/ajax-loader.gif',
		loadingText: defaultCitySearchLoadingText,
		autoChange: false,
		url: "",
		type: "GET",
		data: ""
	};

})(jQuery);