//auto complete
$.fn.autoComplete = function(data, options) {
	var self = "#" + $(this).attr("id");
	var me = document.getElementById($(this).attr("id"));
	var isShow = false;
	var acSet = new Array();
	var acData = data;
	var acResult = new Array();
	var settings = {
		pattern1: /[,£¬;£»¡¡]/g,
		pattern2: /\s+/g,
		replace: " ",
		layer: "dvAddListContainer",
		layerTag: "div"
	};

	if(options) {
		$.extend(settings, options);
	};


	var offset = {};
	offset = $(me).offset();
	offset.top = offset.top + $(self).height() + 1;
	offset.left = offset.left + 1;


//	var offset=g_vs.getElementOffset(me);
//	offset.top = offset.y + $(self).height()+1;
//	offset.left = offset.x+1 ;
	
	if ($("#" + settings.layer).length == 0) {
		//alert("<" + settings.layerTag + " id=\"" + settings.layer + "\"></" + settings.layerTag + ">");
		$("body").append("<" + settings.layerTag + " id=\"" + settings.layer + "\"></" + settings.layerTag + ">");
	};

	$("#" + settings.layer).css(offset);
	$("#" + settings.layer).hide();

	$(self).focus(function(){
		if($.browser.msie){
			moveEnd();
		};
	});

	var check = function() {
		acSet = $(self).val()
				.replace(settings.pattern1, settings.replace)
				.replace(settings.pattern2, settings.replace)
				.split(settings.replace);
		
		var reg = acSet[acSet.length - 1];

		if (reg != "") {			
			acResult = $.grep(acData, function(t) {
				var a = t;
				var b = reg;
				var b1=false, b2=false, b3=false;
				//return a.toLowerCase().substr(0, b.length) == b.toLowerCase(); //reiko edit
				/*
				if(b.BLength() == b.length)
				{
					//only input py
					b1 = (a.py.toLowerCase().substr(0, b.length) == b.toLowerCase())?true:false;
				}
				*/
				//b1 = (a.taotao==0)?true:false;
				if(parseInt(b) == b)
				{
					//number...
					var strUin = a.uin+"";
					b2 = (strUin.substr(0, b.length) == b.toLowerCase())?true:false;
				}
				b3 = (a.name.toLowerCase().substr(0, b.length) == b.toLowerCase())?true:false;
				
				//return b1&&(b2||b3);
				return b2||b3;
			})
		} else {
			acResult = new Array();
		};

		if (acResult.length >1) {
			isShow = true;
		} else if (acResult.length == 1 && acResult[0] != reg) {
			isShow = true;
		} else {
			isShow = false;
		};
	};

	var display = function() {
		if (isShow) {
			var tmpHtml = "";
			var reg = acSet[acSet.length - 1];
			$.each(acResult, function(i, n) {
				//tmpHtml += "<" + settings.layerTag + " count=\"" + i + "\">" + 
				// "<span class=\"strong\">" + n.substr(0, reg.length) + "</span>" + n.substr(reg.length, n.length) +
				//	"</" + settings.layerTag + ">";
				tmpHtml += "<" + settings.layerTag + " count=\"" + i + "\">" + 
					"<span class=\"strong\">" + $.vs.getSafeHTML(n.name.substr(0, reg.length)) +"</span>" +  $.vs.getSafeHTML(n.name.substr(reg.length, n.name.length)) +"("+n.uin+")"+ 
					"</" + settings.layerTag + ">";
			});
			$("#" + settings.layer).empty();
			$("#" + settings.layer).append(tmpHtml).css({"width":"auto","height":"auto","overflow-y":"auto","overflow-x":"auto"});
			$($("div", "#" + settings.layer).get(0)).addClass("select");

			$("div", "#" + settings.layer).click(selectClick);
			$("#" + settings.layer).mouseover(function() {
					$(self).unbind("blur");
				}
			);
			$("#" + settings.layer).mouseout(function() {
					$(self).blur(hide);
				}
			);
			$("#" + settings.layer).show();
		} else {
			hide();
		};
	};

	var hide = function() {
		$("#" + settings.layer).css({"width":"auto","height":"auto","overflow-y":"auto","overflow-x":"auto"}).hide();
	};

	var show = function() {
		if($("#" + settings.layer).height() > 200){
			$("#" + settings.layer).css({"width":"120px","height":"200px","overflow-y":"scroll","overflow-x":"hidden"});
		};
		$("#" + settings.layer).show();
	};

	var moveSelect = function(b) {
		var tIndex;
		$("div", "#" + settings.layer).each(function(i) {
			if ($(this).attr("class") == "select") {
				tIndex = i;
			};
		});

		if (b == 1) {
			if (tIndex + 2 <= $("div", "#" + settings.layer).size()) {
				$($("div", "#" + settings.layer).get(tIndex)).removeClass("select");
				$($("div", "#" + settings.layer).get(tIndex + 1)).addClass("select");
			}
		} else {
			if (tIndex - 1 >= 0) {
				$($("div", "#" + settings.layer).get(tIndex)).removeClass("select");
				$($("div", "#" + settings.layer).get(tIndex - 1)).addClass("select");
			};
		};
	};

	var selectClick = function() {
		var tIndex = $(this).attr("count");		
		select(tIndex);
		hide();
	};

	var selectCurrent = function() {
		var tIndex;
		$("div", "#" + settings.layer).each(function(i) {
			if ($(this).attr("class") == "select") {
				tIndex = i;
			};
		});		
		select(tIndex);
		hide();
	};

	var select = function(i) {
		var reg = acSet[acSet.length - 1];
		if (reg != "") 
		{
		/*
			if(!sx_isDupUser(acResult[i].uin))
			{
				$(self).val($(self).val().substr(0, $(self).val().length - reg.length) + acResult[i].name+"("+acResult[i].uin+")" + settings.replace);
			}
			else
			{
				$(self).val($(self).val().substr(0, $(self).val().length - reg.length));				
			}
		*/
			if(doChoseFromSearch(acResult[i].uin, acResult[i].name))
			{
				$(self).val($.vs.getSafeHTML(acResult[i].name) + "("+acResult[i].uin+")");
			}
			
		};
		//$.tic.resort($(self).val());
		$(self).focus();
	};

	var moveEnd = function() {
		var obj = document.getElementById($(self).attr("id"));
		var selRange = obj.createTextRange();   
		selRange.moveStart('character', obj.value.length);
		selRange.collapse(true);   
		selRange.select();
	};

	var resortShowTag = function() {
		var str = $.trim($("#" + settings.self).val().replace(settings.pattern, settings.replace).replace(settings.replaceReg, settings.replace));
		var arr = str.split(settings.replace);
		
		$("#" + settings.helper).find("a").each(function() {
			$(this).removeClass("list2").addClass("list1");
			for(var i = 0; i < arr.length; i++) {
				if ($(this).text() == arr[i]) {
					$(this).removeClass("list1").addClass("list2");
					break;
				};
			};
		});
	};

	$(self).keydown(function(e) {
		switch(e.keyCode) {
			case 38: // up
				if ($("#" + settings.layer).css("display") != "none") {
					e.preventDefault();
				};					
				break;
			case 40: // down
				if ($("#" + settings.layer).css("display") != "none") {
					e.preventDefault();
				};
				break;
			case 9: // tab
			case 13: // return
				if ($("#" + settings.layer).css("display") != "none") {
					e.preventDefault();
				};
				break;
			//case 8:
				//if ($("#" + settings.layer).css("display") != "none") {
					//hide();
				//};
				//break;
			default:
				break;
		};
	});

	$(self).keyup(function(e) {
		switch(e.keyCode) {
			case 38:	// up
				if ($("#" + settings.layer).css("display") != "none") {
					moveSelect(-1);
				}					
				break;
			case 40:	// down
				if ($("#" + settings.layer).css("display") != "none") {
					moveSelect(1);
				}
				break;
			case 9:		// tab
			case 13:	// return
				if ($("#" + settings.layer).css("display") != "none") {
					selectCurrent();
				}
				break;
			case 8:
				//break;
			case 59:
			case 188:
			case 32:
				//$.tic.resort($(self).val());
			default:
				check();
				display();
				break;
		};
	});
	$(self).blur(hide);
};

$.fn.fillTag = function(data, options) {
	var self = "#" + $(this).attr("id");
	var tData = data;
	var tHtml = "";
	var settings = {
		layerTag: "a"
	};

	if(options) {
		$.extend(settings, options);
	}

	$.each(tData, function(i, n) {
		//tHtml += "<" + settings.layerTag + ">" + n + "</" + settings.layerTag + ">¡¡";
		tHtml += "<" + settings.layerTag + ">" + n.name+"("+n.uin+")" + "</" + settings.layerTag + ">¡¡";
		//alert(tHtml);
	});

	$(self).empty();
	$(self).append(tHtml);

	$(self).find(settings.layerTag).addClass("list1");
	$(self).find(settings.layerTag).click(function (e) {
		if ($(this).attr("class") == "list1") {
			$(this).removeClass("list1").addClass("list2");
			//$.tic.reinput($(this).text(), 1);
		} else {
			$(this).removeClass("list2").addClass("list1");
			//$.tic.reinput($(this).text(), -1);
		};
	});
};
