/**
 * search_controller.js
 * 
 * $Id$
 * 
 * @package		TMUH
 * @version		1.0.0
 * @author		Masayuki Iwai <miyabi@mybdesign.com>
 * @copyright	Copyright &copy; 2010 myb design all rights reserved.
 **/


var base_url = "/";

window.SearchController = function($)
{
	var self = this;
	var config = {
		"observing_interval": 200, 
		"incremental_search_keyword_selector": "input[name='query']", 
		"incremental_search_url": "search/incremental_search_json", 
		"incremental_search_result_departments": "診療科", 
		"incremental_search_result_doctors": "医師", 
		"incremental_search_result_disease": "疾病", 
		"get_departments_url": "departments/list_has_doctors_json", 
		"search_url": "search", 
		"search_doctor_url": "doctors/search_json", 
		"search_doctor_all": "指定なし", 
		"search_doctor_result_suffix": "医師一覧", 
		"search_doctor_result_by_index_suffix": "で始まる", 
		"search_doctor_result_by_department_suffix": "の", 
		"search_doctor_no_results": "該当者なし", 
		"search_disease_url": "disease/search_json", 
		"search_disease_all": "すべて", 
		"search_disease_no_results": "該当疾病なし", 
		"": ""
	};
	
	self.incremental_search_control = null;
	self.incremental_search_observer = null;
	self.incremental_search_busy_count = 0;
	self.incremental_search_prev_keyword = "";
	self.incremental_search_mousedown = false;
	
	self.search_doctor_primary = null;
	self.search_doctor_current_index = null;
	self.search_doctor_current_department = null;
	self.search_doctor_current_department_name = "";
	
	
	//////// Methods
	self.initialize = function()
	{
		if($(config.incremental_search_keyword_selector).size() > 0)
		{
			$(config.incremental_search_keyword_selector).each(function(index, obj) {
				$(obj.form).submit(function(e) { return false; });
				$(obj).keydown(function(e) {
					if(e.keyCode == 13)
					{
						var value = e.target.value;
						location.href = "" + base_url + config.search_url + ((value != "")? "/" + encodeURIComponent(value): "");
					}
				});
				$(obj.form).find("input.searchBoxBt01").click(function(e) {
					var value = e.target.form["query"].value;
					location.href = "" + base_url + config.search_url + ((value != "")? "/" + encodeURIComponent(value): "");
				});
				$(obj.form).find("input#submit").click(function(e) {
					var value = e.target.form["query"].value;
					location.href = "" + base_url + config.search_url + ((value != "")? "/" + encodeURIComponent(value): "");
				});
				
				// Prepare for incremental search
				$(obj.parentNode).append("<div class=\"incremental_search_result\" style=\"display:none;\"></div>");
				$(obj).focus(self.didFocusIncrementalSearchKeyword);
				$(obj).blur(self.didBlurIncrementalSearchKeyword);
				
				self.incremental_search_prev_keyword[index] = obj.value;
			});
		}
		
		// Prepare to search doctors
		self.setUpDepartmentSelection();
		$(".menuIshi ul li a").click(function(e) {
			$(".menuIshi ul li a").removeClass("selected");
			$(e.target).addClass("selected");
			
			var suffix = null;
			if($($(".menuIshi")[0].parentNode).hasClass("mainTopIndexIn"))
				suffix = "top";
			
			self.searchDoctor(e.target.innerHTML, null, suffix);
		});
		$(".menuIshi select[name='shinryoka']").change(function(e) {
			var suffix = null;
			if($($(".menuIshi")[0].parentNode).hasClass("mainTopIndexIn"))
				suffix = "top";
				
			self.searchDoctor(null, e.target.value, suffix);
		});
		$(".menuIshi .menuBtmLink a").click(function(e) {
			$(".menuIshi ul li a").removeClass("selected");
			self.showSearchDoctorResult(false);
		});
		
		// Prepare to search disease
		$(".menuShippei ul li a").click(function(e) {
			$(".menuShippei a").removeClass("selected");
			$(e.target).addClass("selected");
			$(".menuShippei input[type='text'].word")[0].value = "";
			self.searchDisease(e.target.innerHTML, "index");
		});
		$(".menuShippei input[type='image'].bt").click(function(e) {
			$(".menuShippei a").removeClass("selected");
			self.searchDisease($(".menuShippei input[type='text'].word")[0].value, "includes");
		});
		
		$(".menuShippei .menuBtmLink a").click(function(e) {
			$(".menuShippei ul li a").removeClass("selected");
			self.showSearchDiseaseResult(false);
		});
		if($("#search_disease_result").size() > 0)
			self.searchDisease("", "index");
	};
	
	
	self.beginLoading = function(target)
	{
		$(target).addClass("search_loading");
	};
	
	
	self.endLoading = function(target)
	{
		$(target).removeClass("search_loading");
	};
	
	
	//// For incremental search
	self.startObservingInputForIncrementalSearch = function()
	{
		if(!self.incremental_search_observer)
		{
			self.incremental_search_observer = window.setInterval(self.incrementalSearch, config.observing_interval);
		}
	};
	
	
	self.stopObservingInputForIncrementalSearch = function()
	{
		if(self.incremental_search_observer)
		{
			window.clearInterval(self.incremental_search_observer);
			self.incremental_search_observer = null;
			self.incremental_search_control = null;
		}
	};
	
	
	self.showIncrementalSearchResult = function(target, flag)
	{
		if(flag)
			$(target.parentNode).find(".incremental_search_result").show();
		else
			$(target.parentNode).find(".incremental_search_result").hide();
	};
	
	
	self.incrementalSearch = function()
	{
		if(self.incremental_search_control == null)
			return;
		 
		var keyword = self.incremental_search_control.value;
		if(keyword == self.incremental_search_prev_keyword)
		{
			return;
		}
		
		if(keyword == "")
		{
			self.showIncrementalSearchResult(self.incremental_search_control, false);
			self.incremental_search_prev_keyword = "";
			return;
		}
		
		if(self.incremental_search_busy_count > 0)
		{
			return;
		}
		
		self.incremental_search_prev_keyword = keyword;
		self.incremental_search_busy_count = 1;
		
		var result_container = $(self.incremental_search_control).siblings(".incremental_search_result")[0];
		if(!result_container)
			return;
		
		result_container.innerHTML = "";
		self.beginLoading(result_container);
		
		$.ajax({
			url: base_url + config.incremental_search_url, 
			type: "POST", 
			data: {
				"keyword": keyword
			}, 
			success: function(data, type) {
				self.endLoading(result_container);
				
				var response = eval("(" + data + ")");
				if(response.error == 0)
				{
					var result = response.result;
					var keys = {"departments":"Department", "doctors":"Doctor", "disease":"Disease"};
					var i = 0;
					var obj;
					for(var key in keys)
					{
						var items = result[key];
						if(items && items.length > 0)
						{
							if(i++ > 0)
								$(result_container).append("<hr />");
							
							$(result_container).append("<h3>" + config["incremental_search_result_" + key] + "</h3>");
							
							var list = "<ul>";
							for(var j=0; j<items.length; j++)
							{
								list += "<li><a href=\"javascript:void(0);\">";
								list += items[j][keys[key]].name + "</a></li>";
							}
							list += "</ul>";
							$(result_container).append(list);
						}
					}
					
					if(i > 0)
					{
						$(result_container).find("a").mousedown(function(e) {
							self.incremental_search_mousedown = true;
						});
						$(result_container).find("a").mouseup(function(e) {
							self.incremental_search_mousedown = false;
						});
						$(result_container).find("a").click(function(e) {
							self.incremental_search_mousedown = false;
							self.setSearchKeyword(self.incremental_search_control, e.target.innerHTML);
						});
						self.showIncrementalSearchResult(self.incremental_search_control, true);
					}
					else
					{
						self.showIncrementalSearchResult(self.incremental_search_control, false);
					}
				}
				
				self.incremental_search_busy_count = 0;
			}, 
			error: function(e) {
				self.endLoading(result_container);
//				window.alert(e.responseText);
				
				self.incremental_search_busy_count = 0;
			}
		});
	};
	
	
	self.setSearchKeyword = function(target, keyword)
	{
		self.stopObservingInputForIncrementalSearch();
		self.showIncrementalSearchResult(target, false);
		self.incremental_search_control = null;
		self.incremental_search_prev_keyword = "";
		
		target.value = keyword;
	};
	
	
	//// For searching doctors
	self.setUpDepartmentSelection = function()
	{
		var container = $(".menuIshi select[name='shinryoka']")[0];
		if(!container)
			return;
		
		container.options.length = 2;
		
		$.ajax({
			url: base_url + config.get_departments_url, 
			type: "GET", 
			success: function(data, type) {
				var response = eval("(" + data + ")");
				if(response.error == 0)
				{
					var result = response.result;
					if(result.length < 1)
					{
						return;
					}
					
					for(var i=0; i<result.length; i++)
					{
						$(container).append("<option value=\"" + result[i]["Department"]["id"] + "\">" + 
							result[i]["Department"]["name"] + "</option>");
					}
				}
			}, 
			error: function(e) {
//				window.alert(e.responseText);
			}
		});
	};
	
	
	self.showSearchDoctorResult = function(flag)
	{
		var container = $(".resultIshi")[0];
		
		if(flag)
		{
			$("#search_doctor_initial").hide();
			$(container).removeClass("result01");
			$(container).addClass("result02");
			var title = "";
			if(self.search_doctor_current_index != null)
				title += self.search_doctor_current_index + config.search_doctor_result_by_index_suffix;
			if(self.search_doctor_current_department != null)
				title += self.search_doctor_current_department_name + config.search_doctor_result_by_department_suffix;
			if(title == "")
				title += config.search_doctor_all + config.search_doctor_result_by_department_suffix;
			title += config.search_doctor_result_suffix;
			
			if($("#search_doctor_result h3 span").size() > 0)
				$("#search_doctor_result h3 span")[0].innerHTML = title;
			else if($("#search_doctor_result h4 span").size() > 0)
				$("#search_doctor_result h4 span")[0].innerHTML = title;
			
			$("#search_doctor_result").show();
		}
		else
		{
			$("#search_doctor_initial").show();
			$(container).addClass("result01");
			$(container).removeClass("result02");
			$("#search_doctor_result").hide();
		}
	};
	
	
	self.searchDoctor = function(index, department, suffix)
	{
		// Set up condition
		if(index != null)
		{
			if(index == config.search_doctor_all)
				self.search_doctor_current_index = null;
			else
				self.search_doctor_current_index = index;
		}
		if(department != null)
		{
			if(department == "")
			{
				self.search_doctor_current_department = null;
				self.search_doctor_current_department_name = "";
			}
			else
			{
				self.search_doctor_current_department = department;
				
				var select = $(".menuIshi select")[0];
				self.search_doctor_current_department_name = select.options[select.selectedIndex].innerHTML;
			}
		}
		
		if(self.search_doctor_current_index == null && self.search_doctor_current_department == null)
		{
			self.showSearchDoctorResult(false);
			return;
		}
		
		var result_container = $("#search_doctor_result ul")[0];
		result_container.innerHTML = "";
		self.beginLoading(result_container.parentNode.parentNode);
		self.showSearchDoctorResult(true);
		
		$.ajax({
			url: base_url + config.search_doctor_url, 
			type: "POST", 
			data: {
				"index": (self.search_doctor_current_index? self.search_doctor_current_index: ""), 
				"department": (self.search_doctor_current_department? self.search_doctor_current_department: "")
			}, 
			success: function(data, type) {
				self.endLoading(result_container.parentNode.parentNode);
				
				var response = eval("(" + data + ")");
				if(response.error == 0)
				{
					var result = response.result;
					if(result.length < 1)
					{
						result_container.innerHTML = config.search_doctor_no_results;
						return;
					}
					
					var item;
					for(var i=0; i<result.length; i++)
					{
						item = result[i];
						$(result_container).append("<li><a href=\"" + base_url + "shinryo/" + item["Department"]["path"] + 
							"/staff/" + self.zeroFill(item["Doctor"]["order_number"], 5) + ".html" + (suffix? "?" + suffix: "") + "\">" + 
							"<span>" + item["Doctor"]["name"] + "</span>（" + 
							item["Department"]["name"] + ((item["Doctor"]["position"] != "")? "/" + item["Doctor"]["position"]: "") + 
							"）</a></li>");
					}
				}
				else
				{
				}
			}, 
			error: function(obj, status, error) {
				self.endLoading(result_container.parentNode.parentNode);
				window.alert(status);
			}
		});
	};
	
	
	//// For searching disease
	self.showSearchDiseaseResult = function(flag)
	{
		var container = $(".resultShippei")[0];
		
		if(flag)
		{
			$("#search_disease_initial").hide();
			$(container).removeClass("result01");
			$(container).addClass("result02");
			$("#search_disease_result").show();
		}
		else
		{
			$("#search_disease_initial").show();
			$(container).addClass("result01");
			$(container).removeClass("result02");
			$("#search_disease_result").hide();
		}
	};
	
	
	self.searchDisease = function(keyword, match_type)
	{
		if(keyword == config.search_disease_all)
			keyword = "";
		
		if(keyword == null)
		{
			self.showSearchDiseaseResult(false);
			return;
		}
		
		var result_container = $("#search_disease_result ul")[0];
		result_container.innerHTML = "";
		self.beginLoading(result_container.parentNode.parentNode);
		self.showSearchDiseaseResult(true);
		
		$.ajax({
			url: base_url + config.search_disease_url + "/" + match_type, 
			type: "POST", 
			data: {
				"keyword": keyword
			}, 
			success: function(data, type) {
				self.endLoading(result_container.parentNode.parentNode);
				
				var response = eval("(" + data + ")");
				if(response.error == 0)
				{
					var result = response.result;
					if(result.length < 1)
					{
						result_container.innerHTML = config.search_disease_no_results;
						return;
					}
					
					var item;
					for(var i=0; i<result.length; i++)
					{
						item = result[i];
						$(result_container).append("<li><a href=\"" + base_url + "shippei/" + item["Disease"]["path"] + "/index.html\">" + 
							"<span>" + item["Disease"]["name"] + " (" + item["Disease"]["name_kana"] + ")</span>" + 
							"</a></li>");
					}
				}
				else
				{
				}
			}, 
			error: function(obj, status, error) {
				self.endLoading(result_container.parentNode.parentNode);
				window.alert(status);
			}
		});
	};
	
	
	//////// Event handlers
	self.didFocusIncrementalSearchKeyword = function(e)
	{
		// Start ovserving input for incremental search
		self.incremental_search_control = e.target;
		self.startObservingInputForIncrementalSearch();
	};
	
	
	self.didBlurIncrementalSearchKeyword = function(e)
	{
		if(self.incremental_search_mousedown)
			return;
		
		if(e.target != self.incremental_search_control)
			return;
		
		// Stop ovserving input for incremental search
		self.stopObservingInputForIncrementalSearch();
		self.showIncrementalSearchResult(e.target, false);
		self.incremental_search_control = null;
		self.incremental_search_prev_keyword = "";
	};
	
	
	//////// Utility methods
	self.enableControls = function(flag)
	{
		$("form.import_form input").each(function(index, obj) { obj.disabled = !flag; });
	};
	
	
	self.zeroFill = function(number, digits)
	{
		var result = number.toString();
		for(var i=0; i<digits; i++)
		{
			result = "0" + result;
		}
		return result.substr(result.length - digits, digits);
	};
	
	
	//////// Initialize
	self.initialize();
};

jQuery(document).ready(function($) { window.searchController = new SearchController($); });

