(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);
