/**
 *  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);
 * }
 * 
 */
 
//グローバルの名前空間用のオブジェクトを用意する
var SCREENLOCK = {};

SCREENLOCK.screenLock = function(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;
	var elmId;
	var html;
	var color;
	var opacity;
	var background;
	var lockspeed;
	var unlockEvent;
	var unlockFunc;
	var 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() {

		// check time out
		if (timeout < 0) {  // Remove unlock when timeout < 0 (this case for: after unlock, values from service options: web_screen_lock=N)
			
			// clear timeout
			if (idleTimerId) {
				clearTimeout(idleTimerId);
				idleTimerId = null;
			}
			
			bTimeout = false;
			
			// clear lock state
			removeLockState();
			
			return;
		}
		
		// アイドルタイマーのタイムアウト時間(デフォルト/オプション指定時間)
		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 + I18N.i18nText('sysInfoScrLock01') + '</p>' + 
				   '<div id="pw" style="display:none;">' +
				   '<input id="passwd-txt" placeholder="'+ I18N.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(AVWEB.format(errorMessage, val.errorCode.errorMessage));
					$('#screenLockErrMsg').fadeIn();
					$('#passwd-txt').focus();
					return;
				}
				else {
					// Set new timeout value
					timeout = val.newTimeout;
				}
				/*
				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;
	};
};