/**
 * 階層連動メニューjQueryプラグイン
 *
 * @fileoverview 読み込んだJSONファイルに基づき階層的な連動メニューを表示します。
 *
 * @author	 SharpWedge
 * @version  SVN: $Id:$
 * @requires jQuery.js <http://jquery.com/>
 */

(function($) {
	$.fn.swLinkageMenu = function(op) {
		var options = {
			/** JSONベースファイル名 */
			file  : '',
			/** JSONファイル格納ディレクトリ（省略時カレント） */
			path   : '.',
			/** JSONファイル拡張子（省略時「js」） */
			ext   : 'js',
			/** 初期値配列 */
			value : null,
			/** 文字コード **/
			charset  : 'UTF-8'
		};
		var i = 0;
		var id_table = new Array();

		$.extend(options, op||{});

		return this.each(function() {
			/**
			 * 選択項目読み込み
			 *
			 * @param ele 選択項目設定要素
			 * @param file JSONファイル名
			 */
			this.loadOption = function(ele, file, idx) {
				swLinkageMenuCallbackObject = options;
				swLinkageMenuCallbackElement = ele;
				swLinkageMenuCallbackIndex = idx;
				$.getJSON(options.path + 'output.php?file=' + file + '.' + options.ext + '&charset=' + options.charset + '&jsoncallback=?', swLinkageMenuJsonCallback);
				ele.attr('disabled','');
			}

			id_table[i] = '#' + $(this).attr('id');

			// メニュー選択イベント処理
			if (i == 0) {
				// 親メニュー
				this.loadOption($(this), options.file, 0);
			} else {
				// 子メニュー
				$(id_table[i-1]).bind('change', Array(id_table, i), function(ev) {
					var id_table = ev.data[0];
					var idx = ev.data[1];
					if ($(id_table[idx-1] + ' > :selected').val() != '') {
						this.loadOption($(id_table[idx]), $(id_table[idx-1] + ' > :selected').val(), idx);
					} else {
						$(id_table[idx]).empty();
						$(id_table[idx]).attr('disabled','disabled');
					}
					for (var j = idx+1; j < id_table.length; j++) {
						$(id_table[j]).empty();
						$(id_table[j]).attr('disabled','disabled');
					}
				});
				$(this).attr('disabled','disabled');
			}

			i++;
		});
	}
})(jQuery);


// JSONPコールバック関数
var swLinkageMenuCallbackObject;
var swLinkageMenuCallbackElement;
var swLinkageMenuCallbackIndex;
swLinkageMenuJsonCallback = function(data) {
	swLinkageMenuCallbackElement.empty();
	swLinkageMenuCallbackElement.append('<option value="">' + ((data.prompt)? data.prompt : '選択してください') +	'</option>');
	$.each(data.data, function(i, item) {
		$opt = $('<option/>').val(item.value).text(item.name);
		if ((swLinkageMenuCallbackObject.value != null) && (swLinkageMenuCallbackObject.value.length >= (swLinkageMenuCallbackIndex + 1)) && (swLinkageMenuCallbackObject.value[swLinkageMenuCallbackIndex] == item.value)) {
			$opt.attr('selected', 'selected');
		}
		$opt.appendTo(swLinkageMenuCallbackElement);
	});
	swLinkageMenuCallbackElement.change();
}
