/**
 * 
 * Javascript minify: http://fmarcia.info/jsmin/test.html
 * 
 * @author nkapproach@gmail.com
 * @copyright www.ganji.com 2009
 */

String.prototype.format = function(){
    var str = this;
    for (var i = 0; i < arguments.length; i++) {
        var re = new RegExp('\\{' + (i) + '\\}', 'gm');
        str = str.replace(re, arguments[i]);
    }
    return str;
};

///////////////////////////////////////////////////////////////////////////////////////////////////////
//// 自动完成插件 START
//// nkapproach@gmail.com 2009-4-1
///////////////////////////////////////////////////////////////////////////////////////////////////////


$.fn.autocomplete = function(o){
    o = $.extend({
        panelId : '', // 弹窗DIV的id属性
		dataProvider : false, // dataProvider 是一个函数，根据当前的值获取可选的的内容 例如：function(str, callback){ var l=['aaa','bbb','ccc'];callback(l); }
		closeButtons : false, // 关闭按钮(jQuery对象)
		showHighLightValue : true, // 是否在input显示当前高亮的元素的值
		autoPosition : true, // 是否自动根据文本框进行定位
		
		getItemValue : function($item){ return $item.text() }, // 获取当前高亮的元素(li)的值
		formatValue : function(val){ return val }, // 将数据源callback函数接受到的数组的元素转成可以直接放入li中的字符串(一般应该是一段html)
		offsetAdjust : {left:0, top:6}, // 调整弹窗和input的相对位置
		
		defaultText : '没有结果', // 当value数组为空时，默认显示的内容 如果defaultText为空，则不显示提示
        autocomplete : false, // 默认关闭浏览器的自动换成
        hideSelect : true, // 默认隐藏页面上的select元素
        hideOnDocumentClick : true // 单击弹窗以外的地方则隐藏弹窗
    
    }, o);
    var assertTrue = function(b, msg){ if (!b) throw new Error(msg) };
	var $this = this;
	
	// 获得弹窗div的jquery对象
	var $panel = $('#'+o.panelId);
	assertTrue( $panel.size()==1, 'The panel must be the id of the pop div element.');
	$this.attr('autocompletePanelId', o.panelId);
    
    // 以前高亮的item作为input的值，并关闭弹窗
	var selectCurrentValue = function(){
		var currentItem = $('li.selected', $panel);
        if (currentItem.size()>0) {
			var val = o.getItemValue(currentItem);
			$this.val(val);
		}
		$this.autocompleteHide();
		$this.trigger('autocompleteEventSelectValue');
    	return false;
	};
	// 在input中显示某个item的值
    var showValueOfItem = function ($item) {
		if ($item.size()>0) {
			var val = o.getItemValue($item);
			$this.val(val);
		}
		return false;
	};
	// 更新panel显示
	var renderItemList = function(valueList){
		if( valueList===false )
		{
			$this.autocompleteHide();
			return false;
		}
		var $ul = $('ul', $panel);
		// 如果ul不存在，自动创建之
		if ($ul.size()==0) {
			$ul = $('<ul/>').appendTo($panel);
		}
		var $h3 = $('h3', $panel);
		// 如果h3不存在，自动创建之
		if ($h3.size()==0) {
			$h3 = $('<h3/>').appendTo($panel);
		}
		$ul.html('').hide();
		$h3.html('').hide();
		var html = '', msg = '';
		if (valueList && valueList.length>0) {
			for (var i=0;i<valueList.length;i++) {
				html += '<li>{0}</li>'.format( o.formatValue(valueList[i]) );
			}
		} else if (o.defaultText) {
			msg = '<span>{0}</span>'.format(o.defaultText);
		}
		if (html) {
			$ul.html(html).show();
		}
		if (msg) {
			$h3.html(msg).show();
		}
		if (o.autoPosition) {
			var offset = $this.offset();
	        $panel.css({
	            left: offset.left + o.offsetAdjust.left,
	            top: offset.top + $this.height() + o.offsetAdjust.top
	        });
		}
		$panel.show();
		$this.trigger('autocompleteEventShow');
        return false;
    };
	
	// 处理input的浏览器自动完成开关
    $this.attr('autocomplete', o.autocomplete ? 'on' : 'off');
    // 在页面上单击文本意外的地方，关闭弹窗
	if (o.hideOnDocumentClick) {
        $(document).click(function(){
            $this.autocompleteHide();
        });
    }
	// 绑定提供数据的函数
    assertTrue(o.dataProvider && $.isFunction(o.dataProvider), 'The dataProvider option must be a function.');
    $this.bind('autocompleteEventUpdate', function(){
		var str = $this.val();
		o.dataProvider(str, renderItemList);
	});
	
    var _selectCache = $('select:visible');
    $this.bind('autocompleteEventShow', function(){
        if (o.hideSelect) 
            _selectCache.css('visibility', 'hidden');
        $this.attr('autocompleteshow', '1');
    });
    $this.bind('autocompleteEventHide', function(){
        if (o.hideSelect) 
            _selectCache.css('visibility', 'visible');
        $this.attr('autocompleteshow', '0');
    });
    
	// 根据li或li的子节点获取之
	var getRightLiByObject = function(obj){
		var panelObj = $panel.get(0);
		while (obj!=null && obj!=panelObj && obj.tagName.toUpperCase()!='LI') {
			try { 
				obj = obj.parentNode; 
			} catch(error) { 
				obj=null;
			}
		}
		if( obj && obj.tagName.toUpperCase()=='LI') return obj;
		return null;
	};
	
	// 处理弹窗的鼠标事件
	$panel.mouseover(function(event){
		var liElement = getRightLiByObject(event.target);
		if (liElement) {
			var li = $(liElement);
			var cur = $('li.selected', $panel);
			if (cur!=li) {
				cur.removeClass('selected');
            	li.addClass('selected');
				if (o. showHighLightValue) {
					showValueOfItem(li);
				}
			}
		}
	}).click(function(event){
		event.stopPropagation();
		var liElement = getRightLiByObject(event.target);
		if (liElement) {
			var li = $(liElement);
			var cur = $('li.selected', $panel);
			if (cur!=li) {
				cur.removeClass('selected');
            	li.addClass('selected');
			}
			selectCurrentValue();
		}
	});
	
	// 处理弹窗的关闭按钮
	if (o.closeButtons) {
		o.closeButtons.click(function(){
			$this.autocompleteHide();
		});
	}
	
	// 处理输入框的键盘事件
    $this.keydown(function(event){
        if ((event.keyCode == 9 || event.keyCode == 13) && $this.autocompleteIsShow()) {
            // 用户在自动完成弹窗显示的时候，按下了回车键
            event.stopPropagation();
            selectCurrentValue();
        }
    }).keyup(function(event){
        var text = $this.val();
    	switch (event.keyCode) {
    		case 9:
    			break;
			case 27: // Esc
				$this.autocompleteHide();
				break;
			case 38: // Up
                event.stopPropagation();
				if ($this.autocompleteIsShow()) {
					var cur = $('li.selected', $panel);
	                var prev = cur.prev();
	                if (prev.size() == 0) {
	                    prev = $('li:last', $panel);
	                }
	                cur.removeClass('selected');
	                prev.addClass('selected');
					if (o. showHighLightValue) {
						showValueOfItem(prev);
					}
				} else {
					$this.trigger('autocompleteEventUpdate', text);
				}
                break;
            case 40: // Down
                event.stopPropagation();
                if ($this.autocompleteIsShow()) {
					var cur = $('li.selected', $panel);
	                var next = cur.next();
	                if (next.size() == 0) {
	                    next = $('li:first', $panel);
	                }
	                cur.removeClass('selected');
	                next.addClass('selected');
					if (o. showHighLightValue) {
						showValueOfItem(next);
					}
                } else {
					$this.trigger('autocompleteEventUpdate', text);
				}
				break;
            case 13:// Enter
                event.stopPropagation();
                break;
            default:
                event.stopPropagation();
			    $this.trigger('autocompleteEventUpdate', text);
		}
    });
	// 其它事件
	$this.focus(function(){
		$this.trigger('autocompleteEventUpdate', $this.val());
	})
	.click(function(event){
		event.stopPropagation();
	});;
	// 写入样式
	$.autocompleteWriteDefaultStyle();
    return this;
};

/**
 * 隐藏自动完成的弹窗
 */
$.fn.autocompleteHide = function(){
	var panelId = this.attr('autocompletePanelId');
	if (panelId) {
		$('#'+panelId).hide();
	}
	this.trigger('autocompleteEventHide');
    return this;
};

/**
 * 判断自动完成的弹窗是否正在显示中
 * @return Boolean
 */
$.fn.autocompleteIsShow = function(){
    return this.attr('autocompleteshow') == '1';
};
/**
 * 写入autocomplete插件使用的默认css样式
 */
$.autocompleteWriteDefaultStyle = function() {
	if (! $.autocompleteStyle) {// 控制样式只向页面写一次
		var lines = ['.jquery_autocomplete {position:absolute;z-index:20000;background-color:#FFF;border:1px solid silver;width:300px;}',
		'.jquery_autocomplete h3 {font-weight:normal;font-size:13px;line-height:150%;margin:0;padding:2px;}',
		'.jquery_autocomplete ul {list-style:none;padding:0;margin:2px;background:#FFFFFF}',
		'.jquery_autocomplete ul li {font-size:13px;line-height:150%;}', //背景
		'.jquery_autocomplete ul li.selected {background-color:#D4E6FC;}',
		'.jquery_autocomplete p {font-size:12px;padding:5px;margin:0;text-align:right;clear:both;}'];
		document.writeln('<style type="text/css">');
		document.writeln(lines.join('\n'));
		document.writeln('</style>');
		$.autocompleteStyle = true;
	}
};

$.fn.websiteSearch = function(){
	this.autocomplete({
		panelId : 'container_website',
		dataProvider : function(str, callback){
			str = $.trim(str);
			if (str.length==0) {
				callback(false);
			} else {
				$.getJSON('/websiteSearchSuggestion.php', {
					cate : $("#search_type").val(),
					k    : str
				}, function(data){
					if (data && data.ResultSet) {
						var valueList = [];
						for (var i=0;i<data.ResultSet.length;i++) {
							valueList.push(data.ResultSet[i].suggestionKeyword);
						}
						callback(valueList);
					} else {
						callback(false);
					}
				});
			}
		},
		showHighLightValue : false,
		autoPosition : false
	});
};

$.fn.trainSearch = function(panelId, url, id){
	this.autocomplete({
		panelId : panelId,
		dataProvider : function(str, callback){
			str = $.trim(str);
			if (str.length==0) {
				callback(false);
			} else {
				$.getJSON(url, {
					input : str
				}, function(data){
					if (data) {
						var valueList = [];
						for (var i=0;i<data.length;i++) {
							valueList.push(data[i]);
						}
						callback(valueList);
					} else {
						callback(false);
					}
				});
			}
		},
		showHighLightValue : false,
		hideSelect : false,
		autoPosition : false
	});
};