/** * 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() { // 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 + i18nText('sysInfoScrLock01') + '</p>' + '<div id="pw" style="display:none;">' + '<input id="passwd-txt" placeholder="'+i18nText('sysLockScrPwdInput')+'" type="password" value="" /> ' + '<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; } 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; }; };