/**
 *  ABook Viewer for WEB
 *	Screen Lock Library
 *  Copyright (C) Agentec Co, Ltd. All rights reserved.
 * 
 * options
 * 		timeout:		タイムアウト秒
 * 		id:				オーバーレイ要素のID属性
 * 		html:			オーバーレイ上に表示するHTML
 * 		color:			テキスト色
 * 		opacity:		透明度
 * 		background:		背景色
 * 		lockspeed: 		アニメーションスピード（ 'slow' 'normal' 'fast' or millisecond like jquery.fadein/fadeout）
 * 		unlockFunc:		ロック解除イベント処理
 * 		userScript:		ユーザスクリプト
 * 
 * usage:
 * 
 * 	$(function() {
 * 		var options = { ... };
 * 		screenLock(options);
 * }
 * 
 */
function screenLock(options) {
	
	var idleTimerId = null;
	var bTimeout = false;
	var defaultOptions = {
							timeout : 600000,		// default timeout = 10min.
							id: 'to',
							html: 'Clickして画面ロックを解除してください。',
							color: '#fff',
							opacity: '0.95',
							background: '#333',
							lockspeed: 'slow',
							errorMessage: 'ロックを解除できません。入力したパスワードを確認してください。',
							unlockFunc : function(elmId) {
								// overlay click then fade out and remove element
								$('#' + elmId).fadeOut(lockspeed, function() { 
									
									// ロック画面をDOM要素から削除
									$('#' + elmId).remove(); 
									
									// 画面ロック状態を解除
									removeLockState();
									
									// アイドルタイマーをもう一度仕掛ける
									setIdleTimer();
								});
								
								// unlock
								return { 'result': true, 'errorCode' : 'success' };
							}
						};
						
	var timeout, elmId, html, color, opacity, background, lockspeed, unlockEvent, unlockFunc, errorMessage;
	
	// overlay option
	if(options) {
		timeout = (options.timeout) ? options.timeout : defaultOptions.timeout;
		elmId = (options.id) ? options.id : defaultOptions.id;
		html = (options.html) ? options.html : defaultOptions.html;
		color = (options.color) ? options.color : defaultOptions.color;
		opacity = (options.opacity) ? options.opacity : defaultOptions.opacity;
		background = (options.background) ? options.background : defaultOptions.background;
		lockspeed = (options.lockspeed) ? options.lockspeed : defaultOptions.lockspeed;
		unlockFunc = (options.unlockFunc) ? options.unlockFunc : null;
		errorMessage = (options.errorMessage) ? options.errorMessage : defaultOptions.errorMessage;
	} else {
		timeout = defaultOptions.timeout;
		elmId = defaultOptions.id;
		html = defaultOptions.html;
		color = defaultOptions.color;
		opacity = defaultOptions.opacity;
		background = defaultOptions.background;
		lockspeed = defaultOptions.lockspeed;
		unlockFunc = defaultOptions.unlockFunc;
		errorMessage = defaultOptions.errorMessage;
	}
	
	// bind event
	$(window).click(resetIdleTimer)
			 .mousemove(resetIdleTimer)
			 .keydown(resetIdleTimer)
			 .bind('touchstart', resetIdleTimer)
			 .bind('touchmove', resetIdleTimer);

	// アイドルタイマーを起動
	setIdleTimer();

	/* ロックするまでのアイドルタイマー */	
	function setIdleTimer() {
		
		// アイドルタイマーのタイムアウト時間（デフォルト/オプション指定時間）
		var idleStateTimeout = timeout;
		
		// clear timeout
		if(idleTimerId) {
			clearTimeout(idleTimerId);
			idleTimerId = null;
		}
		
		// すでにロック状態かどうかをチェックし、ロック状態であれば、即ロックをかける
		if(isLocked()) {
			idleStateTimeout = 0;
		}
		
		// clear lock state
		removeLockState();

		// set idle timeout
		idleTimerId = setTimeout(function() {
			
			// clear timer id
			clearTimeout(idleTimerId);
			idleTimerId = null;
			bTimeout = true;
			
			// set lock state
			setLockState();
			
			// show lock screen
			showLockScreen();
			
		}, idleStateTimeout);
				
		// clear time out
		bTimeout = false;
	};
	
	/* reset idle timer */
	function resetIdleTimer() {
		if(!bTimeout) {
			setIdleTimer();
		}
	};
	
	/* show lock screen */
	function showLockScreen() {
		
		// show message overlay
		var tags = '<div id="' + elmId + '" class="screenLock">' +
				   '<div style="display:table; width:100%; height:100%;">' + 
				   '<div style="display:table-cell; text-align:center; vertical-align:middle;">' +
				   '<p class="screenLock-content">' + html + i18nText('sysInfoScrLock01') + '</p>' + 
				   '<div id="pw" style="display:none;">' +
				   '<input id="passwd-txt" placeholder="'+i18nText('sysLockScrPwdInput')+'" type="password" value="" />&nbsp;' +
				   '<button id="unlock-btn">OK</button>' +
				   '<div id="screenLockErrMsg" class="screenLock-error" style="display:none;">' + errorMessage + '</div>' +
				   '</div>' +
				   '</div>' + 
				   '</div>' +
				   '</div>';
		$(document.body).append(tags);
		$('#' + elmId).css( {
			'color': color,
			'opacity': opacity,
			'display': 'none',
			'position': 'fixed',
			'top': '0',
			'left': '0',
			'width': $(window).width(),
			'height': $(window).height(),
			'background': background,
			'zIndex': '10000'
		})
		.fadeIn(lockspeed);
		
		// bind event hander to unlock
		$('#' + elmId).click(function() {
			$('#pw').fadeIn();
			var pwInputTimer = null;
			pwInputTimer = setTimeout(function() {
				$('#pw').fadeOut();
				clearTimeout(pwInputTimer);
			}, 15000);
			
			// フォーカスを当ててキーダウンイベントでタイムアウト解除を登録
			$('#passwd-txt').focus()
							.keydown(function(event) {
								// パスワード入力タイマーを解除
								if(pwInputTimer) {
									clearTimeout(pwInputTimer);									
								}
								pwInputTimer = null;
								// エンターキーで解除実行
								if(event.which == 13) {
									executeUnlock();
								}
							});
							
		});
		
		// force unlock function
		function forceUnlockFunc() {
			defaultOptions.unlockFunc(elmId);	
		};
		
		// execute unlock process 
		function executeUnlock() {
			if(unlockFunc) {
				var val = unlockFunc($('#passwd-txt').val(), forceUnlockFunc);
				if(!val.result) {
					$('#screenLockErrMsg').text(format(errorMessage, val.errorCode.errorMessage));
					$('#screenLockErrMsg').fadeIn();
					$('#passwd-txt').focus();
					return;					
				}
/*
				if(!unlockFunc($('#passwd-txt').val(), forceUnlockFunc)) {
					$('#screenLockErrMsg').fadeIn();
					$('#passwd-txt').focus();
					return;
				}
*/
			}
			defaultOptions.unlockFunc(elmId);			
		}
		
		// OKボタン押下でロック解除関数を実行
		$('#unlock-btn').click(function() { executeUnlock(); });

		// resize overlay		
		$(window).resize(function() {
			$('#' + elmId).css( {
				'width': $(window).width(),
				'height': $(window).height()
			});			
		});		
	};
	
	/* set lock state */
	function setLockState() {
		var sessionStorage = window.sessionStorage;
		if(sessionStorage) {
			sessionStorage.setItem('AVW_ScreenLock', true);
		}
	};
	
	/* unset lock state */
	function removeLockState() {
		var sessionStorage = window.sessionStorage;
		if(sessionStorage) {
			sessionStorage.removeItem('AVW_ScreenLock');
		}
	};
	
	/* check lock state or not */
	function isLocked() {
		var sessionStorage = window.sessionStorage;
		if(sessionStorage) {
			var lockState = sessionStorage.getItem('AVW_ScreenLock');
			if(lockState) {
				return true;
			}
		}
		return false;
	};
};
