(function($) {
	$.ffSuggest = {
		defaults: {
	      url: '/media/ff/suggest.php',
	      showIn: '#suggestLayer',
	      max: 5,
	      parameter: '&channel=hamburg_de&format=json',
	      hoverClass: 'hover',
	      hoverElements: 'tr'
		},
	    searchField: '',
	    query: '',
	    request: '',
	    hideable: true
	};

	$.fn.extend({
		ffSuggest: function(settings) {
			// apply defaults
		   settings = $.extend({}, $.ffSuggest.defaults, settings);
	       $.ffSuggest.searchField = $(this);
	
	       return this.data('suggestSettings', settings).each(_initFFSuggest);
		}
	});

	function _initFFSuggest() {
		var settings = $(this).data("suggestSettings");
		
	    $(settings.showIn).hover(function() {
	      $.ffSuggest.hideable = false;
	    }, function () {
	      $.ffSuggest.hideable = true;
	    });
	    
	    $(this).keyup(_reloadData)
	      .focus(function() {_showLayer(settings)})
	      .blur(function() {_hideLayer(settings)})
	      .keydown(function(ev) {_skipThroughResults(settings, ev)});
	    $(settings.showIn).find(settings.hoverElements).live('mouseover', function() {
	      $('.hover').removeClass('hover');
	      $(this).parents(settings.hoverElements).addClass('hover');
	      //$(settings.hoverElements).addClass('hover');
	    }).live('mouseout', function() {
	      $(this).parents(settings.hoverElements).removeClass('hover');
	      //$(settings.hoverElements).removeClass('hover');
	    })
	}

  function _reloadData() {
	  var s = $(this).data('suggestSettings');
	  _getDataArray(s);
  }

  function _fillLayer(content, s) {
    $(s.showIn).html(content);
  }

  function _showLayer(s) {
    if($.ffSuggest.searchField.val() != '' && ($(s.showIn).children('table').html() != '' && $(s.showIn).html() != '')) {
      $(s.showIn).show();
    } else {
      _hideLayer(s);
    }
  }

  function _hideLayer(s) {
    if($.ffSuggest.hideable) {
      $(s.showIn).hide();
    }
  }

  function _getDataArray(settings) {
    //outputArray = new Array();
    query = $.ffSuggest.searchField.val();
    if($.ffSuggest.query != query) {
      $.ffSuggest.query = $.ffSuggest.searchField.val();
      
      /*
      if( $.ffSuggest.request != '') {
        $.ffSuggest.request.abort();
      }*/

      $.ffSuggest.request = $.ajax({
        url: settings.url,
        data: 'q='+escape(query)+settings.parameter,
        success: function(data) {
          _fillLayer(data, settings);
          _showLayer(settings);
          $.ffSuggest.request = '';
        }
      });
    }
  }

  function _skipThroughResults(s, e) {
    if(e.which == 40) {
      _moveDown(s);
    } else if (e.which == 38) {
      _moveUp(s);
    } else if (e.which == 13) {
      _submit(s);
      e.preventDefault();
    }
  }

  function _moveDown(s) {
    // select next item
    if($(s.showIn).find('.'+s.hoverClass).is('*') && $(s.showIn).find('.'+s.hoverClass).next(s.hoverElements).is('*')) {
      $(s.showIn).find('.'+s.hoverClass).removeClass(s.hoverClass).next(s.hoverElements).addClass(s.hoverClass);
    } else {
      $(s.showIn).find('.'+s.hoverClass).removeClass(s.hoverClass);
      $(s.showIn).find(s.hoverElements+':first').addClass(s.hoverClass);
    }
  }

  function _moveUp(s) {
    // select previous item
    if($(s.showIn).find('.'+s.hoverClass).is('*') && $(s.showIn).find('.'+s.hoverClass).prev(s.hoverElements).is('*')) {
      $(s.showIn).find('.'+s.hoverClass).removeClass(s.hoverClass).prev(s.hoverElements).addClass(s.hoverClass);
    } else {
      $(s.showIn).find('.'+s.hoverClass).removeClass(s.hoverClass);
      $(s.showIn).find(s.hoverElements+':last').addClass(s.hoverClass);
    }
  }

  function _submit(s) {

    if($(s.showIn).find('.'+s.hoverClass).is('*')) {
      linkTo = $(s.showIn).find('.'+s.hoverClass).find('a').attr('href');
      window.location.href = linkTo;
    } else {
      $($.ffSuggest.searchField).parents('form#search_mini_form').submit();
    }
  }
})(jQuery);

