var Cookie = {
	'set' : function(name,value,duration) {
		var expire = "",d;
		if(typeof duration == "object") {
			d = new Date();
			switch($H(duration).keys().first()) {
				case "months" : d.setTime(d.getTime()+(duration.months*4*7*24*60*60*1000)); break;
				case "weeks" : d.setTime(d.getTime()+(duration.weeks*7*24*60*60*1000)); break;
				case "days" : d.setTime(d.getTime()+(duration.days*24*60*60*1000)); break;
				case "hours" : d.setTime(d.getTime()+(duration.hours*60*60*1000)); break;
				case "minutes" : d.setTime(d.getTime()+(duration.minutes*60*1000));	break;
				case "seconds" : d.setTime(d.getTime()+(duration.seconds*1000)); break;
			}
			expire = "; expires="+d.toGMTString();
		} else {
			expire = "; expires="+duration;
		}
		return (document.cookie = escape(name) + "=" + escape(value || '') + expire + "; path=/");
	},
	'get' : function(name) {
		var c = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
		return (c ? unescape(c[2]) : null);
	},
	'erase': function(name) {
		var c = Cookie.get(name) || true;
		Cookie.set(name, '', -1);
		return c;
	},
	'accept': function() {
		if (typeof navigator.cookieEnabled == 'boolean')
			return navigator.cookieEnabled;
		Cookie.set('_test', '1');
		return (Cookie.erase('_test') === '1');
	}
}

var PersistentCallback = Class.create();
PersistentCallback.prototype = {
	'initialize' : function(uid,duration,callback,repeat) {
		this.uid = uid;
		this.callback = callback;
		this.repeat = !!repeat;
		this.duration = duration*1000;
		this.timeout = null;
		if(Cookie.accept) {
			if(Cookie.get(this.uid)=="done") return false;
			this.timestamp = new Date().getTime();
			this.deadline = (Cookie.get(this.uid)) ? Cookie.get(this.uid) : this.timestamp+(this.duration);
			var timeleft = Number(this.deadline) - Number(this.timestamp);
			if(!Cookie.get(this.uid)) {
				Cookie.set(this.uid,this.deadline,{days:1});
				this.timeout = setTimeout(this.handleCallback.bind(this),(this.duration));
			} else if(this.deadline < this.timestamp) this.handleCallback();
			else this.timeout = setTimeout(this.handleCallback.bind(this),timeleft);
		} else {
			this.timeout = setTimeout(this.handleCallback.bind(this),(this.duration));
			return false;
		}
	},
	'handleCallback' : function() {
		this.callback();
		if(Cookie.accept()) {
			Cookie.erase(this.uid);
			if(!this.repeat) Cookie.set(this.uid,"done",{days:1});
			else {
				this.timestamp = new Date().getTime();
				this.deadline = (Cookie.get(this.uid)) ? Cookie.get(this.uid) : this.timestamp+(this.duration);
				Cookie.set(this.uid,this.deadline,{days:1});
				this.timeout = setTimeout(this.handleCallback.bind(this),(this.duration));
			}
		} else {
			this.timeout = setTimeout(this.handleCallback.bind(this),(this.duration));
		}
	},
	"stop" : function(duration) {
		var duration = (typeof howLong=="object") ? duration : {days:1};
		if(Cookie.accept())
			Cookie.set(this.uid,"done",duration);
		clearTimeout(this.timeout);
	}
}

