﻿/// <reference path="../Scripts/jquery-latest.min-vsdoc.js" />
var AsyncStatus = {
	displaySeconds: 4,
	el: null,
	tid: null, // timeout id
	savedMsg: null,

	init: function () {
		AsyncStatus.el = $('<div id="status"></div>').appendTo("body");
	},

	// note: assumes only one load operation at a time
	beginLoad: function (html) {
		AsyncStatus.el.html(html);
		AsyncStatus.el.attr("class", "load");
		AsyncStatus.position();
		AsyncStatus.el.show();
	},

	endLoad: function () {
		// if there's still a current message, show that for it's
		// remaining time
		if(AsyncStatus.savedMsg != null) {
			var remain = (AsyncStatus.displaySeconds * 1000) - (Date.now() - AsyncStatus.savedMsg.showDate);
			if(remain > 0) {
				AsyncStatus.el.html(AsyncStatus.savedMsg.html);
				AsyncStatus.el.attr("class", AsyncStatus.savedMsg.cssClass);

				AsyncStatus.tid = setTimeout(AsyncStatus.hide, remain);
			} else {
				AsyncStatus.savedMsg = null;
			}
		} else {
			AsyncStatus.hide();
		}
	},

	info: function (html) {
		AsyncStatus.message(html, "info");
	},

	error: function (html) {
		AsyncStatus.message(html, "error");
	},

	message: function (html, cssClass) {
		if(AsyncStatus.tid != null) {
			clearTimeout(AsyncStatus.tid);
		}

		AsyncStatus.el.html(html);
		AsyncStatus.el.attr("class", cssClass);
		AsyncStatus.position();

		AsyncStatus.el.stop();
		AsyncStatus.el.show();

		AsyncStatus.savedMsg = {
			html: html,
			showDate: Date.now(),
			cssClass: cssClass
		};

		AsyncStatus.tid = setTimeout(AsyncStatus.hide, AsyncStatus.displaySeconds * 1000);
	},

	hide: function () {
		AsyncStatus.el.fadeOut("normal");
		if(AsyncStatus.tid != null) {
			clearTimeout(AsyncStatus.tid);
			AsyncStatus.tid = null;
		}

		AsyncStatus.savedMsg = null;
	},

	position: function () {
		var width = AsyncStatus.el.width();
		var height = AsyncStatus.el.height();

		var win = $(window);

		AsyncStatus.el.css("top", (win.height() / 2) - (height / 2));
		AsyncStatus.el.css("left", (win.width() / 2) - (width / 2));
	}
}

$(document).ready(AsyncStatus.init);

