$action = new Object;

$action.suggest = {
	init :function()
	{
		this.name      = $action.suggest.init.prototype.name;
		this.elementId = $action.suggest.init.prototype.elementId;
		this.multiple  = $action.suggest.init.prototype.multiple;
		this.suggest   = $action.suggest.init.prototype.suggest;
		this.hover     = $action.suggest.init.prototype.hover;
		return this;
	},
	setKeyword : function()
	{
		var $init     = $action.suggest.init();
		var $element  = 'input[@name=' + $init.name + ']';
		var $keyword  = '';

		if( $action.suggest.init.prototype.inputkeyword != $($element).val() )
		{
			$action.suggest.init.prototype.inputkeyword = $($element).val();

			$keyword     = $($element).val();
			$keyword     = encodeURIComponent($keyword);
			$keyword     = $keyword.replace(/%E3%80%80/g,"%20");
			$keyword     = decodeURIComponent($keyword);
			this.keyword = $keyword;

			if( $init.multiple )
			{
				if( $.browser.msie )
				{
					this.cursor = document.selection.createRange();
					this.cursor.moveEnd("textedit");
					this.point = this.keyword.length - this.cursor.text.length
				}
				else
				{
					this.point = document.getElementById($init.elementId).selectionStart;
				}

				if( this.keyword.indexOf(" ", this.point) != -1 )
				{
					this.point = this.keyword.indexOf(" ", this.point);
					$action.suggest.init.prototype.def = 1;
				}
				else
				{
					$action.suggest.init.prototype.def = 0;
				}

				$chara = (this.keyword.substring(0,this.point)).split(" ");

				this.keyword = $chara[ $chara.length-1 ];
			}
			else
			{
				this.point   = 0;
			}

			$action.suggest.init.prototype.point   = this.point;
			$action.suggest.init.prototype.keyword = this.keyword;
			$action.suggest.init.prototype.element = $element;

			if( this.keyword.length )
			{
				$path  = '/faq/keyword.php';
				$param = { keyword : this.keyword, ajax:'true' };
				$after = '$action.suggest.show()';

				_post( $path, $param, $after );
			}
		}
	},
	show : function( $result )
	{
		var $init     = $action.suggest.init();
		var $response = new ajaxResponse();
		var $suggest  = $init.suggest;

		if( $response.response.indexOf('ul') != -1 )
		{
			var $offset = _getOffSet( $init.elementId );
			$($suggest).html($response.response).show().css({top: $offset.top + $offset.height + 'px', left : $offset.left + 'px'});
			suggest.prototype.active = -1;
			$.each( $($suggest).find('a'), function(i)
			{
				$(this).click( function(event)
				{
					$action.suggest.selectedItem(i);
					$action.suggest.selectCurrent();
					$($suggest).hide();
					return false;
				})
			});
		}
		else
		{
			$($suggest).hide();
		}
	},
	selectedItem : function()
	{
		var $init    = $action.suggest.init();
		var $suggest = $init.suggest;
		var $hover   = $init.hover;
		var $element = $init.element;

		var $li = $($suggest).find('li');
		if (!$li) return false;

		$li.find('a').removeClass($hover);

		$($li[arguments[0]]).find('a').addClass($hover);
		$($element).focus();
	},
	selectItem : function()
	{
		var $init  = $action.suggest.init();
		var $hover = $init.hover;
		var $li = $($init.suggest).find('li');
		if ($li.length == 0) return false;

		suggest.prototype.active += arguments[0];

		if (suggest.prototype.active < 0)
		{
			suggest.prototype.active = $li.size() -1;
		}
		else if (suggest.prototype.active >= $li.size()  )
		{
			suggest.prototype.active = 0;
		}

		$li.find('a').removeClass($hover);
		$($li[suggest.prototype.active]).find('a').addClass($hover);
	},
	selectCurrent : function()
	{
		var $init    = $action.suggest.init();
		var $suggest = $init.suggest;
		var $hover   = $init.hover;

		var $li = $($suggest).find('li')[0];

		if ($li) {
			$.each( $($suggest).find('a'), function(i)
			{

				if($(this).attr('class') == $hover )
				{
					$action.suggest.replaceTag( $(this).find('.key').html() );
					return false;
				}
			});
			return true;
		} else {
			return false;
		}
	},
	replaceTag : function()
	{
		var $init    = $action.suggest.init();
		var $element = $action.suggest.init.prototype.element;
		var $point   = $action.suggest.init.prototype.point;
		var $keyword = $action.suggest.init.prototype.keyword;
		var $def     = $action.suggest.init.prototype.def;

		$newValue = "";
		$newValue += ($($element).val()).substring(0, $point-$keyword.length);
		$newValue += arguments[0];
		if( $def ) $newValue += ($($element).val()).substring($point, ($($element).val()).length);
		$($element).val( $newValue);
		suggest.prototype.active = -1;
		$action.suggest.init.prototype.inputkeyword = $newValue;
		$($init.suggest).hide();
	}
}

function suggest()
{
	this.set = function($param)
	{
		suggest.prototype.active    = -1;

		var setKeyword;
		var $element = $('input[@name=' + $param.inputName + ']');

		$($element).attr('autocomplete', 'off');
		$($element).keydown( function(event)
		{
			$action.suggest.init.prototype.name      = $param.inputName;
			$action.suggest.init.prototype.elementId = $param.inputId;
			$action.suggest.init.prototype.multiple  = $param.multiple;
			$action.suggest.init.prototype.suggest   = $param.suggestElement;
			$action.suggest.init.prototype.hover     = $param.suggestHoverClassName;
			$a = '$action.suggest.setKeyword()';
			switch(event.keyCode) {
				case 38: // up
					clearInterval(setKeyword);
					event.preventDefault();
					$action.suggest.selectItem(-1);
					break;
				case 40: // down
					clearInterval(setKeyword);
					event.preventDefault();
					$action.suggest.selectItem(1);
					break;
				case 13: // return
					clearInterval(setKeyword);
					if ($action.suggest.selectCurrent()) {
						event.preventDefault();
					}
					break;
				default:
					clearInterval(setKeyword);
					setKeyword = setInterval($a,500);
					break;
			}

			$('body').click( function()
			{
				$($action.suggest.init.prototype.suggest).hide();
			});
		});

		$($element).blur( function()
		{
			clearInterval(setKeyword);
		})

		$($element).keyup( function(event)
		{
			$a = '$action.suggest.setKeyword()';
			if( $($element).val() == '' )
			{
				clearInterval(setKeyword);
				$($param.suggestElement).hide();
				eval($a);
			}
		});
	}
}

jQuery(document).ready(function(){
	$suggest = new suggest();
	$suggest.set({inputName : 'keyword', inputId : 'keyword', multiple : false, suggestElement : '.suggest', suggestHoverClassName : 'active'});
});