var Heartbeat = new Class({
	options:{
		lifespan:(3 * 60 * 60 * 1000), // miliseconds until you get a warning. this is the real value = 3 hours
		heartrate: (5 * 60 * 1000), // milliseconds between palpitations. this is the real value = 5 minutes
		sessiontimeout: 20 // session timeout length - this is in minutes! the real value = 20
		
		//heartrate: (5 * 1000), // test value - 15 seconds.
		//lifespan: (8.66 * 1000), // test value - 16 seconds.
		//sessiontimeout: 0.1  // test value - 6 seconds.
	},
	initialize:function(options){
	
		var self = this;
		this.setOptions(options);

		this.heartstoppedtime = 0;
		this.sessionisalive = true;
		
		this.startLifespan();
		this.startHeartbeat();

		/* listen for "work" being done on the page. if the user is working, reset their lifespan. */		
		var body = $$('body')[0];
		body.addEvent('mouseup',function(){
			self.work();
		});
		body.addEvent('focus',function(){
			self.work();
		});
		window.addEvent('scroll',function(){
			self.work();
		});
	},
	work:function(){
		if(this.sessionisalive){ // if the session is dead, there's no bringing it back
//		console.log('work');
			// there is no "reset" timeout. So, we just kill the old one and start a new one.
			this.endLifespan();
			this.startLifespan();
			//this.endHeartbeat();
			//this.startHeartbeat();
		}
	},
	palpitate:function(){
	//		console.log('palpitation');
	
		var palpitation = new Request({
			'url':'/nifty_api_client/',
			'data':{
				'action':'session.refresh'
			},
			'method':'get'
		}).send();
	},
	startLifespan:function(){
		if(this.sessionisalive){ // if the session is dead, we don't want any nag screens
	//		console.log('starting lifespan');
			this.lifespan = window.setTimeout(this.lastRites.bind(this),this.options.lifespan);
		}
	},
	endLifespan:function(){
//		console.log('ending lifespan');
		window.clearTimeout(this.lifespan);
	},
	startHeartbeat:function(){
		if(this.sessionisalive){ // if the session is dead, there's no bringing it back
	//		console.log('starting heartbeat');
			this.heartbeat = window.setInterval(this.palpitate,this.options.heartrate);
		}
	},
	endHeartbeat:function(){
//		console.log('ending heartbeat');
		window.clearInterval(this.heartbeat);
	},
	startSessionCountdown:function(){
		if(this.sessionisalive){ // if the session is dead, there's no bringing it back
	//		console.log('startSessionCountdown');
			this.sessioncountdown = window.setInterval(this.sessionCountdown.bind(this),500);
			var dddd = new Date();
			this.heartstoppedtime = dddd.getTime();
		}
	},
	endSessionCountdown:function(){
//		console.log('endSessionCountdown');
		window.clearInterval(this.sessioncountdown);
		this.heartstoppedtime = null;
	},
	sessionCountdown:function(){
		var self = this;
//		console.log('sessionCountdown');
		if($('lastritescountdown')){
			var h = self.heartstoppedtime; // in milliseconds
			// how many seconds have elapsed
			var dddd = new Date();
			var nowtime = dddd.getTime(); // also in milliseconds
			
			var flatline = nowtime - h;
			
			var secondstodie = Math.floor(((self.options.sessiontimeout * 60 * 1000) - flatline) / 1000);
			var minutes = Math.floor(secondstodie/60);
			var seconds = secondstodie - (minutes * 60);
			$('lastritescountdown').set('html', window.translations['media-js-heartbeat-your-session-will-expire-in-colon'] + minutes + window.translations['media-js-heartbeat-minsec-separator'] + zeroPad(seconds,2));
		}
		if(secondstodie <= 0){
//			alert('your session has timed out.');
			this.sessionisalive = false;
			this.endSessionCountdown();
			this.endLifespan();
			this.endHeartbeat();
			this.lastritesmodal.setcontents(window.translations['media-js-heartbeat-your-session-expired']);
			this.lastritesmodal.settitle(window.translations['media-js-heartbeat-session-expired']);
//			console.log('this.sessionisalive ' + this.sessionisalive);
		}
	},
	lastRites:function(){
//		console.log('last rites');
		var self = this;

		// so, three hours have elapsed. Let's check now if the user has a persistent session

		// put this page on DNR
		self.endHeartbeat();
		self.endLifespan();
		self.startSessionCountdown();

		alert('Your session is about to expire. Please save your work immediately, or any changes made on this page will be lost.');
		
		// open a modalbox with the last rites warning
		/*
		self.lastritesmodal = new Modalbox({
			'title':window.translations['media-js-heartbeat-your-session-will-expire'],
			'ismodal':true,
			'closetext':window.translations['media-js-Close'],
			'shadowcolor':'#ff0000',
			'position':{
				'screen':['center','middle']
			}
		});
		var modalcontent = self.lastritesmodal.bodypart;
		
		var ritesdiv = new Element('div',{}).inject(modalcontent,'top');
		
		var warning = new Element('p',{
				'styles':{
					'text-align':'center'
				}
			})
			.set('html', ''+ window.translations['media-js-heartbeat-page-idle-warning-part1'] + '<b>' +  Math.round(this.options.lifespan / (60*60*1000) * 100) / 100 + ' '+ window.translations['media-js-heartbeat-hours'] +'</b>. '+	window.translations['media-js-heartbeat-session-will-expire-warning'])
			.inject(ritesdiv,'bottom');

		self.countdowndiv = new Element('div',{
			'id':'lastritescountdown',
			'styles':{
				'text-align':'center'
			}
		}).inject(ritesdiv,'bottom').set('html','&nbsp;');

		var checkbuttonwrap = new Element('div',{
			'styles':{
				'text-align':'center',
				'margin-top':'20px'
			}
		}).inject(ritesdiv,'bottom');

		var checkbutton = new Element('input',{
			'type':'button',
			'value':window.translations['media-js-heartbeat-keep-my-session-alive'],
			'styles':{
				'margin-left':'auto',
				'margin-right':'auto'
			}
		}).addEvent('click',function(){
			self.lastritesmodal.close();
		}).inject(checkbuttonwrap,'bottom');

		self.lastritesmodal.addEvent('close',function(){
			// when you close the modal, it'll be the same as if you clicked the button.
//			console.log('self.sessionisalive ' + self.sessionisalive);
			self.endHeartbeat();
			self.endLifespan();
			if(self.sessionisalive){
				self.startHeartbeat();
				self.startLifespan();
				self.endSessionCountdown();
			}
		});

		self.lastritesmodal.adjustposition();
		*/		
	}
});
Heartbeat.implement(new Events, new Options);


window.addEvent('domready',function(){
	var cardio = new Heartbeat();
});


function zeroPad(num,count){
	var numZeropad = num + '';
	while(numZeropad.length < count) {
		numZeropad = "0" + numZeropad;
	}
	return numZeropad;
}
