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

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

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

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

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

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