﻿$search = (function(){
	// Search Callback Creater
	function create_callback_map_filter($key, $fieldInfoIdx, $mapInfoIdx)
	{
		return function(){
			var config = $config.search[$key];
			var map = $config.map[config.fields[$fieldInfoIdx].map];
			var aID = $key + "_" + config.fields[$fieldInfoIdx].map + "_" + ("" + map[$mapInfoIdx].index).replace(/\-/ig, "_");
			var dom = document.getElementById(aID);
			if(dom.className == "select")
				return;
			var filter = {};
			filter[config.fields[$fieldInfoIdx].field] = map[$mapInfoIdx].index;
			search_search($key, filter);
		};
	}
	function create_callback_input_filter($key, $fieldInfoIdx)
	{
		return function($event){
			$event = $event || window.event;
			var keyCode = $event.which || $event.keyCode;
			if(keyCode == 13)
			{
				var config = $config.search[$key];
				var fieldKey = config.fields[$fieldInfoIdx].field;
				var iID = "Input_" + $key + "_" + fieldKey;
				var dom = document.getElementById(iID);
				if(dom.value == arrSearch[$key].filter[fieldKey])
					return;
				var filter = {};
				filter[fieldKey] = dom.value;
				search_search($key, filter);
			}
		};
	}
	function  create_callback_input_update($key, i)
	{
		return function(){
			search_update_dom($key, i);
		};
	}
	// Search Panel Render
	function search_render($parent, $rc)
	{
		var config = $config.search[$rc.name];
		if(typeof(config) != "object")
			return null;

		var $rcSearch = {
			$tag : "table"
			,className : "search"
			,$childs : []
		};
		var $rcRow;
		var idxRow = 0;
		
		$rcRow = { $tag : "tr", className : "button", $style : { cursor : "pointer" }, $childs : [] };
		$rcRow.$childs[0] = {
			$tag : "td"
			,colSpan : 2
			,noWrap : "nowrap"
			,align : "center"
			,innerHTML : "返&nbsp;回"
			,onclick : function(){ $grid.show("top_addon_new") }
		};
		$rcSearch.$childs[idxRow++] = $rcRow;
		if(config.fields && config.fields.length > 0)
		{
			var iID;
			for(var i=0;i<config.fields.length;i++)
			{
				var iID = "Input_" + $rc.name + "_" + config.fields[i].field;
				$rcRow = {
					$tag : "tr"
					,className : "head"
					,$childs : [
						{ $tag : "td", align : "right", noWrap : "nowrap", innerHTML : config.fields[i].name }
						,{
							$tag : "td"
							,noWrap : "nowrap"
							,width : "100%"
							, $childs : [
								{ $tag : "input", className : "input", id : iID }
							] 
						}
					]
				};
				switch(config.fields[i].type)
				{
					case "text":
						$rcRow.$childs[1].$childs[0].title = "回车搜索";
						$rcRow.$childs[1].$childs[0].onkeyup = create_callback_input_filter($rc.name, i);
						$rcRow.$childs[1].$childs[0].onblur = create_callback_input_update($rc.name, i);
						break;
					case "map":
						$rcRow.$childs[1].$childs[0].className = "label";
						$rcRow.$childs[1].$childs[0].readOnly = "readonly";
						$rcSearch.$childs[idxRow++] = $rcRow;
						$rcRow = {
							$tag : "tr"
							,$childs : [{ $tag : "td", colSpan : 2, $childs : [] }]
						};
						var map = $config.map[config.fields[i].map] || [];
						var aID;
						for(var j=0;j<map.length;j++)
						{
							aID = $rc.name + "_" + config.fields[i].map + "_" + ("" + map[j].index).replace(/\-/ig, "_");
							$rcRow.$childs[0].$childs[j*2] = {
								$tag : "a"
								,href : "javascript:void(0)"
								,id : aID
								,className : "search"
								,innerHTML : map[j].name
								,onclick : create_callback_map_filter($rc.name, i, j)
							};
							$rcRow.$childs[0].$childs[j*2 + 1] = {
								$tag : "span"
								//,$style : { wordBreak : "break-all" }
							};
						}
						break;
				}
				$rcSearch.$childs[idxRow++] = $rcRow;
			}
		}

		$dhtml.create($parent, $rcSearch);
	}
	$dhtml.registerRcType("search", search_render);
	//
	function search_find_filter_field_index($key, field)
	{
		var config = $config.search[$key];
		for(var i=0;i<config.fields.length;i++)
		{
			if(config.fields[i].field == field)
				return i;
		}
		return -1;
	}
	function search_get_map_idx($map, $index)
	{
		for(var i=0;i<$map.length;i++)
		{
			if($map[i].index == $index)
				return i;
		}
		return -1;
	}
	function search_update_dom($key, $fieldInfoIdx)
	{
		var config = $config.search[$key];
		var fieldInfo = config.fields[$fieldInfoIdx];

		var iID = "Input_" + $key + "_" + fieldInfo.field;
		var inputDom = document.getElementById(iID);
		var map, aID, dom;
		switch(fieldInfo.type)
		{
			case "text":
				if(inputDom)
					inputDom.value = arrSearch[$key].filter[fieldInfo.field] || "";
				break;
			case "map":
				map = $config.map[fieldInfo.map];
				var mapIdx = search_get_map_idx(map, arrSearch[$key].filter[fieldInfo.field] || -1);
				if(inputDom)
				{
					if(mapIdx >= 0)
						inputDom.value = map[mapIdx].name;
					else
						inputDom.value = "&nbsp;";
				}
				for(var i=0;i<map.length;i++)
				{
					aID = $key + "_" + fieldInfo.map + "_" + ("" + map[i].index).replace(/\-/ig, "_");
					dom = document.getElementById(aID);
					if(dom)
					{
						if(i == mapIdx)
							dom.className = "select";
						else
							dom.className = "search";
					}
				}
				break;
		}
	}
	function search_search($key, $param, $overwrite)
	{
		$overwrite = $overwrite || false;
		$param = $param || {};
		var config = $config.search[$key];
		if($overwrite)
			arrSearch[$key].filter = $param;
		else
		{
			for(key in $param)
				arrSearch[$key].filter[key] = $param[key];
		}
		$data.filter(config.data, arrSearch[$key].filter);

		for(var i=0;i<config.fields.length;i++)
		{
			search_update_dom($key, i);
		}
	}

	var arrSearch = {};
	for(key in $config.search)
	{
		arrSearch[key] = {
			filter : {}
		};
	}

	return {
		search : search_search
	};
})();
