/**
 * サジェストjQueryプラグイン
 *
 * @fileoverview 読み込んだJSONファイルに基づきテキストボックスにサジェストを表示するjQueryプラグイン
 *
 * @author	 SharpWedge
 * @version  SVN: $Id:$
 * @requires jQuery.js <http://jquery.com/>
 * @requires suggest.js <http://www.enjoyxstudy.com/javascript/suggest/>
 * @requires swSuggest.css
 */

(function($) {
	/**
	 * 読み込んだJSONファイルに基づいてテキストボックスにサジェストを表示するjQueryプラグイン
	 *
	 * @param file	 JSONファイル名
	 * @param result 値格納先要素ID
	 * 要 jQuery.js  (http://jquery.com/）
	 * 要 suggest.js (http://www.enjoyxstudy.com/javascript/suggest/）
	 * HTMLに swSuggest.css を適用すること
	 * @constructor
	 */
	$.fn.swSuggest = function(op) {
		var options = {
			/** 候補名配列 */
			suggests : new Array(),
			suggestsValue : new Array(),
			/** 候補値配列 */
			values	 : new Array(),
			/** JSONパス名 */
			path	 : '',
			/** JSONファイル名 */
			file	 : '',
			/** 値格納先要素 */
			result	 : '',
			/** 文字コード **/
			charset  : 'UTF-8'
		};
		var element = $(this);

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

		return this.each(function() {
			// 値設定イベントハンドラ
			this.setResult = function(ev) {
				if (options.result != '') {
					var input = element.val();
					$(options.result).val('');
					for (var i = 0; i < options.suggests.length; i++ ) {
						if (input == options.suggests[i]) {
							$(options.result).val(options.values[i]);
							break;
						}
					}
				}
			}

			// 候補メニュー用要素設定
			$(this).attr('autocomplete', 'off');
			$(this).css('display', 'block'); // IE6,7対策
			$(this).after('<div id="sw_suggest__"></div>');
			if (options.result != '') $(options.result).val('');

			// イベントハンドラ設定
			//	フォーム送信時に値を設定
			$(this).parents('form').submit(this.setResult);
			//	候補が選択されたら値を設定
//			$(this).change(this.setResult).keydown(this.setResult).keyup(this.setResult);
//			$('#sw_suggest__').click(this.setResult);

			// JSONを読み込んで候補配列生成
			if (options.file != '') {
				swSuggestCallbackObject = options;
				$.getJSON(options.path + 'output.php?file=' + options.file + '&charset=' + options.charset + '&jsoncallback=?', swSuggestJsonCallback);
			}

			// オートコンプリートUI表示
			new Suggest.Local(
				$(this).attr('id'),				// 入力要素ID
				'sw_suggest__',					// 補完候補表示エリアID
				options.suggests,				// 補完候補検索対象配列
				{ prefix: true,
				  dispMax: 0,
				  candidateValueList: options.suggestsValue,
				   eventHandler: function(ev, id) {
					$('#'+id).trigger('suggest', [ev]);
				  }
				}	// オプション
			);
		});
	}
})(jQuery);


// JSONPコールバック関数
var swSuggestCallbackObject;
swSuggestJsonCallback = function(data) {
	$.each(data.data, function(i, item) {
		swSuggestCallbackObject.values.push(item.value);
		swSuggestCallbackObject.suggests.push(item.name);
		swSuggestCallbackObject.suggestsValue.push(item.label);
	});
}
