/**
 *	Standard function to manage time
 *
 *
 */


var time_manager;
var Time_manager;
Time_manager = new Class({
	source_offset: -60,
	source_uct_time: null,
	local_utc_time: null,
	local_offset: null,
	local_timezone_name: null,
	local_date: null,
	
	mils_in_day: 86400000,
	mils_in_houre: 3600000,
	mils_in_min: 60000,
	mils_in_s: 1000,
	
	initialize: function(){
		var _this = this;
		//	Get local offset
		_this.local_offset = _this.getData_local_offset();

		//	Get local time
		_this.local_date = new Date();
		_this.local_utc_time = _this.utc_time_convertor(_this.local_date, _this.local_offset);
		//	Get local timezone name
/* 		_this.local_timezone_name = _this.getData_local_timezone_name(d); */
	},
	
	
	/**
	 *	Remove time in s from a time
	 * @param:	(int)	base time in mil s
	 * @param:	(int)	number of secondes
	 * @return:	(int)	new time
	 *
	 */
	time_substracte: function(target_time, substract_time){
		return target_time-(substract_time*1000);
	},
	
	update_time: function(target_time){
		var _this = this;
		var remaining_time = new Array(2);
		remaining_time[0] = _this.time_substracte(target_time, 1);
		remaining_time[1] = _this.getData_remaining_time(remaining_time[0]);
		return remaining_time;
	},
	
	
	/**
	 *	Return remaining time from now to a future date
	 * @param:	(str)	a php formated date
	 * @return=	(time)	remaining time
	 *
	 */
	get_remaining_time: function(target_time){
		var _this = this;
		
		//	Convert time to uct
		utc_target_time = _this.utc_time_convertor(target_time, _this.source_offset);
		
		//	Get remaining time
		var remaining_time = new Array(2);
		remaining_time[0] = utc_target_time - _this.getData_utc_time();
		remaining_time[1] = _this.getData_remaining_time(remaining_time[0]);
		
		//	Return remaining time
		return remaining_time;
	},
	
	/**
	 *	Return time in day houre min s s/mil from param time int
	 * @param:	int
	 * @return:	(array)	time in day houre min s s/mil
	 */

	getData_remaining_time: function(remaining_time){
		var _this = this;
		var data = new Array(4);

		data[0] = Math.floor(remaining_time/(_this.mils_in_day));
		remaining_time = remaining_time-(data[0]*_this.mils_in_day);
	
		data[1] = Math.floor(remaining_time/(_this.mils_in_houre));
		remaining_time = remaining_time-(data[1]*_this.mils_in_houre);
	
		data[2] = Math.floor(remaining_time/(_this.mils_in_min));
		remaining_time = remaining_time-(data[2]*_this.mils_in_min);
	
		data[3] = Math.floor(remaining_time/(_this.mils_in_s));
		return data;
	},
	

	/**
	 *	Return Now in utc time format
	 * @param:	none
	 * @return:	(date)	Now time
	 */
	getData_utc_time: function(){
		d = new Date();
		utc = d.getTime() + (d.getTimezoneOffset() * 60000);
		return utc;
	},


	/**
	 *	Return the offset of a local date
	 * @param:	none
	 * @return:	(int)	time in min to add to convert utc to this time
	 */
	getData_local_offset: function(){
		var d = new Date;
		return d.getTimezoneOffset();
	},

	
	
	/**
	 *	Return timezone name
	 * @param:	none
	 * @return:	(str)	timezone name
	 */
	getData_local_timezone_name: function(d){
		var timezone_name = d.toString()
		//	Work only on a mac :(
		if(timezone_name.indexOf('(')){
			timezone_name.split('(');
			return timezone_name[1].substring(0, (timezone_name[1].length-1));
		}
		return 'CEST';
	},


	/**
	 *	Convert a time to utc with the given offset
	 * @param:	(date)	a non utc date time
	 * @param:	(int)	the offset of this time
	 * @return:	(date)	a utc date time
	 *
	 */	
	utc_time_convertor: function(target_time, target_offset){
		target_offset = $chk(target_offset) ? target_offset : 0;
		return target_time+(target_offset * 60000);
	},

	
	
	
	get_month: function(month){
		var month_list = new Array(12);
		month_list[0] = 'January';
		month_list[1] = 'February';
		month_list[2] = 'March';
		month_list[3] = 'April';
		month_list[4] = 'May';
		month_list[5] = 'June';
		month_list[6] = 'July';
		month_list[7] = 'August';
		month_list[8] = 'September';
		month_list[9] = 'October';
		month_list[10] = 'November';
		month_list[11] = 'December';
		
		return month_list[parseInt(month)];
	},
	
	get_smonth: function(month){
		var month_list = new Array(12);
		month_list[0] = 'Jan';
		month_list[1] = 'Feb';
		month_list[2] = 'Mar';
		month_list[3] = 'Apr';
		month_list[4] = 'May';
		month_list[5] = 'Jun';
		month_list[6] = 'Jul';
		month_list[7] = 'Aug';
		month_list[8] = 'Sep';
		month_list[9] = 'Oct';
		month_list[10] = 'Nov';
		month_list[11] = 'Dec';
		
		return month_list[parseInt(month)];
	},


	get_day: function(day){
		var day_list = new Array(7);
		day_list[0] = 'Sunday';
		day_list[1] = 'Monday';
		day_list[2] = 'Tuesday';
		day_list[3] = 'Wednesday';
		day_list[4] = 'Thursday';
		day_list[5] = 'Friday';
		day_list[6] = 'Saturday';
		
		return day_list[parseInt(day)];
	},

	get_sday: function(day){
		var day_list = new Array(7);
		day_list[0] = 'Sun';
		day_list[1] = 'Mon';
		day_list[2] = 'Tue';
		day_list[3] = 'Wed';
		day_list[4] = 'Thu';
		day_list[5] = 'Fri';
		day_list[6] = 'Sat';

		return day_list[parseInt(day)];
	},


	/**
	 *	Convert a php date string to a js date with local utc
	 * @param:	(string)	time
	 * @param:	(string)	date/time, the kind of output
	 * @return: (date)		converted date at local utc
	 */
	reformat_date: function(source_date,source_time){
	//	Mettre toutes les donnŽes dans Date() avec gmt+0200 (en fonction du defined offset)
		if (source_time==null)
		{
			var source = source_date.split(' ');
			source_date = source[0];
			source_time = source[1];
		}
		source_date = source_date.split('-'); 
		source_time = source_time.split(/[:-]/);
	
		d = new Date(source_date[0], source_date[1]-1, source_date[2]);
/*
		d.setFullYear(source_date[0]);
		d.setMonth(source_date[1]-1);
		d.setDate(source_date[2]);
*/
	
		d.setHours(source_time[0]);
		d.setMinutes(source_time[1]);
		d.setSeconds(source_time[2]);

		return d.getTime();
	},
	
	
	/**
	 *	Simple comparaison between 2 date
	 * @param: (date) date 1
	 * @param: (date) date 2
	 * @return: (array) difference between the 2 date in term of year, month, day, hour, min, s
	 */
	compare_date: function(date1, date2){
		var _this = this;
/*
		var debut = Date.parse(date1);
		var fin = Date.parse(date2);
		
		var remaining_time = debut - fin;
		
		var result = new Array(6);
		result[0] = 0;
		result[1] = 0;
		result[2] = Math.floor(remaining_time/_this.mils_in_day);
		remaining_time = remaining_time-(result[2]*_this.mils_in_day);
		result[3] = Math.floor(remaining_time/_this.mils_in_houre);
		remaining_time = remaining_time-(result[3]*_this.mils_in_houre);
		result[4] = Math.floor(remaining_time/_this.mils_in_min);
		remaining_time = remaining_time-(result[4]*_this.mils_in_min);
		result[5] = Math.floor(remaining_time/_this.mils_in_s);
*/
		
	

		var result = new Array(6);
		result[0] = date1.getFullYear()-date2.getFullYear();
		result[1] = date1.getMonth()-date2.getMonth();
		result[2] = date1.getDate()-date2.getDate();

		result[3] = date1.getHours()-date2.getHours();
		result[4] = date1.getMinutes()-date2.getMinutes();
		result[5] = date1.getSeconds()-date2.getSeconds();
		
		return result;
	},
	compare_date2: function(date1, date2){
		var _this = this;
		var debut = Date.parse(date1);
		var fin = Date.parse(date2);
		
		var remaining_time = debut - fin;
		
		var result = new Array(6);
		result[0] = 0;
		result[1] = 0;
		result[2] = Math.floor(remaining_time/_this.mils_in_day);
		remaining_time = remaining_time-(result[2]*_this.mils_in_day);
		result[3] = Math.floor(remaining_time/_this.mils_in_houre);
		remaining_time = remaining_time-(result[3]*_this.mils_in_houre);
		result[4] = Math.floor(remaining_time/_this.mils_in_min);
		remaining_time = remaining_time-(result[4]*_this.mils_in_min);
		result[5] = Math.floor(remaining_time/_this.mils_in_s);
		return result;
	},

	format_display: function(the_time, d){
		var _this = this;
/*
		console.log('format_display->the_time: ', the_time);
		console.log('format_display->date: ', d);
*/
		remaining = _this.compare_date(d, _this.local_date);
		remaining2 = _this.compare_date2(d, _this.local_date);
/* 		console.log('format_display->comparaison: ', remaining); */
/* 		console.log('format_display->comparaison2: ', remaining2); */
		var output='LIVE ';
		//	Days
		if(((remaining[2] === 1) && (remaining[1] === 0)) || ((remaining[2] < 0) && (remaining[1] === 1) && (remaining2[2] === 0))){
			output += 'tomorrow in ';
			if(the_time[0]==1) the_time[1]+=24;
		}

		else if(the_time[0]>0){
			var days = the_time[0]>1 ? ' days' : ' day';
			var days_time = the_time[0] <10 ? '0'+the_time[0] : the_time[0];
			output += 'in '+days_time+days+' ';
		}
		else
			output += 'today in ';
		
		//	Hours
		the_time[1] = the_time[1]<10 ? '0'+the_time[1] : the_time[1];
		the_time[2] = the_time[2]<10 ? '0'+the_time[2] : the_time[2];
		the_time[3] = the_time[3]<10 ? '0'+the_time[3] : the_time[3];

		output +=the_time[1]+':'+the_time[2]+':'+the_time[3];
		
		return output;
	},


	/**
	 *	Clear a delay for a count down
	 *
	 */
	clear_delayed: function(item){
		var _this = this;
		for(i=0; i<_this.delayed_id.length; i++){
			if(item == 'all'){
				$clear(_this.delayed[i]);
			}
			else if(_this.delayed_id[i] == item){
				$clear(_this.delayed[i]);
				break;
			}
		}
	},	


	end: function(){}

});



/**
 *	Convert our time to user time
 *
 *
 */
var convert2local;
var Convert2local;
var Convert2local = new Class({
	Extends: Time_manager,
	target_element: null,
	initialize: function(){
		this.parent();
		var _this = this;
		_this.cd_initialize();
	},


	/**
	 *	Initialize local content
	 *
	 */
	cd_initialize: function(){
		var _this = this;

		//	Collect all timer
		var elements = $(document.body).getElements('*[rel=convert2local]');
		elements.each(function(element) {
			//	Get displayed date
			var writed_date = element.get('id').toString().split('_');
			
			//	Convert into time
			var writed_time = _this.reformat_date(writed_date[1],writed_date[2]);
			
			//	Convert into local time
			var local_time = writed_time + (_this.source_offset * 60000) - (_this.local_offset * 60000);
						
			var local_date = new Date(local_time);
			element.set('html', _this.display_date(local_date));
		});
	},
	
	
	display_date: function(d){
		var _this = this;
		var day_name = _this.get_sday(d.getDay());
		var month_name = _this.get_smonth(d.getMonth());
		var day = d.getDate()<10 ? '0'+d.getDate() : d.getDate();
		var hour = d.getHours()<10 ? '0'+d.getHours() : d.getHours();
		var min = d.getMinutes()<10 ? '0'+d.getMinutes() : d.getMinutes();
		
		return day_name+' '+month_name+' '+day+' at '+hour+':'+min;
	},



	end: function(){}

});



/**
 *	Count down of the live box
 *
 *
 */
var live_cd;
var Live_cd;
var Live_cd= new Class({
	Extends: Time_manager,
	delayed: null,
	delayer_id: null,
	target_element: null,

	initialize: function(){
		this.parent();
		var _this = this;
		_this.cd_initialize();
	},


	/**
	 *	Initialize local content
	 *
	 */
	cd_initialize: function(){
		var _this = this;
		_this.delayed = new Array();
		_this.delayed_id = new Array();
		//	Collect all timer
		var elements = $(document.body).getElements('*[rel=remaining_time]');
		var i=0;
		var kikou = new Array();
		elements.each(function(element) {
			//	Initialize date
			var start_date = element.get('id').split('_');
			var parent = $('rtp_'+start_date.slice(1).join('_'));
			start_date = _this.reformat_date(start_date[1],start_date[2]);
			
			//	Put the star date to the parent element
			var d = new Date(start_date);
			parent.set('rel', d);

			//	Get remaining time
			var rt = _this.get_remaining_time(start_date);
			element.set('rel', rt[0]);
			
			//	Display live now or remaining time
			if(rt[0]<=0){
				element.innerHTML = 'Live now';
				element.setStyles({'color': 'red', 'text-transform': 'uppercase'});
			}
			else{
				element.innerHTML = _this.format_display(rt[1], d);
				_this.delayed_id[i] = element.get('id');

/* 					_this.display_date(element); */

				_this.delayed[i] = (function(){
					_this.display_date(element);
				}).periodical(1000);
				i++;
			}
		});
	},


	/**
	 *	Update the displayed date
	 *
	 */
	display_date: function(el){
		var _this = this;
		var the_time = _this.update_time(el.get('rel'));
		var id = el.get('id').toString().split('_');
		var d = new Date($('rtp_'+id.slice(1).join('_')).get('rel'));

		el.set('rel', the_time[0]);
		if(the_time[0]<=0){
			el.innerHTML = 'Live now';
			_this.clear_delayed(id);
		}
		else
			el.innerHTML = _this.format_display(the_time[1], d);
	},

	end: function(){}

});




/**
 *	Count down of the promo box
 *
 *
 */

var promo_box_cd;
var Promo_box_cd;
var Promo_box_cd = new Class({
	Extends: Time_manager,
	delayed: null,
	delayer_id: null,
	target_element: null,

	initialize: function(){
		this.parent();
		var _this = this;
		var i=0;

		_this.delayed = new Array();
		_this.delayed_id = new Array();
		//	Collect all timer
		var elements = $(document.body).getElements('*[class=pb_remaining_time]');

		elements.each(function(element) {
			//	Initialize date
			var start_date = element.get('rel').split('_');
			start_date = _this.reformat_date(start_date[1],start_date[2]);

			//	Set well formated date to the element
			var d = new Date(start_date);
			element.set('rel', d);

			//	Get remaining time
			var rt = _this.get_remaining_time(start_date);
			element.set('class', rt[0]);

			//	Display live now or remaining time
			if(rt[0]<=0){
				_this.build_live_now(element);
			}
			else{
				element.innerHTML = _this.format_display(rt[1], d);
				_this.delayed_id[i] = element.get('id');
				_this.delayed[i] = (function(){
					_this.display_date(element);
				}).periodical(1000);
				i++;
/*
				//	Add content
				element.innerHTML = _this.format_display(rt[1], d);
				_this.delayed[element.get('id')] = (function(){_this.display_date(element);}).periodical(1000, _this);
				

*/
			}
		});
	},
	
	
	/**
	 *	Display live now and build link
	 *
	 */
	build_live_now: function(element){
		var _this = this;
		
		//	Find parent element
		var el_id = element.get('id').toString().split('_');
		var target = $('count_down_'+el_id.slice(1).join('_'));

		//	Remove element
		element.dispose();
		
		//	Build new element
		var url_data = target.get('rel').toString().split('::');
		var link = new Element('a', { 'href': url_data[0], 'target': url_data[1], 'html': 'Live now', 'style': 'color: red; font-weight: 800;'});

		//	Insert new element
		link.inject(target);
	},
	

	/**
	 *	Update the displayed date
	 *
	 */
	display_date: function(el){
		var _this = this;
		var the_time = _this.update_time(el.get('class'));
		el.set('class', the_time[0]);
		if(the_time[0]<=0){
			_this.build_live_now(el);
			_this.clear_delayed(el.get('id'));
/* 			$clear(_this.delayed[element.get('id')]); */
		}
		else{
			d = new Date(el.get('rel'));
			el.innerHTML = _this.format_display(the_time[1], d);
		}
	},



	end: function(){}

});