var Logger = {
	log: function(text) {
		// console.log(new Date().getTime() + " : " + text);
	}
};


// This is used to delay the closing/reset of the menu by a certain amount of time
//
// To open a menu call Delayer.trigger. This will invoke the provided handler after 
// the provided timeout.
//
// Call Delayer.reset to stop an existing timeout.
//
// For example, when the mouse goes out of the menu, trigger a menu reset. But on
// mouseover the menu, reset the delayer. This will prevent the menu from getting
// reset until the mouse is moved away for long enough time.
var Delayer = function(delay, handler) {
	this.delay = delay;
	this.timeout = null;
	this.arguments = null;

	var self = this;
	this.handler = function() {
		if (self.timeout) {
			Logger.log("delayer handling...");
			handler(self.arguments);
			self.timeout = null;
			self.arguments = null;
		}
		else {
			Logger.log("delayer stopped");
		}
	};
};

Delayer.prototype.trigger = function(arguments) {
	if (this.timeout) {
		Logger.log("timeout is already set");
	}
	else {
		Logger.log("trigerring");
		var self = this;
		this.timeout = setTimeout(this.handler, this.delay);
		this.arguments = arguments;
	}
};

Delayer.prototype.reset = function() {
	if (this.timeout) {
		Logger.log("reset timeout");
		clearTimeout(this.timeout);
		this.timeout = null;
		this.arguments = null;
	}
	else {
		Logger.log("nothing to reset");
	}
};


