

//*   Ajax快速搜索结果程序 - Ajax Quick Search Results   
//*   Copyright  2008 - 2010 闻泰网络
//*   http://www.weentech.com              



var ween_QuickSearch = {
	minimum_length: 3,               // 在搜索输入框中键入多少个字符后，开始进行Ajax查询
	search_delay: 125,       		       // 在搜索输入框中键入文字时，开始进行Ajax查询的延迟时间(毫秒, 1秒=1000毫秒)
	ween_quicksearchwidth: 238,           // 下拉式快速搜索结果的宽度(像素值)
	cache: new Object(),

	init: function()
	{
		$('#ween_search_query').bind("keydown", ween_QuickSearch.on_keydown);
		$('#ween_search_query').bind("keyup", ween_QuickSearch.on_keyup);
		$('#ween_search_query').bind("change", ween_QuickSearch.on_change);
		$('#ween_search_query').blur(ween_QuickSearch.on_blur);
		$('#ween_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('ajax_search.js') > -1)
			{
				ween_QuickSearch.path = s.src.replace('ajax_search.js', '');
				break;
			}
		}
	},

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

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

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

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

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

	do_search: function()
	{
		var cache_name = $('#ween_search_query').val().length+$('#ween_search_query').val()+"_"+$('#categoryselect').val();
		if(ween_QuickSearch.cache[cache_name])
		{
			ween_QuickSearch.search_done(ween_QuickSearch.cache[cache_name]);
		}
		else
		{
			var sectionid=document.getElementById("categoryselect").value;
		
			$.ajax({
				type: 'GET',
				url: ween_QuickSearch.path+'ajax_search.php?action=AjaxSearch&sectionid='+sectionid+'&ween_search_query='+encodeURIComponent($('#ween_search_query').val()),
				success: function(response) { ween_QuickSearch.search_done(response); }
			});
		}
	},

	search_done: function(response)
	{
		var cache_name = $('#ween_search_query').val().length+$('#ween_search_query').val();
		ween_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");
		}

		var results = results_xml.getElementsByTagName('result');
		if(results && results.length > 0)
		{
			ween_QuickSearch.results = new Array();
			for(var i = 0; i < results.length; i++)
			{
				ween_QuickSearch.results.push({
					title: results[i].getAttribute('title'),
					url: results[i].getAttribute('url'),
					price: results[i].getAttribute('price'),
					shortdes: results[i].getAttribute('shortdes'),
					image: results[i].getAttribute('image')
				});
			}



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

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

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

			var tr = document.createElement('TR');
			var td = document.createElement('TD');
			tr.className = "ween_QuickSearchTitle";
			td.colSpan = "2";
			td.innerHTML = results_xml.getElementsByTagName('results')[0].getAttribute('type');
			tr.appendChild(td);
			popup.appendChild(tr);

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

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

				result.image = unescape(result.image);
				var image = document.createElement('IMG');
				image.src = result.image;
				image.alt = '';
				image.title = unescape(result.title);
				image_container.appendChild(image);
				tr.appendChild(image_container);

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

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

				var RatingDIV = document.createElement('div');
				RatingDIV.className = "ween_QuickSearchResultRatingDIV";
				meta.appendChild(RatingDIV);

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


				if(result.shortdes)
				{
					var des = document.createElement('span');
					des.className = "ween_QuickSearchResultRatingIMG";
					des.innerHTML = unescape(result.shortdes);
					RatingDIV.appendChild(des);
				}

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

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

			var all_results = results_xml.getElementsByTagName('results')[0].getAttribute('view_all');
			if(all_results)
			{
				var tr = document.createElement('TR');
				var td = document.createElement('TD');
				tr.className = "ween_QuickSearchAllResults";
				tr.onmouseover = function() { ween_QuickSearch.over_all = true; };
				tr.onmouseout = function() { ween_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('ween_search_query');

			offset_left = 0;

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

			if (document.getBoxObjectFor) {
				var additionleft = 1;
			}
			else {
				var additionleft = 0;
			}

			popup_container.style.position = "absolute";
			popup_container.style.zIndex = 10000000000000;
			popup_container.style.left = offset_left +additionleft+ "px";
			popup_container.style.top = offset_top + document.getElementById('ween_search_query').offsetHeight +additionleft + "px";
			if(typeof(ween_QuickSearch.ween_quicksearchwidth) != 'undefined') {
				popup_container.style.width = ween_QuickSearch.ween_quicksearchwidth - additionleft  + "px";
			}
			else {
				popup_container.style.width = document.getElementById('ween_search_query').offsetWidth - additionleft + "px";
			}
			if($('#ween_QuickSearch'))
			{
				$('#ween_QuickSearch').remove();
			}
			document.body.appendChild(popup_container);
			popup_container.style.display = '';
		}
		else
		{
			if(document.getElementById('ween_QuickSearch'))
			{
				$('#ween_QuickSearch').remove();
			}
		}
	},


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

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

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

$(document).ready(function()
{
	ween_QuickSearch.init();
});


