var Suggest = function(id, localconfig){

	// Definitionen der benötigten Keys
	var KEY_END         = 35;
	var KEY_HOME        = 36;    
	var KEY_LEFT        = 37;
	var KEY_UP          = 38;
	var KEY_RIGHT       = 39;
	var KEY_DOWN        = 40;
	var KEY_SPACE       = 32;
	var KEY_ESC         = 27;
	var KEY_BACKSPACE   = 8;
	var KEY_TAB         = 9;
	var KEY_RETURN	  	= 13;
	var config = localconfig;
	
  /**
   * Konstruktor
   */
  this.init = function(id){
    // Suchfeld vorbereiten
    with ($("#"+id)){
      attr({"aria-autocomplete": "true", "autocomplete": "off"});
      keyup(function(e){
        var c = e.keyCode > 0 ? e.keyCode : e.which;
        if ($(this).typeKey(c, id) == false){
          e.preventDefault();
          return false;
        }
      });
      focus(function(){
        if ($("#"+id+"-suggest li").size() > 0) $("#"+id+"-suggest").attr("aria-hidden", "false").fadeIn("fast");
      });
      blur(function(){
        $("#"+id+"-suggest").attr("aria-hidden", "true").fadeOut("fast");
      });
    }
    
    // Suggest-Flyout vorbereiten
    $("#"+id+"-suggest").attr("aria-live", "polite");
    with ($("#"+id+"-suggest a")){
      attr("tabindex", "-1");
      
      // Klick-Event
      live("click", function(e){
        $("#"+id).attr("value", $(this).text());
        $("#"+id+"-suggest").attr("aria-hidden", "true").fadeOut("fast");
        e.preventDefault();
        return false;
      });
      
      // Fokus unterbinden
      live("focus", function(e){
        e.preventDefault();
        return false;
      });
      
      // Hover-Event
      live("hover", function(e){
        $(this).setSelection(e);
      });
    }
  }
  this.init(id); // Ausführen
  
  /**
   * Eingabe von Text oder Steuerzeichen im Suchfeld
   */
	$.prototype.typeKey = function(c, id){
	  var text = $("#"+id).val();

	  if (text.length > 0){
	    var sel = $("#"+id+"-suggest a.selected");
	    
      switch (c){
        
        // Pfeil abwärts
        case KEY_DOWN:
          if (sel.size() == 0){
            $("#"+id+"-suggest ul li:eq(1) a").insertSelection(id);
          } else {
            sel.attr("aria-selected", "false").removeAttr("class");
            if (sel.parent().is(":last-child")) $("#"+id+"-suggest ul li:first-child a").insertSelection(id);
            else sel.parent().next().children("a").insertSelection(id);
          }
          return false;
          
        // Pfeil aufwärts
        case KEY_UP:
          if (sel.size() == 0){
            $("#"+id+"-suggest ul li:last-child a").insertSelection(id);
          } else {
            sel.attr("aria-selected", "false").removeAttr("class");
            if (sel.parent().is(":first-child")) $("#"+id+"-suggest ul li:last-child a").insertSelection(id);
            else sel.parent().prev().children("a").insertSelection(id);
          }
          return false;
          
        // Escape
        case KEY_ESC:
          $("#"+id+"-suggest").attr("aria-hidden", "true").fadeOut("fast");
          break;
          
        // Return
        case KEY_RETURN:
          if ($("#"+id+"-suggest a.selected").size() > 0){
            $("#"+id).attr("value", $("#"+id+"-suggest a.selected").text());
          }
          $("#"+id+"-suggest").attr("aria-hidden", "true").fadeOut("fast");
          break;
          
        // Texteingabe
        default:
          var url = config.path + config.suggest + text + config.suffix;
          $(this).insertSuggestInto(url, "#"+id+"-suggest");
      }
	  } else {
	    $("#"+id+"-suggest").attr("aria-hidden", "true").fadeOut("fast");
	  }
	};
  
  /**
   * Bei Arrowkeys die Selektion einfügen
   */
	$.prototype.insertSelection = function(id){
	  $("#"+id+"-suggest li a").attr("aria-selected", "false").removeAttr("class");
	  $(this).attr({"aria-selected": "true", "class": "selected"});
	  $("#"+id).attr("value", $(this).text());
	};

  /**
   * Bei Mouseover die Selektion anpassen
   */
	$.prototype.setSelection = function(e){
    $(this).parent().parent().find("li a").attr("aria-selected", "false").removeAttr("class");
	  if (e.type !== 'mouseout') $(this).attr({"aria-selected": "true", "class": "selected"});
	};
	
}

/**
 * AJAX-Call; Stellt das Inner-HTML eines Sourcefiles im Zielcontainer dar
 * @param sourcefile    Quelle der Datei (Root ist das Root des Dokuments)
 * @param targetcontainer ID oder Klassenname des Zielcontainers 
 */
$.prototype.insertSuggestInto = function(source, targetcontainer) {
  $.ajax({
      url:	source,
      type:	'GET',
      async:	true,
      success: function(d) {
        $(targetcontainer).html(d).attr("aria-hidden", "false").fadeIn("fast");
      },
      error:	function() {
        $(targetcontainer).html("").attr("aria-hidden", "true").fadeOut("fast");
      }
  }); 
};

if ($){
  $(document).ready(function(){
    $("#search input.submit").after('<div id="header-form-search-keywords-suggest" class="suggest" aria-hidden="true"></div>');
		var hs = new Suggest("header-form-search-keywords", {path: "bsp-ajax/", suggest: "", suffix: ".html"});	// Für Suchformular im Header
		$("#form-search-keywords").after('<div id="form-search-keywords-suggest" class="suggest" aria-hidden="true"></div>');
		var cs = new Suggest("form-search-keywords", {path: "bsp-ajax/", suggest: "", suffix: ".html"});	// Für Suchformular im Content
	});
}

