﻿SessionTimeout = {

	initialised: false,
	authenticateUrl: null,
	timeoutInterval: null,
	lastUserId: null,
	timeoutIdentifier: null,
	isActive: false,

	lastActiveCookieName: "stLastActive",
	lastActiveDate: new Date(),

	// Form
	loginForm: null,
	loginFormPollIdentifier: null,

	// Form elements
	processingMsg: null,
	errorMsg: null,
	usernameField: null,
	passwordField: null,
	diffUserLoginLink: null,

	init: function(params) {
		if (typeof $.cookie == "undefined") throw "SessionTimeout requires cookies class";
		if (SessionTimeout.initialised) throw "SessionTimeout has already been initialised";

		// Set properties
		SessionTimeout.initialised = true;
		SessionTimeout.authenticateUrl = params.authenticateUrl;
		SessionTimeout.timeoutInterval = params.timeoutInterval;
		SessionTimeout.lastUserId = params.lastUserId;
		SessionTimeout.lastActiveCookieName += params.lastUserId;
		SessionTimeout.diffUserLoginLink = params.diffUserLoginLink;

		// Init form
		SessionTimeout.initForm(params);

		// Set events
		$.cookie(SessionTimeout.lastActiveCookieName, SessionTimeout.lastActiveDate.toGMTString(), { path: "/" });
		SessionTimeout.timeoutIdentifier = window.setTimeout(SessionTimeout.timeout, 1000 * SessionTimeout.timeoutInterval * 60);
	},

	initForm: function(params) {
		// Login form
		SessionTimeout.loginForm = $("#" + params.formId);
		if (SessionTimeout.loginForm.length == 0) throw "Form with id: " + params.formId + " could not be found";
		SessionTimeout.loginForm.hide();

		// Processing message
		SessionTimeout.processingMsg = $("#" + params.processingMsgId);
		if (SessionTimeout.processingMsg.length == 0) throw "Processing message element with id: " + params.processingMsgId + " could not be found";

		// Error message
		SessionTimeout.errorMsg = $("#" + params.errorMsgId);
		if (SessionTimeout.errorMsg.length == 0) throw "Error message element with id: " + params.errorMsgId + " could not be found";

		// Username field
		SessionTimeout.usernameField = $("#" + params.usernameFieldId);
		if (SessionTimeout.usernameField.length == 0) throw "Username field with id: " + params.usernameFieldId + " could not be found";

		// Password field
		SessionTimeout.passwordField = $("#" + params.passwordFieldId);
		if (SessionTimeout.passwordField.length == 0) throw "Password field with id: " + params.passwordFieldId + " could not be found";
	},

	timeout: function() {
		// Check if other windows have been opened and renewed the session
		if (SessionTimeout.checkActiveDate()) return;
		SessionTimeout.showForm();
	},

	getActiveDate: function() {
		var lastActive = $.cookie(SessionTimeout.lastActiveCookieName);
		if (lastActive != null) {
			var active = new Date(lastActive);
			//alert(SessionTimeout.lastActiveDate + " : " + active);
			if (SessionTimeout.lastActiveDate < active) {
				return active;
			}
		}
		return null;
	},

	showForm: function() {
		if (SessionTimeout.isLoginFormActive()) SessionTimeout.cleanup();

		SessionTimeout.isActive = true;
		SessionTimeout.processingMsg.hide();
		SessionTimeout.errorMsg.hide();

		SessionTimeout.loginForm.dialog({
			autoOpen: false,
			modal: true,
			bgiframe: true,
			resizable: false,
			dialogClass: 'sessionTimeoutDialog',
			title: "Session Timeout",
			beforeclose: function() { return false; },
			buttons: {
				"Log in": SessionTimeout.login_click
			}
		}).dialog("open");

		SessionTimeout.usernameField.val("");
		SessionTimeout.passwordField.val("");
		SessionTimeout.usernameField.focus();

		SessionTimeout.checkActiveDate(true);
	},

	checkActiveDate: function(poll) {
		var active = SessionTimeout.getActiveDate();
		if (active != null) {
			SessionTimeout.cleanup(active);
			return true;

		} else if (poll) {
			SessionTimeout.loginFormPollIdentifier = window.setTimeout(function() { SessionTimeout.checkActiveDate(true); }, 1000);
		}
		return false;
	},

	login_click: function(e) {
		SessionTimeout.processingMsg.show();
		SessionTimeout.errorMsg.hide();

		var username = SessionTimeout.usernameField.val();
		var password = SessionTimeout.passwordField.val();

		var args = {
			cmd: "login",
			username: username,
			password: password,
			lastUserId: SessionTimeout.lastUserId
		}

		$.ajax({
			url: SessionTimeout.authenticateUrl,
			type: "POST",
			data: (args),
			dataType: "text",
			success: SessionTimeout.onAuthResponse,
			error: SessionTimeout.onError
		});
	},

	onAuthResponse: function(data) {
		var valid = data == "True";

		if (!valid) {
			SessionTimeout.processingMsg.hide();

			var message = "Invalid Login";
			if (data == "DiffUser") {
				message = "You are attempting to login with a user account that does not match the previously logged in user." +
					" Please use <a href=\"" + SessionTimeout.diffUserLoginLink + "\">this link</a> to login with your account.";
			}

			SessionTimeout.errorMsg.html(message);
			SessionTimeout.errorMsg.show();
			SessionTimeout.loginForm.dialog("refresh");
			return;
		}

		$.cookie(SessionTimeout.lastActiveCookieName, new Date().toGMTString(), { path: "/" });
		SessionTimeout.cleanup();
	},

	onError: function(XMLHttpRequest, textStatus, errorThrown) {
		SessionTimeout.processingMsg.hide();
		SessionTimeout.errorMsg.hide();
	
		$("<div>").html("There was a problem sending the authentication request.\nIf this continues please contact CareerHub support.").dialog({
			modal: true,
			bgiframe: true,
			resizable: false,
			title: "Alert",
			buttons: {
				"Close": function() { $(this).dialog("close"); }
			}
		});
	},

	cleanup: function(lastActive) {
		window.clearTimeout(SessionTimeout.timeoutIdentifier);
		window.clearTimeout(SessionTimeout.loginFormPollIdentifier);

		// Hide login form for next display
		SessionTimeout.loginForm.dialog("option", "beforeclose", function() { return true; });
		SessionTimeout.loginForm.dialog("close");
		SessionTimeout.isActive = false;

		// Reset timeout
		SessionTimeout.lastActiveDate = new Date();
		var timeout = SessionTimeout.timeoutInterval * 1000 * 60;
		if (lastActive != null) timeout = timeout - (SessionTimeout.lastActiveDate.getTime() - lastActive.getTime());

		SessionTimeout.timeoutIdentifier = window.setTimeout(SessionTimeout.timeout, timeout);
	},

	isLoginFormActive: function() {
		return SessionTimeout.isActive;
	}
}