//名前空間オブジェクト
var wordsearch = new Object();

wordsearch.LiveSearchController = Class.create({
    /**
     * コンストラクタ
     * A:ページがロードされた 
     * A-1: 0.5秒おきの実行タイマーを設定
     */
    initialize: function() {
		document.observe("contentloaded", function() {
			$('search_results').hide();
		    wordsearch.controller.liveSearch = 
			new wordsearch.LiveSearch($F('box_search'));
			$('box_search').observe("focus", function(){
				if(wordsearch.controller.pe == null || wordsearch.controller.pe == undefined){
				    wordsearch.controller.pe = 
				new PeriodicalExecuter(wordsearch.controller.checkPeriodically, 0.5);
				};
			});
    		document.observe("click", wordsearch.controller.hide);
    		document.observe("keypress", wordsearch.controller.hide);
    		document.observe("keydown", wordsearch.controller.hide);
			$('box_search').observe("keydown", wordsearch.controller.move);
//カーソル当たっている場所
			wordsearch.controller.index = 0;
//候補の数
			wordsearch.controller.resultlist = 0;
//今現在入力欄にある値
    		wordsearch.controller.keywordBackup = $F('box_search');

		});
    },
    /**
     * B: 0.5秒が経過した
     * B-1:検索結果の取得を依頼
     */
    checkPeriodically: function() {
	wordsearch.controller.liveSearch.search($F('box_search'), 'wordsearch.controller.reflesh');
    },
    /**
     * C:wordsearchから検索結果が取得された
     * C-1: 検索結果の描画を依頼
     * C-2: 描画された各動画のonClickイベントへのハンドラの登録
     */
    reflesh: function(kws) {
	wordsearch.LiveSearchView.update(kws);
	wordsearch.controller.resultlist = 0;
	var v = $('search_results').getElementsByClassName('kw');
	$A(v).each(function(element, index) {
	    element.observe("mouseover", wordsearch.controller.on);
	    element.observe("mouseout", wordsearch.controller.out);
	    element.observe("click", wordsearch.controller.select);
	    wordsearch.controller.resultlist++;
	});
    },
    /**
     * D:検索結果のうちひとつが選択された
     * D-1: クリックされた動画の詳細情報の描画を依頼
     */
    on: function() {
	var kw;
	if (this.className != 'kw') {
	    kw = this.parentNode;
	}
	else {
	    kw = this;
	}
	if(kw.className == 'kw'){
		wordsearch.LiveSearchView.show(kw.id, "on");
	}
	return false;
    },


    out: function() {
	var kw;
	if (this.className != 'kw_m') {
	    kw = this.parentNode;
	}
	else {
	    kw = this;
	}
	if(kw.className == 'kw_m'){
		wordsearch.LiveSearchView.show(kw.id, "out");
	}
	return false;
    },

    select: function(event) {
//alert(Event.element(event).id);
	var kw;
	if (this.className != 'kw_m') {
	    kw = this.parentNode;
	}
	else {
	    kw = this;
	}
	if(kw.className == 'kw_m'){
    	wordsearch.controller.liveSearch.initialize(kw.firstChild.innerHTML);
		wordsearch.LiveSearchView.show(kw.id, "click");
//カーソル当たっている場所
		wordsearch.controller.index = 0;
//候補の数
		wordsearch.controller.resultlist = 0;
//今現在入力欄にある値
    	wordsearch.controller.keywordBackup = $F('box_search');
//キーワード入力欄にフォーカスする
    	Field.focus('box_search');
	}
	return false;
    },

//イベントが起こった先が検索語入力欄か候補欄（別途定義しているので）でなかったらタイマー解除して、候補欄表示を隠す
	hide: function(event){
    	var ev = Event.element(event);
    	if(ev.id != 'box_search' && ev.className != 'title'){
    		if(wordsearch.controller.pe != null && wordsearch.controller.pe != undefined){
    			wordsearch.controller.pe.stop();
    			wordsearch.controller.pe = null;
    			
    			$('search_results').update("");
				$('search_results').hide();
    		}
    	}
	},


	move: function(event){
//上下キー（候補リストを上下する）
    if (event.keyCode == 38 || event.keyCode == 40){
    	if(wordsearch.controller.resultlist > 0){
			if(wordsearch.controller.index > 0){
				wordsearch.LiveSearchView.show('kw'+wordsearch.controller.index, "out");
			}else{
    			wordsearch.controller.keywordBackup = $F('box_search');
			}
			if(event.keyCode == 38){
    			wordsearch.controller.index = (wordsearch.controller.index + wordsearch.controller.resultlist) % (wordsearch.controller.resultlist + 1);
    		}else{
    			wordsearch.controller.index = (wordsearch.controller.index + 1) % (wordsearch.controller.resultlist + 1);
    		}

//候補にカーソルが当たっている場合、入力欄はその候補の文字列になる
			if(wordsearch.controller.index > 0){
				wordsearch.LiveSearchView.show('kw'+wordsearch.controller.index, "on");
    			wordsearch.controller.liveSearch.initialize($('title'+wordsearch.controller.index).innerHTML);
    			document.getElementById("box_search").value = $('title'+wordsearch.controller.index).innerHTML;

//カーソルが入力欄に戻っている時は、上下キーで動かす前の文字列になる
			}else{
    			wordsearch.controller.liveSearch.initialize(wordsearch.controller.keywordBackup);
    			document.getElementById("box_search").value = wordsearch.controller.keywordBackup;
			}
    	}

//RETURNキー(候補リストが消える)
//ESCキー（候補リストが消え、入力時の文字列に戻る）
    } else if (event.keyCode == 13 || event.keyCode == 27) {
    	if(event.keyCode == 27){
    		wordsearch.controller.liveSearch.initialize(wordsearch.controller.keywordBackup);
    		document.getElementById("box_search").value = wordsearch.controller.keywordBackup;
		}
    	$('search_results').update("");
		$('search_results').hide();
//カーソル当たっている場所
		wordsearch.controller.index = 0;
//候補の数
		wordsearch.controller.resultlist = 0;
//今現在入力欄にある値
    	wordsearch.controller.keywordBackup = $F('box_search');
//キーワード入力欄にフォーカスする
    	Field.focus('box_search');

	}
	}
});

wordsearch.controller = new wordsearch.LiveSearchController();
