/*
	I18N:check:1 
*/
/**
 * iso format: YYYY-MM-DD HH:MM:SS[±II:NN]
 */
function utcIsoToDate(utcIso) {
	var year 	= utcIso.substring(0, 4);
	var month 	= utcIso.substring(5, 7);
	var date 	= utcIso.substring(8, 10);
	var hours 	= utcIso.substring(11, 13);
	var minutes = utcIso.substring(14, 16);
	var seconds = utcIso.substring(17, 19);
	return new Date(Date.UTC(year, month - 1, date, hours, minutes, seconds)); 
}

function isoToDate(utcIso) {
	var year 	= utcIso.substring(0, 4);
	var month 	= utcIso.substring(5, 7);
	var date 	= utcIso.substring(8, 10);
	var hours 	= utcIso.substring(11, 13);
	var minutes = utcIso.substring(14, 16);
	var seconds = utcIso.substring(17, 19);
	return new Date(year, month - 1, date, hours, minutes, seconds); 
}

// YYYYMMDDHHMMSS
function timestampToDate(ts) {
	var year 	= ts.substring( 0,  4);
	var month 	= ts.substring( 4,  6);
	var date 	= ts.substring( 6,  8);
	var hours 	= ts.substring( 8, 10);
	var minutes = ts.substring(10, 12);
	var seconds = ts.substring(12, 14);
	return new Date(year, month - 1, date, hours, minutes, seconds); 
}

/**
 * time stamp format: variable
 * if neither showDate nor showTime are set a timestamp is returned: YYYYMMDDHHMMSS
 * format is currently one of the following:
 
	f1				:	Friday, July 26, 2003, 2:30 PM
	f2				:	Fri, 7/26/2003, 2:30 PM
	f3				:	7/26/2003 2:30 PM
	format_ja_JP	:	2003年12月4日(木) 午前 6時18分
	f1_it_IT		:	Venerdì,26/07/2003, 2.30
	f2_it_IT		: 	Ven, 26/07/2003, 2.30
	f3_it_IT		: 	26/07/2003, 2.30
	
	f1_de_DE			: 	Freitag, 26. Juli 2007, 14:30
	f2_de_DE			: 	Fr, 26.7.2007, 14:30
	f3_de_DE			:	26.7.2007 14:30
	f4_de_DE			: 	26.07.2007 14:30
*/
 
function dateToLocaleTimeStamp(d,showDate,showTime,format) {
	if (!format && typeof(date$globalFormat) == "string") {
		format = date$globalFormat;
	}
	
	var r_year    = d.getFullYear();
	var r_month   = d.getMonth();
	var r_date	  = d.getDate();
	var r_day     = d.getDay();
	var r_hours   = d.getHours();
	var r_minutes = d.getMinutes();
	var r_seconds = d.getSeconds();
	
	var year    = "" + r_year;
	var month   = (r_month   <  9 ? "0" : "") + (r_month + 1);
	var date    = (r_date    < 10 ? "0" : "") + r_date;
	var hours   = (r_hours   < 10 ? "0" : "") + r_hours;
	var minutes = (r_minutes < 10 ? "0" : "") + r_minutes;
	var seconds = (r_seconds < 10 ? "0" : "") + r_seconds;

	var usHours = (r_hours >  12 ? r_hours-12 : (r_hours == 0 ? 12 : r_hours));
	var sNoon	= (r_hours >= 12 ? "PM" : "AM");

	var sDate   = year + month + date;
	var sTime	= hours + minutes + seconds;
	var sConcat	= "";

	if (format == "f1" || format == "f1_en_US" || format == "f1_en_GB") {
		// Friday, July 26, 2003, 2:30 PM
		sDate   = date$configuration.en.dayNames[r_day] + ", " + date$configuration.en.monthNames[r_month] + " " + r_date + ", " + r_year;
		sTime   = usHours + ":" + minutes + " " + sNoon;
		sConcat = ", ";
	} else if (format == "f2" || format == "f2_en_US" || format == "f2_en_GB") {
		// Fri, 7/26/2003, 2:30 PM
		sDate   = date$configuration.en.dayNames[r_day].substring(0, 3) + ", " + (r_month+1) + "/" + r_date + "/" + r_year;
		sTime   = usHours + ":" + minutes + " " + sNoon;
		sConcat = ", ";
	} else if (format == "f3" || format == "f3_en_US" || format == "f3_en_GB") {
		// 7/26/2003 2:30 PM
		sDate   = (r_month+1) + "/" + r_date + "/" + r_year;
		sTime   = usHours + ":" + minutes + " " + sNoon;
		sConcat = " ";
	} else if (format == "f1_it_IT") {
		// Venerdì, 26/07/2003, 2.30
		sDate   = date$configuration.it.dayNames[r_day] + ", " + date + "/" + month + "/" + year;
		sTime   = r_hours + "." + minutes;
		sConcat = ", ";
	} else if (format == "f2_it_IT") {
		// Ven, 26/07/2003, 2.30
		sDate   = date$configuration.it.dayNames[r_day].substring(0, 3) + ", " + date + "/" + month + "/" + year;
		sTime   = r_hours + "." + minutes;
		sConcat = ", ";
	} else if (format == "f3_it_IT") {
		// 26/07/2003, 2.30
		sDate   = date + "/" + month + "/" + year;
		sTime   = r_hours + "." + minutes;
		sConcat = ", ";
	} else if (format == "format_ja_JP") {
		// 2003年12月4日(木) 午前 6時18分
		sDate   = r_year + "年" + (r_month+1) + "月" + r_date + "日(" + date$configuration.jp.dayNames[r_day] + ")";
		sTime   = (sNoon == "PM" ? "午後" : "午前") + " " + usHours + "時" + minutes + "分";
		sConcat = " ";
	} else if (format == "f1_de_DE" || format == "f1_de_CH") {
		// Freitag, 6. Juli 2007, 7:30
		sDate   = date$configuration.de.dayNames[r_day] + ", " + r_date + ". " + date$configuration.de.monthNames[r_month] + " " + year;
		sTime   = r_hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f2_de_DE" || format == "f2_de_CH") {
		// Fr, 6.7.2007, 7:30
		sDate   = date$configuration.de.dayNames[r_day].substring(0, 2) + ", " + r_date + "." + (r_month+1) + "." + year;
		sTime   = r_hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f3_de_DE" || format == "f3_de_CH") {
		// 6.7.2007 7:30
		sDate   = r_date + "." + (r_month+1) + "." + year;
		sTime   = r_hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f4_de_DE" || format == "f4_de_CH") {
		// 06.07.2007 07:30
		sDate   = date  + "." + month + "." + year;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f1_pl_PL") {
		// piątek, 26 lipca 2007, godz. 14:30
		sDate   = date$configuration.pl.dayNames[r_day] + ", " + r_date + " " + date$configuration.pl.monthNames[r_month] + " " + year;
		sTime   = "godz. " + hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f2_pl_PL") {
		// 26 lipca 2007, godz. 14:30
		sDate   = r_date + " " + date$configuration.pl.monthNames[r_month] + " " + year;
		sTime   = "godz. " + hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f3_pl_PL") {
		// 2007.07.26, 14:30
		sDate   = year + "." + month + "." + date;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f4_pl_PL") {
		// 26.07.2007, 14:30
		sDate   = date + "." + month + "." + year;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f1_hr_HR") {
		// subota, 19. studeni 2007, 18:08
		sDate   = date$configuration.hr.dayNames[r_day] + ", " + r_date + ". " + date$configuration.hr.monthNames[r_month] + " " + year;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f2_hr_HR") {
		// 19. studeni 2007, 18:08
		sDate   = r_date + ". " + date$configuration.hr.monthNames[r_month] + " " + year;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} else if (format == "f3_hr_HR") {
		// 19.11.2007, 18:08 
		sDate   = year + "." + month + "." + date;
		sTime   = hours + ":" + minutes
		sConcat = ", ";
	} 

	if ((showDate && showTime) || (!showDate && !showTime)) {
		return sDate + sConcat + sTime;
	} else if (showDate) {
		return sDate;
	} else if (showTime) {
		return sTime;
	}	
}

/*
	##################################################################################
*/

var date$configuration = {
	
	de	:	{
		monthNames 			: [ "Januar", "Februar", "März", "April", "May", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" ],
		dayNames 			: [ "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" ],
		monthShortcutLength : 3,
		dayShortcutLength 	: 2
	},
	
	en	:	{
		monthNames 			: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
		dayNames 			: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
		monthShortcutLength : 3,
		dayShortcutLength 	: 3
	},

	it	:	{
		monthNames 			: [ "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" ],
		dayNames 			: [ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" ],
		monthShortcutLength : 3,
		dayShortcutLength 	: 2
	},

	jp	:	{
		monthNames 			: [ "１月", "２月", "３月", "４月", "５月", "６月", "７月", "８月", "９月", "１０月", "１１月", "１２月" ],
		dayNames 			: [ "日", "月", "火", "水", "木", "金", "土" ]
	},

	pl	:	{
		monthNames 			: [ "stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia" ],
		dayNames 			: [ "niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota" ]
	},
	
	hr	:	{
		monthNames 			: [ "siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac" ],
		dayNames 			: [ "nedjelja", "ponedjeljak", "utorak", "srijeda",	"četvrtak", "petak", "subota" ]
	}
}


/*
	##################################################################################
*/


/**
 * timezone format: "±HH:MM"
 */
function dateToTimeStamp(d, timezone) {
	if (timezone) {
		var oldMillies = d.getTime();
		var tz_hours = timezone.substring(1, 3);
		var tz_minutes = timezone.substring(4, 6);
		d.setTime((timezone.charAt(0) == '+' ? 1 : -1) * 1000 * 60 * (tz_minutes + 60 * tz_hours) + oldMillies);
	}
	var year = "" + d.getUTCFullYear();
	var month = (d.getUTCMonth() < 9 ? "0" : "") + (d.getUTCMonth() + 1);
	var date = (d.getUTCDate() < 10 ? "0" : "") + d.getUTCDate();
	var hours = (d.getUTCHours() < 10 ? "0" : "") + d.getUTCHours();
	var minutes = (d.getUTCMinutes() < 10 ? "0" : "") + d.getUTCMinutes();
	var seconds = (d.getUTCSeconds() < 10 ? "0" : "") + d.getUTCSeconds();
	return timestamp = year + month + date + hours + minutes + seconds;
}

function getTimeStamp(d) {
	var year = "" + d.getFullYear();
	var month = (d.getMonth() < 9 ? "0" : "") + (d.getMonth() + 1);
	var date = (d.getDate() < 10 ? "0" : "") + d.getDate();
	var hours = (d.getHours() < 10 ? "0" : "") + d.getHours();
	var minutes = (d.getMinutes() < 10 ? "0" : "") + d.getMinutes();
	var seconds = (d.getSeconds() < 10 ? "0" : "") + d.getSeconds();
	return timestamp = year + month + date + hours + minutes + seconds;
}

/**
 * iso format: YYYY-MM-DD HH:MM:SS[±II:NN]
 * - time zone (II = hours, NN = minutes) is ignored
 * time stamp format: YYYYMMDDHHMMSS
 */
function utcIsoToLocaleTimestamp(utcIso,showDate,showTime) {
	return dateToLocaleTimeStamp(utcIsoToDate(utcIso),showDate,showTime);
}

function isoToLocaleTimestamp(iso,showDate,showTime) {
	return dateToLocaleTimeStamp(isoToDate(iso),showDate,showTime);
}

/**
 * iso format: YYYY-MM-DD HH:MM:SS[±II:NN]
 * - time zone (II = hours, NN = minutes) is ignored
 * time stamp format: YYYYMMDDHHMMSS
 */
function utcIsoToTimestamp(utcIso, timezone) {
	return dateToTimeStamp(utcIsoToDate(utcIso), timezone);
}

function getSinceString(isoRef, isoDate) {
	/*
	*/
	var refTime  = isoToDate(isoRef).getTime();
	var dateTime = isoToDate(isoDate).getTime();
	var offset   = Math.round((dateTime - refTime) / 1000);
	
	if (offset <= 0) {
		return "";	
	}
	
	var seconds  = offset % 60;
	var minutes  = (Math.floor(offset / 60) % 60);
	var hours    = Math.floor(offset / 60 / 60);
	var days     = Math.floor(offset / 60 / 60 / 24);
	
	if (offset <  60) 	  		return I18N.xlate("extras", "${#value} second(s) later",  { "value" : offset });
	if (offset <  60 * 60) 		return I18N.xlate("extras", "${#value} minutes(s) later", { "value" : minutes });
	if (offset <  60 * 60 * 24)	return I18N.xlate("extras", "${#hours}:${minutes} hour(s) later", { "hours" : hours, "minutes": (minutes < 10 ? "0" + minutes : minutes) });
	else 						return I18N.xlate("extras", "${#value} days(s) later", { "value" : days });
}



