var MIN_AJAX_SEARCH_LENGTH = 3;
var SEARCH_RESULTS_ID = 'ajaxSearchResults';
var KEYCODE_ENTER = 13;
var KEYCODE_UP = 38;
var KEYCODE_DOWN = 40;
var KEYCODE_ESC = 27;
var KEYCODE_LEFT = 37;
var KEYCODE_RIGHT = 39;
var KEYCODE_HOME = 36;
var KEYCODE_END = 35;
var KEYCODE_SHIFT = 16;
var ajaxResultData = [];
var ajaxSearchTimeout;

if (OPENCART_VERSION < 1.5) {
  var searchInputSelector = '#filter_keyword';
  var searchButtonSelector = '.div10 .button';
  var searchResultsContainerSelector = ".div9";
} else {
  var searchInputSelector = '#header input[name=\'filter_name\']';
  var searchButtonSelector = '.button-search';
  var searchResultsContainerSelector = "#search";
}

function doAjaxSearch(keywords)
{
	if (keywords.length < MIN_AJAX_SEARCH_LENGTH) {
		hideAjaxSearchResults();
		return;
	}

  if (OPENCART_VERSION < 1.5)
    var keyword_key = 'keyword';
  else
    var keyword_key = 'filter_name';

	$.ajax({
		url : 'index.php?route=product/search&ajax=1&' + keyword_key + '=' + encodeURI(keywords),
		dataType : 'json',
		success : function(result)	{
			if (!result.length) return;
			showAjaxSearchResults(result);
		}
	});
}

function showAjaxSearchResults(data)
{
	ajaxResultData = data;

	$('#' + SEARCH_RESULTS_ID).remove();
	var resultsElem = $('<div id="'+SEARCH_RESULTS_ID+'"><ul></ul></div>');

	for (var i in data) {
    if (i >= IMPROVED_SEARCH_AJAX_MAX_RESULTS) break;
		var result = data[i];
		var resultElem = $('<li/>').addClass('ajax_result_item').data('id', result.product_id);

    var html = '';
    if (IMPROVED_SEARCH_AJAX_THUMBNAILS)
    {
      html += '<div class="image"><img src="' + result.thumb + '" /></div>';
    }
    html += '<div class="name">'+result.name;
    if (IMPROVED_SEARCH_AJAX_MODEL)
    {
      html += ' <span class="model">(' + result.model + ')</span>';
    }
    html += '</div>';

    if (IMPROVED_SEARCH_AJAX_DESCRIPTIONS)
    {
      html += '<div class="description">' + result.description + '</div>';
    }
    if (IMPROVED_SEARCH_AJAX_PRICE)
    {
      html += '<div class="price">';
      if (!result.special) {
        html += result.price;
      } else {
        html += '<span class="price-old">' + result.price + '</span> <span class="price-new">' + result.special + '</span>';
      }
      if (result.tax) {
        html += '<br /><span class="price-tax">' + TEXT_TAX + ' ' + result.tax + '</span>';
      }
      html += '</div>';
    }
    html += '<div class="clear"></div>';

    resultElem.append(html);
		resultElem.mouseenter(function() {
			selectItem($(this));
		});
		resultElem.mouseleave(function() {
			deselectItem($(this));
		});
		resultElem.unbind('click').bind('click', function() {
			window.location = getDataByProductId($(this).data('id')).href;
		});

		$('ul',resultsElem).append(resultElem);
	}

	$(searchResultsContainerSelector).append(resultsElem);
}

function hideAjaxSearchResults()
{
	$('#'+SEARCH_RESULTS_ID).remove();
}

function getDataByProductId(product_id)
{
	for (var i in ajaxResultData) {
		var result = ajaxResultData[i];
		if (parseInt(product_id) == parseInt(result.product_id)) {
			return result;
		}
	}
	return false;
}

function getSelectedItem()
{
	var selectedItem = $();
	$('li', '#' + SEARCH_RESULTS_ID).each(function()
	{
		if (itemIsSelected($(this)))
		{
			selectedItem = $(this);
		}
	});
	return selectedItem;
}

function itemIsSelected(li)
{
	return li.hasClass('selected');
}

function deselectItem(li)
{
	li.removeClass('selected');
}

function selectItem(li)
{
	li.addClass('selected');
}

function selectNextItem() {
	var selectedItem = getSelectedItem();

	if (selectedItem.length == 0) {
		selectItem($('li:first', $('#' + SEARCH_RESULTS_ID)));
	}
	else if (selectedItem.next().length > 0) {
		deselectItem(selectedItem);
		selectItem(selectedItem.next());
	}
}

function selectPreviousItem()
{
	var selectedItem = getSelectedItem();

	deselectItem(selectedItem);

	if (selectedItem.prev().length > 0) {
		selectItem(selectedItem.prev());
	}
}

$(document).ready(function() {
	if (!IMPROVED_SEARCH_AJAX_STATUS) return;

	$('#search').find('input').first().
		keyup(function(e) {
			if (e.keyCode == KEYCODE_UP ||
				e.keyCode == KEYCODE_DOWN ||
				e.keyCode == KEYCODE_LEFT ||
				e.keyCode == KEYCODE_RIGHT ||
				e.keyCode == KEYCODE_HOME ||
				e.keyCode == KEYCODE_END ||
				e.keyCode == KEYCODE_SHIFT) {
				return;
			}
			if (e.keyCode == KEYCODE_ESC) {
				hideAjaxSearchResults();
				return;
			}

      clearTimeout(ajaxSearchTimeout);
      ajaxSearchTimeout = setTimeout("doAjaxSearch('" + $(this).val() + "');", 300);
		}).
		keydown(function(e) {
			if (e.keyCode == KEYCODE_UP)
				selectPreviousItem();
			if (e.keyCode == KEYCODE_DOWN)
				selectNextItem();
		}).
		blur(function() {
			setTimeout("hideAjaxSearchResults()", 1000);
		});

	$(document).keydown(function(e) {
		if (e.keyCode == KEYCODE_ENTER)
		{
			if (getSelectedItem().length > 0)
				window.location = getDataByProductId(getSelectedItem().data('id')).href;
		}
	});

  $(searchButtonSelector).bind('click', function(e)
  {
    e.preventDefault();
    e.stopPropagation();
    url = $('base').attr('href') + 'index.php?route=product/search';

    var filter_name = $(searchInputSelector).attr('value')

    if (filter_name)
    {
      if (OPENCART_VERSION < 1.5)
          url += '&keyword=' + encodeURIComponent(filter_name);
        else
          url += '&filter_name=' + encodeURIComponent(filter_name);
    }

    if (IMPROVED_SEARCH_SEARCH_WITHIN_DESCRIPTION)
    {
      if (OPENCART_VERSION < 1.5)
        url += '&description=1';
      else
        url += '&filter_description=true';
    }

    if (IMPROVED_SEARCH_SEARCH_WITHIN_MODEL)
    {
      if (OPENCART_VERSION < 1.5)
        url += '&model=1';
    }

    location = url;
  });

  $(searchInputSelector).keydown(function(e)
  {
    if (e.keyCode == 13)
    {
      url = $('base').attr('href') + 'index.php?route=product/search';

      var filter_name = $(this).attr('value')

      if (filter_name)
      {
        if (OPENCART_VERSION < 1.5)
          url += '&keyword=' + encodeURIComponent(filter_name);
        else
          url += '&filter_name=' + encodeURIComponent(filter_name);
      }

      if (IMPROVED_SEARCH_SEARCH_WITHIN_DESCRIPTION)
      {
        if (OPENCART_VERSION < 1.5)
          url += '&description=1';
        else
          url += '&filter_description=true';
      }

      if (IMPROVED_SEARCH_SEARCH_WITHIN_MODEL)
      {
        if (OPENCART_VERSION < 1.5)
          url += '&model=1';
      }

      location = url;
    }
  });
});
