/* 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) {
    // 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 jC = "#jSuggestContainer";
    var jF = "#jSuggestFix";
		
    $("body").append('<div id="jSuggestContainer"></div><iframe id="jSuggestFix"></iframe>');
    $(jC).hide();
    $(jF).hide();
    // Disable further handling of keypress if the div is shown and the
    // list is not-empty, in order to avoid form submission when ENTER
    // is pressed on one item
    $(this).bind("keypress", function(e){
      if ( e.keyCode == 13 && $(jC).css('display') != 'none'
        && $(jC).find('ul').children('li').length != 0
        ) {
        return false;
      }
    });
    $(this).bind("keyup click", function(e){
      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();
        $(jF).css({
          position: "absolute",
          top: offSet.top + $(this).outerHeight() + "px",
          left: offSet.left,
          width: $(this).outerWidth()-2 + "px",
          opacity: opts.opacity,
          zIndex: opts.zindex-1,
          border: 0
        }).show();
				
        // if escape key
        if (e.keyCode == 27 ) {
          $(jC).hide();
        }
				
        // if enter key
        else if (e.keyCode == 13 ) {
          if ($(jH).length == 1)
            loc_type = $(jH).attr("class").match(/(\bcity\b|\bcommune\b)/)[1];
          loc_id = $(jH).attr("id").match(/[a-z]*(\d*)/)[1];
          $("#form_loc_id").val(loc_id);
          $("#form_loc_type").val(loc_type);
          $("#form_old_location").val($(jH).text());

          $(textBox).val($(jH).text());
          $(jC).hide();
          iniVal = textBox.value;
        }
        // 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 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){
          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();
          $(jF).height($(".jSuggestLoading").height() * 2);
          if (opts.data == '')
            opts.reqdata = $(this).serialize();
          else
            opts.reqdata = opts.data + "=" + $(this).val();
          // optimize server performance by loading at intervals
          setTimeout(function () {
            $.ajax({
              type: opts.type,
              url: opts.url,
              data: opts.reqdata,
              success: function(msg){
                $(jC).find('ul').remove();
                $(jC).append(msg);
                $("#jSuggestContainer ul li").bind("mouseover",	function(){
                  $(jH).removeClass(jsH);
                  $(this).addClass(jsH);
                  textVal = $(this).text();
                  if (opts.autoChange)
                    $(textBox).val($(jH).text());
                });
                $("#jSuggestContainer ul li").click(function(){
                  loc_type = $(jH).attr("class").match(/(\bcity\b|\bcommune\b)/)[1];
                  loc_id = $(jH).attr("id").match(/[a-z]*(\d*)/)[1];
                  $("#form_loc_id").val(loc_id);
                  $("#form_loc_type").val(loc_type);
                  $("#form_old_location").val($(jH).text());

                  $(this).addClass(jsH);
                  $(textBox).val(textVal);
                });
                $(".jSuggestLoading").hide();
                $(jF).height($(jC).height());
              }
            });
          }, opts.delay);
        }
      }
      // if text is too short do nothing and hide everything
      else {
        $(jH).removeClass(jsH);
        $(jC).hide();
        $(jF).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();
      $(jF).hide();
      iniVal = textBox.value;
    });

  };
	
  $.fn.jSuggest.defaults = {
    minchar: 3,
    opacity: 1.0,
    zindex: 20000,
    delay: 500,
    loadingImg: 'fileadmin/templates/nea-sozial/img/ajax-loader.gif',
    loadingText: 'Loading...',
    autoChange: false,
    url: "",
    type: "GET",
    data: ""
  };
		
	
		  

})(jQuery);
