/**
 * 一覧画面のListTableに関する操作
 */
var ListTable = {
	/**
	 * 前のページ
	 */
    prevPage: function() {
        var q = new Query(location.search);
        var page = (q.get('page') - 0 || 0 );
        if (page > 0) {
            page --;
        }
        q.set('page', page);
        location.href = q.serialize();
    },
    /**
     * 次のページ
     */
    nextPage: function() {
        var q = new Query(location.search);
        var page = (q.get('page')  || 1 );
        page ++;
        q.set('page', page);
        location.href = q.serialize();
    },
    /**
     * ページ指定
     * @param int p ページ数
     */
    page:function(p) {
    	var q = new Query(location.search);
    	q.set('page', p);
    	location.href = q.serialize();
    },
    /**
     * ソート
     * @param string key ソートするカラム名
     * @param bool reverse 一回目のクリックで降順を指定したい場合true
     */
    sort: function(key, reverse) {
        var q = new Query(location.search);
        var current = q.get('sort');
        if (reverse) {
        	if (key + ' desc' != current) {
        		key = key + " desc";
        	}
        } else {
	        if (key == current) {
	            key = key + " desc";
	        }
        }
        q.set('sort', key);
        location.href = q.serialize();
    },
    /**
     * チェックボックスを全て更新する
     * @param Element chkbox クリックされたチェックボックス
     * @param string key チェックボックスのname属性の共通プレフィックス
     */
    checkAll: function(chkbox, key) {
    	var inputs = $('table.ListTable input[type=checkbox][name^=' + key + ']');
    	inputs.each(function() {
   			this.checked = chkbox.checked;
   			ListTable.selectRow(this, chkbox.checked);
    	});
    },
    /**
     * 行を選択する
     */
    selectRow: function(elem, select) {
    	var $tr = $(elem).parents('tr.even,tr.odd');
    	if (select) {
    		$tr.addClass('selected');
    	} else {
    		$tr.removeClass('selected');
    	} 
    },
    /**
     * チェックされているチェックボックス全てにコールバック関数を適用する
     * @param string key チェックボックスのname属性の共通プレフィックス
     */
    eachChecked: function(key, callback) {
    	var inputs = $('table.ListTable input[type=checkbox][name^=' + key + ']');
    	inputs.each(function() {
    		callback(this);
    	});
    },
    /**
     * Table要素を囲むformを送信し、成功したら再読込する。要Commiter.js
     * @param Element elem フォーム要素（ボタンなど）
     * @param string url 送信先URL
     */
    commitForm: function(elem, url, confirmMessage) {
    	var inputs = $('table.ListTable input[type=checkbox][name]:checked');
    	if (inputs.length == 0) {
    		alert('一つも選択されていません。');
    		return;
    	}
    	if (confirmMessage && !confirm(confirmMessage)) {
    		return;
    	}
    	Commiter.commitForm(
    		elem.form,
    		{
    			url: url,
    			onSuccess: function(result) {
    				location.reload();
    			}
    		}
    	);
    },
    /**
     * ヘッダをホバー表現にする
     */
    hover: function(th) {
    	if (ListTable.hover.hoverred) {
    		ListTable.calmSortable(ListTable.hover.hoverred);
    	}
    	$(th).addClass('hover');
    	ListTable.hover.hoverred = th;
    },
    /**
     * ホバー表現を解除する
     */
    calm: function(th) {
    	$(th).removeClass('hover');
    	ListTable.hover.hoverred = null;
    }
};

$(function() {
	$('table.ListTable th.sortable').mouseover(function() {
		ListTable.hover(this);
	}).mouseout(function() {
		ListTable.calm(this);
	});
});