﻿function CreateObj(value){
	this.value = value;
}
function add(obj){
	obj.value++;
}
function app(obj){
	obj.value += 'hey';
}
// Check whether the input prefix is legal(not empty or all blank)
// if it is legal, return 'true'.
function check_prefix(prefix){
	var result = prefix.replace(/[\s]/g, "");
	if(result == '')
		return false;
	else 
		return true;
}
function SearchSuggest(prefix){
	$("#search_suggest").html("");
	
	if(check_prefix(prefix)){	
	
		var url = "/api/AutoComplete/";
		var data = "prefix=" + encodeURIComponent(prefix);
		
		$.ajax({
			type: "POST",
			url: url,
			data: data,
			//async: false,
			success: function(transport){
				var resObj = eval('(' + transport + ')');
				//alert(resObj[0]);
				//alert(resObj[1]["tags"]);
				//var tags = resObj.tags;
				tags = new Array();
				tags = resObj[1]["tags"];
				if(tags.length > 0){
					for( var i=0; i<tags.length; ++i){
						var flag = true;
						// if there is an item identical to response result, don't append it to the suggest list again.
						$(".search_suggest_left").each(function(){
							if(tags[i].tagtext == $(this).text())
								flag = false;
						});
						if(flag == true){
							var tagtext = tags[i].tagtext;
							var count = tags[i].count;
							// We don't want the tagtext too long, which will cause the display problem.
							if(tagtext.length > 25)
								var tagtext = tagtext.slice(0,25) + "...";
							$("#search_suggest").append("<div id='suggest_item" + i +"' class='search_suggest_item'><input type='hidden' value='"+ tags[i].tagtext +"' /><div class='search_suggest_left'>" + tagtext+ "</div><div class='search_suggest_right'>" + count + "個結果</div></div><div class='clear'></div>");
						}
					}
					$("#search_suggest").css("display", "block");
				}
				$("#suggest_amount").val(tags.length);

			},
			error: function(){
				//alert("failure");
			}
		});
	}
	else
		return;
}

function UserSearchSuggest(prefix){
	$("#user_search_suggest").html("");
	
	if(check_prefix(prefix)){	
	
		var url = "/api/AutoCompleteUser/";
		var data = "prefix=" + encodeURIComponent(prefix);
		
		$.ajax({
			type: "POST",
			url: url,
			data: data,
			success: function(transport){
				var resObj = eval('(' + transport + ')');
				users = new Array();
				users = resObj[1]["users"];
				if(users.length > 0){
					for( var i=0; i<users.length; ++i){
						var flag = true;
						// if there is an item identical to response result, don't append it to the suggest list again.
						$(".user_search_suggest_item").each(function(){
							if(users[i].user == $(this).text())
								flag = false;
						});
						if(flag == true)
							$("#user_search_suggest").append("<div id='user_search_suggest_item" + i +"'  class='user_search_suggest_item'>" + users[i].user+ "</div><div class='clear'></div>");
					}
					$("#user_search_suggest").css("display", "block");
				}
				$("#user_suggest_amount").val(users.length);

			},
			error: function(){
				//alert("failure");
			}
		});
	}
	else
		return;
}

function doAutoComplete(e, pre_keycode, pre_prefix, item_counter, item_amount){
	var keycode = e.keyCode;
	var prefix = $("#keytag").val();
	
	// press "↓"
	if(keycode == 40){
		$("#keytag").blur();
		$("#keytag").focus();
		
		item_amount.value = $("#suggest_amount").val();
		$(".search_suggest_item").trigger("mouseout");
		$("#suggest_item"+item_counter.value).trigger('mouseover');
		if(item_counter.value < item_amount.value)
			item_counter.value++;
	}
	// press "↑"
	else if(keycode == 38){
		$("#keytag").blur();
		$("#keytag").focus();
								
		if(item_counter.value > -1)
			item_counter.value--;
				
		$(".search_suggest_item").trigger("mouseout");
		$("#suggest_item"+item_counter.value).trigger('mouseover');		
		if(item_counter.value == -1)
			$("#search_suggest").css("display", "none");
	}
	// press "caps lock"
	else if(keycode == 20){
	}
	// press "Esc"
	else if(keycode == 27){
		$("#search_suggest").css('display', 'none');
	}
	else{
		// press "Enter"
		if(keycode == 13){
			var keyword = $("#keytag").val();
			
			if(pre_keycode.value == 13)
				ToClassifyPage(keyword);
									
			if($("#search_suggest").css('display') == 'block' && item_counter.value != 0){
				$("#search_suggest").css('display', 'none');
			}
			else{
				$(".search_suggest_item").remove();
				$("#search_suggest").html("");
				$("#search_suggest").css("display", "none");
				item_counter.value = 0;
				SearchSuggest(keyword);
				item_amount.value = $("#suggest_amount").val();
			}				
		}
		else{
			if(pre_prefix.value != prefix){
				$(".search_suggest_item").remove();
				$("#search_suggest").html("");
				$("#search_suggest").css("display", "none");
				item_counter.value = 0;
				SearchSuggest(prefix);
				item_amount.value = $("#suggest_amount").val();
			}
		}
	}
	pre_keycode.value = keycode;
	pre_prefix.value = prefix;
}

function doUserAutoComplete(e, user_pre_keycode, user_pre_prefix, user_item_counter, user_item_amount){
	var keycode = e.keyCode;
	var prefix = $("#query_user").val();
				
	if(keycode == 40){
		$("#query_user").blur();
		$("#query_user").focus();
					
		user_item_amount.value = $("#user_suggest_amount").val();
		$(".user_search_suggest_item").trigger("mouseout");
		$("#user_search_suggest_item"+user_item_counter.value).trigger('mouseover');
		if(user_item_counter.value < user_item_amount.value)
			user_item_counter.value++;
		}
		else if(keycode == 38){
			$("#query_user").blur();
			$("#query_user").focus();
						
			if(user_item_counter.value > -1)
				user_item_counter.value--;
						
			$(".user_search_suggest_item").trigger("mouseout");
			$("#user_search_suggest_item"+user_item_counter.value).trigger('mouseover');	
			if(user_item_counter.value == -1)
			$("#user_search_suggest").css("display", "none");			
		}
		else{
			if(keycode == 13){
				var username = $("#query_user").val();
				if(user_pre_keycode.value == 13)
					ToUserPage(username);
							
				if($("#user_search_suggest").css('display') == 'block' && user_item_counter.value != 0){
					$("#user_search_suggest").css('display', 'none');
				}
				else{
					$(".user_search_suggest_item").remove();
					$("#user_search_suggest").html("");
					$("#user_search_suggest").css("display", "none");
					user_item_counter.value = 0;
					UserSearchSuggest(prefix);
					user_item_amount.value = $("#user_suggest_amount").val();
				}
						
			}
			else{
				if(user_pre_prefix.value != prefix){
					$(".user_search_suggest_item").remove();
					$("#user_search_suggest").html("");
					$("#user_search_suggest").css("display", "none");
					user_item_counter.value = 0;
					UserSearchSuggest(prefix);
					user_item_amount.value = $("#user_suggest_amount").val();
				}
			}
		}
		user_pre_keycode.value = keycode;
		user_pre_prefix.value = prefix;
}

// Note: Firefox 在新注音輸入時  一般按鍵被按下時不會觸發keydown, keyup 事件  以至於無法呼叫autocomplete相關的js function
// FF在新注音輸入下能夠偵測到的只有像是enter 空白這樣的特殊鍵
// 現在採取的辦法是只靠這些鍵來觸發autocomplete動作 

	$(document).ready(function(){
			// 根據瀏覽器種類微調排版參數
			if($.browser.msie)
				$("#user_search_suggest").css('top', '68px');
			else if($.browser.mozilla)
				$("#user_search_suggest").css('top', '67px');
			
			
			
			// 下面是user search bar 的autoComplete
			$(":not(div#user_search_suggest)").click(function(){
				$("#user_search_suggest").css('display', 'none');
			});	
			var user_pre_keycode = new CreateObj(0);
			var user_pre_prefix = new CreateObj('');
			var user_item_counter = new CreateObj(0);
			var user_item_amount = new CreateObj(0);
			
			// 將input bar 上綁定事件和其對應的處理函式
			$("#query_user").keyup(function(e){
				doUserAutoComplete(e, user_pre_keycode, user_pre_prefix, user_item_counter, user_item_amount);
			});
			
			$(".user_search_suggest_item").live('mouseover', function(){
				var username = $(this).text();
				$("#query_user").val(username);
				$(".user_search_suggest_item").css('background-color', 'white');
				$(this).css('background-color', '#BFBFBF');
			});
			
			$(".user_search_suggest_item").live('mouseout', function(){
				$(this).css('background-color', 'white');
			});
			
			$(".user_search_suggest_item").live('click', function(){
				var username = $(this).text();
				$("#query_user").val(username);
				$("#user_search_suggest").css("display", 'none');
				//ToUserPage(username);
			});

			
			
			// 下面是header search bar 的autoComplete			
			$(":not(div#search_suggest)").click(function(){
				$("#search_suggest").css('display', 'none');
			});

			var pre_keycode = new CreateObj(0);
			var pre_prefix = new CreateObj('');
			var item_counter = new CreateObj(0);
			var item_amount = new CreateObj(0);
			
			$("#keytag").keyup(function(e){
				doAutoComplete(e, pre_keycode, pre_prefix, item_counter, item_amount);
			});
			
			
			$(".search_suggest_item").live('mouseover', function(){
				// fetch the tagtext, not the tagtext on display(Because it maybe just a slice of the real tagtext).
				var keytag = $(this).children("input").val();
				$("#keytag").val(keytag);
				$(".search_suggest_item").css('background-color', 'white');
				$(this).css('background-color', '#BFBFBF');
			});
			
			$(".search_suggest_item").live('mouseout', function(){
				$(this).css('background-color', 'white');
			});
			
			$(".search_suggest_item").live('click', function(){
				var keytag = $(this).children("input").val();
				$("#keytag").val(keytag);
				$("#search_suggest").css("display", 'none');
				//ToClassifyPage(keytag);
			});
	});