///////////////////////////////////////////////////////////
//
// Human Interface Device Event Control
//
// @author K.Jomura ( kazuhiko@jomura.net http://jomura.net/ )
// @author $LastChangedBy$
// @since 2009.09.16
// @version 2010.08.13 lighten
//          2010.04.02 enable to use on frame
//          2010.03.12 Disabled [Space]Key
//          2009.10.05 version 1                                                                            //
///////////////////////////////////////////////////////////

/*
 * 必要に応じて本ファイルの内容をcommon.js等に取り込んでください。
 */

/*
 * コンテキストメニュー制御スクリプト
 */
//bodyオブジェクトはload後でないと取得できないため、loadイベントでセットする
addEvent(window, "load", set_oncontextmenu);
function set_oncontextmenu() {
	var bodys = document.getElementsByTagName("body");
	if (bodys.length != 1) {
		return;
	}
	var body = bodys[0];
	if ('\v' == 'v') {
		body.oncontextmenu = enableContextMenu; // for IE
	} else {
		body.setAttribute("oncontextmenu",
				"return enableContextMenu();"); // forFirefox
	}
}
function enableContextMenu() {
	var obj = document.activeElement;
	// フォーカスが当たっていない場合は無効化
	if (obj != null && obj.type != null) {
		// TEXTAREAもしくはINPUTでtypeがTEXTかPASSWORDの場合は、標準動作
		if (obj.tagName.toUpperCase() == 'TEXTAREA'
			|| (obj.tagName.toUpperCase() == 'INPUT'
				&& (obj.type.toUpperCase() == 'TEXT'
					|| obj.type.toUpperCase() == 'PASSWORD'))) {
			if (!obj.readOnly) {
				return true;
			}
		}
	}
	return false;
}

/*
 * マウスクリック制御スクリプト
 */
/*
// 画面でマウスがクリックされた時のイベントハンドラー
addEvent(document, "mousedown", mouseHook);
addEvent(document, "mouseup", mouseHook);
function mouseHook(e) {
	var _event;
	if ('\v' == 'v') {
		_event = event; // for IE
	} else {
		_event = e; // for Firefox
	}

	// クリックされたタイミングでフォーカスされたエレメントの取得
	var obj = document.activeElement;

	if (_event.button & 2) // 右クリック
	{
		// 無効化
		// return disableMouseEvent(_event);
	}

	// ブラウザ標準の動作
	return true;

	// マウスイベントを無効化する。
	function disableMouseEvent(_event) {
		_event.cancelBubble = true; // イベントの通知を禁止
		alert('右クリックメニューは使用できません。'); // 右クリックメニューを防止する為に必須
		return false; // その他イベントを禁止
	}
}
*/

/*
 * キー制御スクリプト
 */
// bodyオブジェクトはload後でないと取得できないため、loadイベントでセットする
addEvent(window, "load", set_onkeydown);
function set_onkeydown() {
	if ('\v' == 'v') {
		addEvent(document.body, "keydown", keyHook); // for IE
	} else {
		document.onkeydown = keyHook; // for Firefox
	}
}
function keyHook(e) {
	var _event;
	if ('\v' == 'v') {
		_event = event; // for IE
	} else {
		_event = e; // for Firefox
	}

	// キーが押されたタイミングでフォーカスされたエレメントの取得
	var obj = document.activeElement;

	// 以下、キー毎に処理を行う
	// Alt + F4 ,ESCについてはJavaScriptでの防止は不可。

	// Ctrlキー
	if (_event.ctrlKey) {
		switch (_event.keyCode) {
		case 66: // Ctrl + B 標準動作：[お気に入りの整理] ダイアログ ボックを表示する。
		case 68: // Ctrl + D 標準動作：現在のページを[お気に入り]に追加する
		case 69: // Ctrl + E 標準動作：検索バーを表示する。
		case 72: // Ctrl + H 標準動作：履歴バーを表示する。
		case 73: // Ctrl + I 標準動作：お気に入りバーを表示する。
		case 76: // Ctrl + L 標準動作：新しくファイルを開く。
		case 78: // Ctrl + N 標準動作：新しいウィンドウを表示する。
		case 79: // Ctrl + O 標準動作：新しくファイルを開く。
		case 82: // Ctrl + R 標準動作：現在の Web ページを更新する。
		case 83: // Ctrl + S 標準動作：現在のページを保存する。※未反応だが念の為に
		case 87: // Ctrl + W 標準動作：現在のウィンドウを閉じる。
			return disableKeyEvent(_event);
		}
	}

	// Altキー
	if (_event.altKey) {
		switch (_event.keyCode) {
		case 36: // Alt + Home 標準動作：ホーム ページに移動する。
		case 37: // Alt + ← (左矢印) 標準動作：前のページに移動する。
		case 39: // Alt + → (右矢印) 標準動作：次のページに移動する。
			disableKeyEvent(_event);
			if ('\v' == 'v') {
				// IEはメッセージ表示をしないと無効化できない
				disableKeyEventAlert();
			}
			return false;
		}
	}

	switch (_event.keyCode) {
	case 8:
		// BackSpaceキー
		// 標準動作：前のページに移動する。

		// コントロールのタイプが取得できない場合にはアクションを起こさない
		if (obj != null && obj.type != null) {
			// TEXTAREAもしくはINPUTでtypeがTEXTかPASSWORDの場合は、標準動作
			if (obj.tagName.toUpperCase() == 'TEXTAREA'
				|| (obj.tagName.toUpperCase() == 'INPUT'
					&& (obj.type.toUpperCase() == 'TEXT'
						|| obj.type.toUpperCase() == 'PASSWORD'))) {
				if (!obj.readOnly) {
					return true;
				}
			}
		}
		return disableKeyEvent(_event);
		break;

	case 32:
		// Spaceキー
		// 標準動作：様々

		// コントロールのタイプが取得できない場合にはアクションを起こさない
		if (obj != null && obj.type != null) {
			// INPUTで、typeがTEXTかPASSWORDの場合は、標準動作
			// TEXTAREAもしくはINPUTでtypeがTEXT,PASSWORD,CHECKBOX,RADIOの
			//  いずれかの場合は、標準動作
			if (obj.tagName.toUpperCase() == 'TEXTAREA'
				|| (obj.tagName.toUpperCase() == 'INPUT'
					&& (obj.type.toUpperCase() == 'TEXT'
							|| obj.type.toUpperCase() == 'PASSWORD'
							|| obj.type.toUpperCase() == 'CHECKBOX' 
							|| obj.type.toUpperCase() == 'RADIO'))) {
				if (!obj.readOnly) {
					return true;
				}
			}
		}
		return disableKeyEvent(_event);
		break;

	case 13:
		// Enterキー
		// 標準動作：様々

		// Do Nothing
		break;

	case 93:
		// ContextMenuキー
		// 標準動作：コンテキストメニューを表示する。

		// Do Nothing
		// body.oncontextmenuで制御するため、キー制御は不要。
		break;

	// ファンクションキー等
	// ヘルプ表示以外のすべてのファンクションキーを無効化
	case 113: // F2 標準動作：なし
	case 114: // F3 標準動作：Googleツールバーの表示。
	case 115: // F4 標準動作：以前入力したアドレスの一覧を表示する。
	case 116: // F5 標準動作：(Ctrl + F5)現在のページを更新する。
	case 117: // F6 標準動作：なし
	case 118: // F7 標準動作：なし
	case 119: // F8 標準動作：なし
	case 120: // F9 標準動作：なし
	case 121: // F10 標準動作：（Shift + F10）リンクのショートカット(右クリック)メニュを表示する。
	case 122: // F11 標準動作：ブラウザ ウィンドウの全画面表示と通常表示を切替える。
	case 123: // F12 標準動作：？
	case 124: // F13 標準動作：？
	case 125: // F14 標準動作：？
	case 126: // F15 標準動作：？
	case 127: // F16 標準動作：？

	case 166: // ThinkPadの「戻る」 ※効かない
	case 167: // ThinkPadの「進む」 ※効かない
		return disableKeyEvent(_event);
	}

	// ブラウザ標準の動作
	return true;

	// キーイベントを無効化する。
	function disableKeyEvent(_event) {
		if ('\v' == 'v') {
			_event.keyCode = -1; // キーコードを無効化 (Firefoxにはsetter無し=IE専用?)
		}
		_event.cancelBubble = true; // イベントの通知を禁止
		_event.returnValue = false;
		return false;
	}

	// メッセージを表示してイベント処理実行を防止する。
	function disableKeyEventAlert() {
		alert("このショートカットキーは使用できません。");
	}
}

function addEvent(elem, eventType, fn) {
	if (elem.addEventListener) { // for W3C DOM
		elem.addEventListener(eventType, fn, false);
	} else if (elem.attachEvent) { // for IE
		elem.attachEvent('on' + eventType, fn);
	} else {
		elem['on' + eventType] = fn;
	}
}

