var QuickSearch = {
	minimum_length: 3,
	search_delay: 0, //Default: 125
	cache: new Object(),
	init: function()
	{
		$('#search_query').bind("keydown", QuickSearch.on_keydown);
		$('#search_query').bind("keyup", QuickSearch.on_keyup);
		$('#search_query').bind("change", QuickSearch.on_change);
		$('#search_query').blur(QuickSearch.on_blur);
		$('#search_query').attr('autocomplete', 'off');

		var scripts = document.getElementsByTagName('SCRIPT');
		for(var i = 0; i < scripts.length; i++)
		{
			s = scripts[i];
			if(s.src && s.src.indexOf('quicksearch.js') > -1)
			{
				QuickSearch.path = s.src.replace(/quicksearch\.js$/, '../');
				break;
			}
		}

	},

	on_blur: function(event)
	{
		if(!QuickSearch.item_selected && !QuickSearch.over_all)
		{
			QuickSearch.hide_popup();
		}
	},

	on_keydown: function(event)
	{
		if(event.keyCode == 13 && !event.altKey)
		{
			if(QuickSearch.selected)
			{
				try {
					event.preventDefault();
					event.stopPropagation();
				} catch(e) { }
				window.location = QuickSearch.selected.url;
				return false;
			}
			else
			{
				QuickSearch.hide_popup();
			}
		}
		else if(event.keyCode == 27)
		{
			if(document.getElementById('QuickSearch'))
			{
				try {
					event.preventDefault();
					event.stopPropagation();
				} catch(e) { }
			}
			QuickSearch.hide_popup();
		}
	},

	on_keyup: function(event)
	{
		if(QuickSearch.timeout)
		{
			clearTimeout(QuickSearch.timeout);
		}

		// Down key was pressed
		if(event.keyCode == 40 && QuickSearch.results)
		{
			if(QuickSearch.selected && QuickSearch.results.length >= QuickSearch.selected.index+1)
			{
				QuickSearch.highlight_item(QuickSearch.selected.index+1, true);
			}
			if(!QuickSearch.selected && QuickSearch.results.length > 0)
			{
				QuickSearch.highlight_item(0, true);
			}
			try {
				event.preventDefault();
				event.stopPropagation();
			} catch(e) { }
			return false;
		}
		else if(event.keyCode == 38 && QuickSearch.results)
		{
			if(QuickSearch.selected && QuickSearch.selected.index > 0)
			{
				QuickSearch.highlight_item(QuickSearch.selected.index-1, true);
			}
			try {
				event.preventDefault();
				event.stopPropagation();
			} catch(e) { }
		}
		else if(event.keyCode == 27)
		{
			QuickSearch.hide_popup();
		}
		else
		{
			if($('#search_query').val() == QuickSearch.last_query)
			{
				return false;
			}
			QuickSearch.selected = false;
			if($('#search_query').val().replace(/^\s+|\s+$/g, '').length >= QuickSearch.minimum_length)
			{
				QuickSearch.last_query = $('#search_query').val().replace(/^\s+|\s+$/g, '');
				if(QuickSearch.timeout)
				{
					window.clearTimeout(QuickSearch.timeout);
				}
				QuickSearch.timeout = window.setTimeout(QuickSearch.do_search, QuickSearch.search_delay);
			}
			else {
				if(document.getElementById('QuickSearch'))
				{
					$('#QuickSearch').remove();
				}
			}
		}
	},

	on_change: function(event)
	{
		return (QuickSearch.on_keydown(event) && QuickSearch.on_keyup(event));
	},

	do_search: function()
	{
		var cache_name = $('#search_query').val().length+$('#search_query').val();
		if(QuickSearch.cache[cache_name])
		{
			QuickSearch.search_done(QuickSearch.cache[cache_name]);
		}
		else
		{
			$.ajax({
				type: 'GET',
				url: QuickSearch.path+'search.php?action=AjaxSearch&search_query='+encodeURIComponent($('#search_query').val()),
				success: function(response) { QuickSearch.search_done(response); }
			});
		}
	},

	search_done: function(response)
	{
		// Cache results
		var cache_name = $('#search_query').val().length+$('#search_query').val();
		QuickSearch.cache[cache_name] = response;

		if(window.ActiveXObject)
		{
			var results_xml = new ActiveXObject("Microsoft.XMLDOM");
			results_xml.async = false;
			results_xml.loadXML(response);
		}
		else
		{
			var _parser = new DOMParser();
			var results_xml = _parser.parseFromString(response, "text/xml");
		}
		// Parse in results
		var results = results_xml.getElementsByTagName('result');
		if(results && results.length > 0)
		{
			QuickSearch.results = new Array();
			for(var i = 0; i < results.length; i++)
			{
				QuickSearch.results.push({
					title: results[i].getAttribute('title'),
					url: results[i].getAttribute('url'),
					price: results[i].getAttribute('price'),
					ratingimg: results[i].getAttribute('ratingimg'),
					image: results[i].getAttribute('image')
				});
			}


			// Results are now stored, build the menu

			if(document.getElementById('QuickSearch'))
			{
				$('#QuickSearch').remove();
			}

			var popup_container = document.createElement('TABLE');
			popup_container.className = 'QuickSearch';
			popup_container.id = 'QuickSearch';
			popup_container.cellPadding = "0";
			popup_container.cellSpacing = "0";
			popup_container.border = "0";

			var popup = document.createElement('TBODY');
			popup_container.appendChild(popup);

			// Initial node is our "Products" node
			var tr = document.createElement('TR');
			var td = document.createElement('TD');
			tr.className = "QuickSearchTitle";
			td.colSpan = "2";
			td.innerHTML = results_xml.getElementsByTagName('results')[0].getAttribute('type');
			tr.appendChild(td);
			popup.appendChild(tr);

			for(var i = 0; i < QuickSearch.results.length; i++)
			{
				var result = QuickSearch.results[i];
				var tr = document.createElement('TR');
				tr.id = "QuickSearchResult"+i;
				tr.className = "QuickSearchResult";

				var image_container = document.createElement('TD');
				image_container.className = 'QuickSearchResultImage';

				result.image = unescape(result.image);
				if(result.image.indexOf('http://') == 0 || result.image.indexOf('https://') == 0)
				{
					var image = document.createElement('IMG');
					image.src = result.image;
					image.alt = '';
					image.title = unescape(result.title);
					image_container.appendChild(image);
				}
				else
				{
					image_container.className += " QuickSearchResultNoImage";
					image_container.innerHTML = result.image.replace('+', ' ');
				}
				tr.appendChild(image_container);

				var meta = document.createElement('TD');
				meta.className = "QuickSearchResultMeta";

				var link = document.createElement('A');
				link.className = "QuickSearchResultName";
				link.title = unescape(result.title);
				link.href = result.url;
				link.innerHTML = unescape(result.title);
				meta.appendChild(link);

				var price = document.createElement('span');
				price.className = "Price";
				price.innerHTML = unescape(result.price);
				meta.appendChild(price);

				if(result.ratingimg)
				{
					var rating = document.createElement('IMG');
					rating.className = "RatingIMG";
					rating.src = unescape(result.ratingimg);
					meta.appendChild(rating);
				}

				tr.url = result.url;
				tr.index = i;
				tr.appendChild(meta);
				popup.appendChild(tr);

				tr.onmouseover = function() { QuickSearch.item_selected = true; QuickSearch.highlight_item(this.index, false); };
				tr.onmouseup = function() { window.location = this.url; };
				tr.onmouseout = function() { QuickSearch.item_selected = false; QuickSearch.unhighlight_item(this.index) };
			}



			// More results than we're showing?
			var all_results = results_xml.getElementsByTagName('results')[0].getAttribute('view_all');

                        var tr = document.createElement('TR');
                        tr.className = "QuickSearchAllResults";
                        tr.onmouseover = function() { QuickSearch.over_all = true; };
                        tr.onmouseout = function() { QuickSearch.over_all = false; };

                        var td = document.createElement('TD');
                        td.style.width = "200px";
                        if(all_results) {
                            td.innerHTML = all_results;
                        } else {
                            td.innerHTML = "<a/>";
                        }
                        tr.appendChild(td);

                        var td = document.createElement('TD');
                        td.innerHTML = "<a href='search.php?mode=advanced' style='padding-right: 10px;'><strong>Advanced Search</strong></a>";
                        td.style.textAlign = "right";
                        //td.style.paddingRight = "10px";

                        tr.appendChild(td);

                        popup.appendChild(tr);

                        /*
			if(all_results)
			{
                            var tr = document.createElement('TR');
                            var td = document.createElement('TD');
                            tr.className = "QuickSearchAllResults";
                            tr.onmouseover = function() { QuickSearch.over_all = true; };
                            tr.onmouseout = function() { QuickSearch.over_all = false; };
                            td.colSpan = 2;
                            td.innerHTML = all_results;
                            tr.appendChild(td);
                            popup.appendChild(tr);
			}
*/
			var clone = popup.cloneNode(true);
			document.body.appendChild(clone);
			clone.style.top = "10px";
			clone.style.left = "10px";
			offset_height = clone.offsetHeight;
			offset_width = clone.offsetWidth;
			clone.parentNode.removeChild(clone);

			var offset_top = offset_left = 0;
			var element = document.getElementById('search_query');
			if(typeof(QuickSearchAlignment) != 'undefined' && QuickSearchAlignment == 'left') {
				offset_left = 0;
			}
			else {
				offset_left += element.offsetWidth - $('#SearchForm').width();
			}

			offset_top = -3;
			do
			{
				offset_top += element.offsetTop || 0;
				offset_left += element.offsetLeft || 0;
				element = element.offsetParent;
			} while(element);

                        popup_container.style.zIndex = 99;
			popup_container.style.position = "absolute";
			popup_container.style.left = offset_left + 1 + "px";
			//popup_container.style.top = offset_top + document.getElementById('search_query').offsetHeight + "px";
                        popup_container.style.top = "0px";
			if(typeof(QuickSearchWidth) != 'undefined') {
				popup_container.style.width = QuickSearchWidth;
			}
			else {
				popup_container.style.width = document.getElementById('SearchForm').offsetWidth - 2 + "px";
			}
			if($('#QuickSearch'))
			{
				$('#QuickSearch').remove();
			}
			document.body.appendChild(popup_container);
			popup_container.style.display = '';
		}
		else
		{
			if(document.getElementById('QuickSearch'))
			{
				$('#QuickSearch').remove();
			}
		}
	},

	hide_popup: function()
	{
		$('#QuickSearch').remove();
		QuickSearch.selected = null;
	},

	highlight_item: function(index, keystroke)
	{
		element = $('#QuickSearchResult'+index);
		if(keystroke == true)
		{
			if(QuickSearch.selected) QuickSearch.selected.className = 'QuickSearchResult';
			QuickSearch.selected = document.getElementById('QuickSearchResult'+index);
		}
		element.addClass("QuickSearchHover");
	},

	unhighlight_item: function(index)
	{
		element = $('#QuickSearchResult'+index);
		element.removeClass('QuickSearchHover');
	}
};

var NewQuicksearch = {
    runningRequest: false,
    request: '',
    productTmpl: true,
    originalData: Object,
    originalHeader: '<h2>Products</h2>',

    init: function() {
        if($('#search_inline').length !== 0) {
            $('#search_inline').watermark('Start typing to search for a product.');
        }
        $('#search_inline').keyup(function(e) {
            e.preventDefault();
            NewQuicksearch.startLimit = 0;
            var $q = $(this),
                inputMode = $(this).attr('id'),
                scripts = document.getElementsByTagName('SCRIPT'),
                script_length = scripts.length,
                s;
            for(var i = 0; i < script_length; i++) {
                s = scripts[i];
                if(s.src && s.src.indexOf('quicksearch.js') > -1) {
                    QuickSearch.path = s.src.replace(/quicksearch\.js$/, '../');
                    break;
                }
            }

            $('img.loading').css('visibility','visible').show();
            NewQuicksearch.SearchProducts($q, inputMode);
        });
    },
    SearchProducts: function($q, inputMode) {
        if(inputMode === 'search_query') {
            // top most input element.  Refreshing the entire contents panel
            var $primary = Object;
            if($('#primary').length === 0) {
                // not on a product tmpl, storage page data
                NewQuicksearch.productTmpl = false;
                NewQuicksearch.originalData = $('body').children();
            } else {
                NewQuicksearch.productTmpl = true;
                $primary = $('#primary');
            }

            if ($q.val() === '' || $q.val().length < 3) { // Added < 3 to prevent server rape
                $('img.loading').css('visibility','hidden').hide();
                if(NewQuicksearch.productTmpl) {
                    $primary.empty();
                } else {
                    $('body').append(NewQuicksearch.originalData);
                }
                return false;
            }

            // Abort opened requests to speed it up
            if (NewQuicksearch.runningRequest) {
                NewQuicksearch.request.abort();
            }

            NewQuicksearch.runningRequest = true;
            $('#lazy-load-notifier').css('visibility', 'visible');

            NewQuicksearch.request = $.ajax({
                type: 'GET',
                url: QuickSearch.path+'search.php?action=AjaxSearch2&search_query='+encodeURIComponent($q.val()),
                success: function(data) {
                    $('img.loading').css('visibility','hidden').hide();
                    if(NewQuicksearch.productTmpl) {
                        NewQuicksearch.originalData = $primary.children();
                        $primary.empty().append(data);
                    } else {
                        $('body').empty().append(data);

                    }
                }
            });
        } else {
            // inline element.  Must do two requests to update both the header as well as the content below this
            var $search_header = $('#primary .module_top'),
                $search_results = $('#primary .product-cluster');

            if ($q.val() === '' || $q.val().length < 3) { // Added < 3 to prevent server rape
                $('img.loading').css('visibility','hidden').hide();
                $search_header.empty().append(NewQuicksearch.originalHeader);
                $search_results.empty();
                return false;
            }

            // Abort opened requests to speed it up
            if (NewQuicksearch.runningRequest) {
                NewQuicksearch.request.abort();
            }

            NewQuicksearch.runningRequest = true;
            $('#lazy-load-notifier').css('visibility', 'visible');

            NewQuicksearch.request = $.ajax({
                type: 'GET',
                url: QuickSearch.path+'search.php?action=AjaxSearch2_Header&search_query='+encodeURIComponent($q.val()),
                success: function(data) {
                    $search_header.empty().append(data);
                }
            });

            NewQuicksearch.request = $.ajax({
                type: 'GET',
                url: QuickSearch.path+'search.php?action=AjaxSearch2_Body&search_query='+encodeURIComponent($q.val()),
                success: function(data) {
                    $('img.loading').css('visibility','hidden').hide();
                    $search_results.empty().append(data);
                }
            });
        }
    }
};

$(document).ready(function() {
	QuickSearch.init();
    NewQuicksearch.init();
});

