/*
 * Copyright (c) 	2010 Kevin Lint (http://www.kevinlint.com)
 * Title: 			SessionChecker
 * Description: 	Checks to see if user is idle, if so show's warning message and logs out if user doesn't respond. Works across multiple windows/tabs
 * Licensing:		Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * 					and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Version 			1.0
 * Demo: 			http://www.kevinlint.com/idleChecker
 * Updated On:		2010-06-02
 *
 */
 
// JQUERY PLUGIN
jQuery.IdleChecker = function(options) {
	// SETTINGS
     IdleChecker.settings = jQuery.extend({
		 Cookie:"IdleCheckerTimeOut",
		 CookieExpires:1,
		 CookiePath:"/",
		 CookieDomain:"www.fullcircle.net",
		 CookieSecure:false,
		 TimeOutAfter: 1200000, // in milliseconds
		 CountDownFor: 30000, // in milliseconds
		 CheckInterval: 1000, // in milliseconds
		 logoutUrl: "", // logout page
		 logoutUrlParams: "", // url parameters to append to logout page
		 keepAliveUrl: "", // url to ajax request to keep server session alive
		 windowTitle:document.title // Original title of current window 
	  }, options);
	 IdleChecker.config();
}; // jQuery.IdleChecker

// PARAMS
var IdleCheckerInterval;
var IdleCheckerCountdown;
var IdleCountdownClock;

// MAIN OBJECT
var IdleChecker = {
	// Parameters specified in Plugin
	settings:{},
	// Setting up Events
	config:function(){
		$(document).ready(function(){
			IdleChecker.startNewSession();
		});
		$(document).mousedown(function(){
			IdleChecker.stopLogoutCountdown();
			IdleChecker.checkCookie();
		});
		$(window).blur(function(){
			//IdleChecker.stopPoll();
			//IdleChecker.stopLogoutCountdown();
			$(window).bind("focus",function(event){
				$(window).unbind("focus");
				IdleChecker.stopLogoutCountdown();
				IdleChecker.checkCookie();
			});
		});
	}, // config
	// Does cookie exist
	checkCookie:function(){
		// Does Cookie Exist
		var cookie = IdleChecker.getCookie();
		if(cookie == 0){
			// If yes, automatically logout
			IdleChecker.autoLogOff();
		} else {
			// If no, check if session has expired
			if(IdleChecker.hasExpired() == true){
				IdleChecker.autoLogOff();	
			} else {
				IdleChecker.startNewSession();
			}
		}
	}, // checkCookie
	// Return milliseconds from Jan 1st, 1970
	getCurrentTimeStamp:function(){
		var d = new Date();
		var timestamp = d.getTime();
		return timestamp;
	}, // getTimeStamp
	autoLogOff:function(){
		IdleChecker.setCookie(0);
		IdleChecker.stopPoll();
		IdleChecker.stopLogoutCountdown();
		window.location.href=IdleChecker.settings.logoutUrl + IdleChecker.settings.logoutUrlParams;
		//console.log("auto log out");
	}, // autoLogOff
	checkIfIdle:function(){
		// Get Milliseconds idle
		var IdleMilli = IdleChecker.getCurrentTimeStamp() - $.cookie(IdleChecker.settings.Cookie);
			if(IdleMilli >= IdleChecker.settings.TimeOutAfter){
				return true;
			} else {
				//console.log("idle for: " + Math.round(IdleMilli/1000));
				return false;	
			}
	}, // checkIfIdle
	hasExpired:function(){
		var IdleMilli = IdleChecker.getCurrentTimeStamp() - $.cookie(IdleChecker.settings.Cookie);
		var TotalLogoutMilli = IdleChecker.settings.TimeOutAfter + IdleChecker.settings.CountDownFor + 2000;
		if(IdleMilli > TotalLogoutMilli){
			return true;
		} else {
			return false;	
		}
	},
	setCookie:function(cookieval){
		$.cookie(IdleChecker.settings.Cookie,cookieval);
		//console.log("setCookie");
	}, // setCookie
	getCookie:function(){
		return $.cookie(IdleChecker.settings.Cookie);
	}, // getCookie
	deleteCookie:function(){
		$.cookie(IdleChecker.settings.Cookie, null);
	}, // delete Cookie
	startNewSession:function(){
		IdleChecker.resetWindowTitle();
		IdleChecker.stopPoll(); // Stop and restart pole
		IdleChecker.stopLogoutCountdown();
		IdleChecker.deleteCookie();
		IdleChecker.setCookie(IdleChecker.getCurrentTimeStamp());
		IdleChecker.startPoll();
		IdleChecker.hideLogoutWindow();
		IdleChecker.keepAlive(IdleChecker.settings.keepAliveUrl);
	},
	checkStatus:function(){
		if(IdleChecker.checkIfIdle() == true){
			IdleChecker.startLogoutCountdown();	
		}
		// debugging
		$("#checktimeoutstatus").val(IdleChecker.getCurrentTimeStamp() - $.cookie(IdleChecker.settings.Cookie));
	}, // checkStatus
	startPoll:function(){
		IdleChecker.stopPoll(); // Stop and restart pole
		IdleCheckerInterval = setInterval("IdleChecker.checkStatus()",IdleChecker.settings.CheckInterval);
		//console.log("startPoll");
	}, // startPoll
	stopPoll:function(){
		clearInterval(IdleCheckerInterval); // clear countdown timer
		//console.log("stopPolling");
	}, // stop pole
	startLogoutCountdown:function(){
		IdleChecker.stopPoll();
		IdleChecker.stopLogoutCountdown();
		IdleCountdownClock = IdleChecker.settings.CountDownFor;
		IdleCheckerCountdown = setInterval("IdleChecker.countdown()",1000); // count down second by second
		IdleChecker.showLogutWindow();
	}, // startLogoutCountdown
	stopLogoutCountdown:function(){
		clearInterval(IdleCheckerCountdown); // clear countdown timer
		//console.log("stopLogoutCountdown");
	},
	countdown:function(){
		$("#IdleCheckerSeconds").html(IdleCountdownClock/1000);
		if(IdleChecker.getCurrentTimeStamp() - $.cookie(IdleChecker.settings.Cookie) < IdleChecker.settings.TimeOutAfter){
			IdleChecker.resetWindowTitle();
		} else {
			document.title = IdleCountdownClock/1000 + " seconds to timeout";	
		}
		if(IdleCountdownClock < 0){
			IdleChecker.resetWindowTitle();
			if(IdleChecker.hasExpired()){
				IdleChecker.autoLogOff();
			} else {
				IdleChecker.hideLogoutWindow();
				IdleChecker.stopLogoutCountdown();
				IdleChecker.startPoll();	
			}
		} else {
			IdleCountdownClock = IdleCountdownClock - 1000;
		}
		//console.log("countdown " + Math.round(IdleCountdownClock/1000));
	},
	resetWindowTitle:function(){
		document.title = IdleChecker.settings.windowTitle;
	},
	keepAlive:function(url){
		if(url == null){
			url = IdleChecker.settings.keepAliveUrl;	
		}
		$.get(url); // Reset Server side App Activity
	},
	showLogutWindow:function(){
		//console.log("showLogout");
		$(document).unbind("mousedown");
		var defaultseconds = IdleChecker.settings.CountDownFor/1000;
		$("body").append('<div class="logoutmsg"><h1>Warning</h1><p>Due to inactivity your session will time out in <span id="IdleCheckerSeconds">'+defaultseconds+'</span> seconds. <br/><a id="continueWorking"><img src="images/jquery.IdleChecker.png" border=0></a></p></div>');
		$("body").append('<div class="logoutbg"></div>');
		$(".logoutbg").css("height",$(document).height()+"px");
		var scrollpos = $(window).scrollTop();
		$(".logoutmsg").css("top",(scrollpos+200)+"px");
		//$(".logoutmsg").css("top",(400)+"px");
		$(".logoutbg").fadeIn("slow");
		$("#continueWorking").click(function(){
			IdleChecker.startNewSession();
			IdleChecker.hideLogoutWindow();
			$(document).bind("mousedown",function(event){
				IdleChecker.stopLogoutCountdown();
				IdleChecker.checkCookie();					  
			});
		});	
	}, // showLogutWindow
	hideLogoutWindow:function(){
		$(".logoutmsg").remove();
		$(".logoutbg").remove();	
	} //hideLogoutWindow
} // IdleChecker

//$.IdleChecker();

