﻿/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Copyright notice and license must remain intact for legal use
 * jSuggest
 * Download by http://www.codefans.net
 * Version: 1.0 (May 26, 2008)
 * Requires: jQuery 1.2.6+
 */
(function($) {
		  
	$.fn.jSuggest = function(options) {
		// merge users option with default options
		var opts = $.extend({}, $.fn.jSuggest.defaults, options);		
		var jH = ".jSuggestHover";
		var jsH = "jSuggestHover";
		var iniVal = this.value;
		var textBox = this;
		var textVal = this.value;	
		var jC = "#jSuggestContainer";
		
		$("body").append('<div id="jSuggestContainer"></div>');
		$(jC).hide();
		$(this).bind("keyup click", function(e){
			textBox = this;
			textVal = this.value;
			if (this.value.length >= opts.minchar && $.trim(this.value)!="Search Terms") {
				var offSet = $(this).offset();
				
				$(jC).css({
					position: "absolute",
					top: offSet.top + $(this).outerHeight() + "px",
					left: offSet.left,
					//width: $(this).outerWidth()-2 + "px",
					width: "440px",
					opacity: opts.opacity,
					zIndex: opts.zindex
				}).show();
				
				// if escape key
				if (e.keyCode == 27 ) {
					$(jC).hide();
				}
				
				// if enter key
				else if (e.keyCode == 13 ) {
					if ($(jH).length == 1)
						$(textBox).val($(jH).text());
						$(jC).hide();
						iniVal = textBox.value;
				}
				// if down arrow
				else if (e.keyCode == 40) {
					// if any suggestion is highlighted
					if ($(jH).length == 1) {
						if (!$(jH).next().length == 0) {
							$(jH).next().addClass(jsH);
							$(".jSuggestHover:eq(0)").removeClass(jsH);
							if (opts.autoChange)
								$(textBox).val($(jH).text());
						}
					}
					else {
						$("#jSuggestContainer ul li:first-child").addClass(jsH);
						if (opts.autoChange)
							$(textBox).val($(jH).text());
					}
					
				}
				
				// if up arrow
				else if (e.keyCode == 38) {
					// if any suggestion is highlighted
					if ($(jH).length == 1 ) {
						if (!$(jH).prev().length == 0) {
							$(jH).prev().addClass(jsH);
							$(".jSuggestHover:eq(1)").removeClass(jsH);
							if (opts.autoChange)
								$(textBox).val($(jH).text());
						}
						// if is first child
						else {
							$(jH).removeClass(jsH);
							$(textBox).val(iniVal);
						}
					}
				}
				// new query detected
				else if (textBox.value != iniVal){
					
					iniVal = textBox.value;
					if ($(".jSuggestLoading").length==0)
						$('<div class="jSuggestLoading"><img src="'+opts.loadingImg+'" align="bottom" /> '+ opts.loadingText+'</div>').prependTo("#jSuggestContainer");
					
					$(".jSuggestLoading").show();
					$(jC).find('ul').remove();
					
					if (opts.data == '')
						opts.data = $(this).serialize();
					else 
						var keyWord=opts.data+ "=" + escape($(this).val())+"&"+Math.random();
					//var keyWord=opts.data+ "=" + $(this).val()+"&"+Math.random();
					//	opts.data = opts.data + "=" + escape($(this).val());
					// optimize server performance by loading at intervals
					setTimeout(function () {
						$.ajax({
							type: opts.type,
							url: opts.url,
							data: keyWord,
							cache: false,
							dataType:"json",
							success: function(msg){
								if(msg!==''){
									$(jC).find('ul').remove();
									//$(jC).append(msg);
									var returnHTML='<ul>';
									var findFlag=false;
									var j=0;
									for(var i=0;i<msg.length;i++){
										for(var jsonItem in msg[i]){
											//alert(jsonItem);
											//alert(msg[i][jsonItem]); 
											if(jsonItem!='pid' && jsonItem!='date'){//不检索pid和date
												if(msg[i][jsonItem].toLowerCase().indexOf(iniVal.toLowerCase())!=-1){
													returnHTML+='<li rel="'+msg[i].pid+'" title="'+msg[i].name+'"><span class="leftSpan">'+msg[i].name.substring(0,23).replace(iniVal,'<span style="font-weight:bold">'+iniVal+'</span>')+'</span><span class="rightSpan">'+msg[i].address.replace(iniVal,'<span style="font-weight:bold">'+iniVal+'</span>')+'</span><div class="clear"></div></li>';
													findFlag=true;
													j++;
													break;
												}												
											}

																						
										}
										if(j==15){break;}//最多显示15条
									}	
									//returnHTML+='<li class="last">查找内容:<span style="font-weight:bold">'+iniVal+'</span></li>';
									returnHTML+='</ul>';
									//alert(returnHTML);
									if (findFlag){
										$(jC).append(returnHTML);
									}										
									$("#jSuggestContainer ul li").not(".last").bind("mouseover",	function(){
											$(jH).removeClass(jsH);
											$(this).addClass(jsH);
											//alert($("> .leftSpan",$(this)).length);
											if($("> .leftSpan",$(this)).length>0){
												textVal=$("> .leftSpan",$(this)).eq(0).text();
											}else{
												textVal = $(this).text();
											}
											if (opts.autoChange){
												if($("> .leftSpan",$(this)).length>0){
													textVal=$("> .leftSpan",$(jH)).eq(0).text();
												}else{
													textVal = $(jH).text();
												}												
												//$(textBox).val($(jH).text());
												$(textBox).val(textVal);
											}
												
									});
									$("#jSuggestContainer ul li").not(".last").click(function(){									 
										if($(this).attr("class")!=='last jSuggestHover'){										 
											$(this).addClass(jsH);
											$(textBox).val(textVal);
											//直接跳转页面
											window.location.href='/products_'+$(this).attr("rel")+'.html';
										}
									});
									$(".jSuggestLoading").hide();
									if (!findFlag){
										$(jC).hide();
									}	
								}else{
									$(".jSuggestLoading").hide();
									$(".jSuggestContainer").hide();
									$(jC).hide();
								}
							}
						});
					}, opts.delay);
				}
			}
			// if text is too short do nothing and hide everything
			else {
				$(jH).removeClass(jsH);
				$(jC).hide();
			}
			
			// no bubbling, click is binded to textBox to prevent document bind from firing
			return false;
		});
		
		// why no use $(this).blur ?, because jSuggest box is hidden before click fires so this is the only way to do it
		// alternate way is to say that text blur will fire before$("#jSuggestContainer ul li") click.
		$(document).bind("click", function(){
			$(jC).hide();
			iniVal = textBox.value;
		});

	};
	
	$.fn.jSuggest.defaults = {
		minchar: 1,
		opacity: 1.0,
		zindex: 20000,
		delay: 100,//2500
		loadingImg: '/image/ajax-loader.gif',
		loadingText: 'Loading...',
		autoChange: false,
		url: "",
		type: "GET",
		data: ""
	};
		
	
		  

})(jQuery);
