

(function($){
	
	$.fn.estimate = function(options)
	{
		var elem = this;
		var options = $.extend({
			
		}, options);
		
		var targets = $(this).find("input, select");
		
		//データ使用準備
		var config = new EstConfig();
		var hand = config.handle;
		var dat = config.data;
		
		//現在のトップレベルキー
		var topLevelKey;
		
		//対象のselect要素に指定されたoption要素を追加
		var rewrite = function($rewriteArea, $key, $group)
		{
			var areaArr = $rewriteArea;
			var tmp = dat[$group];
			for(var i = 0; i < areaArr.length; i++)
			{
				var exp = "select#" + areaArr[i];
				$(exp).empty();
				
				for(var el in tmp[areaArr[i]][$key])
				{
					//初期表示状態が選択された時リセットが効くようにvalue値をセット
					if(tmp[areaArr[i]][$key][el] == tmp[areaArr[i]][$key]['def'])
					{
						var add = '\n<option value="-">' + tmp[areaArr[i]][$key][el] + '</option>';
					}
					else
					{
						var add = '\n<option value="' + tmp[areaArr[i]][$key][el] + '">' + tmp[areaArr[i]][$key][el] + '</option>';
					}
					$(exp).append(add);
				}
			}
		}
		
		//対象のselect要素をリセット
		var reset = function($resetArea, $group)
		{
			var areaArr = $resetArea;
			
			//トップレベルリセットの場合、専用関数を実行し続く処理をストップ
			if(areaArr == 'ALL_AREA')
			{
				resetAll();
				return;
			}
			
			var tmp = dat[$group];
			for(var i = 0; i < areaArr.length; i++)
			{
				var exp = "select#" + areaArr[i];
				$(exp).empty();
				
				var add = '\n<option value="' + tmp[areaArr[i]]['RESET'] + '">' + tmp[areaArr[i]]['RESET'] + '</option>';
				$(exp).append(add);
			}
		}
		
		//トップレベルリセットがかかった時の処理
		var resetAll = function()
		{
			var allArea = config.all; //Array
			for(var i = 0; i < allArea.length; i++)
			{
				var exp = "select#" + allArea[i];
				$(exp).empty();
				
				//データコンフィグ内を検索しRESET時の表現を取得
				for(var main in dat)
				{
					for(var sub in dat[main])
					{
						if(sub == allArea[i])
						{
							var word = dat[main][sub]['RESET'];
							var add = '\n<option value="' + word + '">' + word + '</option>';
							$(exp).append(add);
						}
					}
				}
			}
		}
		
		targets.each(function(){
			switch(this.tagName)
			{
				case "INPUT" :
					$(this).click(function(e){
						//case input 
					});
					break;
					
				case "SELECT" :
					$(this).change(function(e){
						//対象のハンドルを設定
						var handleSet = hand[e.currentTarget.name];
						
						//handleの設定が無い要素では無効
						if(handleSet != undefined)
						{
							for(var item in handleSet)
							{
								if(e.currentTarget.value == handleSet[item]['val'])
								{
									//DEFAULT値が選択された場合リセット
									if(handleSet[item]['val'] == '-')
									{
										reset(handleSet[item]['rel'], e.currentTarget.name);
										if(topLevelKey != undefined) topLevelKey = undefined;
									}
									//選択された項目によって関連付けされたselectを書き換え
									else
									{
										rewrite(handleSet[item]['rel'], handleSet[item]['key'], e.currentTarget.name);
										if(topLevelKey == undefined) topLevelKey = handleSet[item]['key'];
									}
								}
							}
						}
					});
					break;
			}
		});
		return this;
	}
	
})(jQuery);

