var LW       = LW || {};
LW.event = {
	_callbacks: {},
	_fired: {},
	_repeated: {},
	_rateLimited: {},
	_delayed: {},
	watch: function (eventName, func) {
		LW.event._callbacks[eventName] = LW.event._callbacks[eventName] || [];
		LW.event._callbacks[eventName].push(func);
	},
	fire: function (eventName, params) {
		var key = (params) ? eventName + ':' + params : eventName;
		if (LW.event._rateLimited[key]) {
			return;
		}

		/* rate-limit to prevent excessive calls to the same event */
		LW.event._rateLimited[key] = setTimeout(function () {
			LW.event._rateLimited[key] = false;
		}, 100);

		LW.event._fired[key] = true;

		var list = LW.event._callbacks[eventName];
		if (list) {
			var l = list.length;
			for (var i=0; i<l; i++) {
				list[i](params);
			}
		}
	},
	fireWhenReady: function (eventName, params) {
		if (LW.event.hasFired('user.loggedIn')) {
			LW.event.fire(eventName, params);
		}
		else {
			var key = (params) ? eventName + ':' + params : eventName;
			if (! LW.event._delayed[key]) {
				LW.event._delayed[key] = true;
				LW.event.watch('user.loggedIn', function () {
					LW.event.fire(eventName, params);
				});
			}
		}
	},
	hasFired: function (eventName, params) {
		var key = (params) ? eventName + ':' + params : eventName;
		return LW.event._fired[key];
	},
	fireRepeated: function (eventName, params, interval) {
		var key = (params) ? eventName + ':' + params : eventName;
		if (!LW.event._repeated[key]) {
			LW.event.fire(eventName, params);
			LW.event.repeat(eventName, params, interval);
		}
	},
	repeat: function (eventName, params, interval) {
		var key = (params) ? eventName + ':' + params : eventName;

		if (interval == null) {
			alert("LW.event.repeat() called without an interval");
			return;
		}

		if (LW.event._repeated[key]) {
			clearTimeout(LW.event._repeated[key]);
		}
		LW.event._repeated[key] = setTimeout(function () {
			LW.event._repeated[key] = null;
			LW.event.fire(eventName, params);
			LW.event.repeat(eventName, params, interval);
		}, interval * 1000);
	},
	stopRepeating: function (eventName) {
		if (LW.event._repeated[eventName]) {
			clearTimeout(LW.event._repeated[eventName]);
			LW.event._repeated[eventName] = null;
		}
	}
};

