/****************************************************************/
/* Clock & Date iGoogle Gadget - JavaScript                     */
/* (C) 2008 by Sebastian Majstorovic							*/
/* dev@canbuffi.de												*/
/* http://www.canbuffi.de										*/
/****************************************************************/


/***** CLASSES *****/
// DATE-FORMAT
Date.prototype.format = function(format) {
	var returnStr = '';
	var replace = Date.replaceChars;
	for (var i = 0; i < format.length; i++) {
		var curChar = format.charAt(i);
		if (replace[curChar])
			returnStr += replace[curChar].call(this);
		else
			returnStr += curChar;
	}
	return returnStr;
};

Date.replaceChars = {
	shortMonths: [
		'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
	],
	
	longMonths: [
		prefs.getMsg('january'),
		prefs.getMsg('february'),
		prefs.getMsg('march'),
		prefs.getMsg('april'),
		prefs.getMsg('may'),
		prefs.getMsg('june'),
		prefs.getMsg('july'),
		prefs.getMsg('august'),
		prefs.getMsg('september'),
		prefs.getMsg('october'),
		prefs.getMsg('november'),
		prefs.getMsg('december')
	],
	
	shortDays: [
		'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
	],
	
	longDays: [
		prefs.getMsg('sunday'),
		prefs.getMsg('monday'),
		prefs.getMsg('tuesday'),
		prefs.getMsg('wednesday'),
		prefs.getMsg('thursday'),
		prefs.getMsg('friday'),
		prefs.getMsg('saturday')
	],
		
	// Day
	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
	D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
	j: function() { return this.getDate(); },
	l: function() { return Date.replaceChars.longDays[this.getDay()]; },
	N: function() { return this.getDay() + 1; },
	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 13 && this.getDate() != 1 ? 'rd' : 'th'))); },
	w: function() { return this.getDay(); },
	z: function() { return "Not Yet Supported"; },
	// Week
	W: function() { return "Not Yet Supported"; },
	// Month
	F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
	m: function() { return (this.getMonth() < 11 ? '0' : '') + (this.getMonth() + 1); },
	M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
	n: function() { return this.getMonth() + 1; },
	t: function() { return "Not Yet Supported"; },
	// Year
	L: function() { return "Not Yet Supported"; },
	o: function() { return "Not Supported"; },
	Y: function() { return this.getFullYear(); },
	y: function() { return ('' + this.getFullYear()).substr(2); },
	// Time
	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
	B: function() { return "Not Yet Supported"; },
	g: function() { return this.getHours() == 0 ? 12 : (this.getHours() > 12 ? this.getHours() - 12 : this.getHours()); },
	G: function() { return this.getHours(); },
	h: function() { return (this.getHours() < 10 || (12 < this.getHours() < 22) ? '0' : '') + (this.getHours() < 10 ? this.getHours() + 1 : this.getHours() - 12); },
	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
	// Timezone
	e: function() { return "Not Yet Supported"; },
	I: function() { return "Not Supported"; },
	O: function() { return (this.getTimezoneOffset() < 0 ? '-' : '+') + (this.getTimezoneOffset() / 60 < 10 ? '0' : '') + (this.getTimezoneOffset() / 60) + '00'; },
	T: function() { return "Not Yet Supported"; },
	Z: function() { return this.getTimezoneOffset() * 60; },
	// Full Date/Time
	c: function() { return "Not Yet Supported"; },
	r: function() { return this.toString(); },
	U: function() { return this.getTime() / 1000; }
}

// CLOCK

var Clock = new Class({
	initialize: function() {
		this.date = new Date();
		
		this.zone_offset = this.date.getTimezoneOffset() * 60 * 1000;
		this.user_offset = (prefs.getInt("offset_hours") * 3600 + prefs.getInt("offset_minutes") * 60) * 1000;
		this.user_offset += prefs.getBool("daylight") == true ? 3600 * 1000 : 0;
		this.date.setTime(this.date.getTime() + this.zone_offset + this.user_offset);
		
		this.date_formats = new Array();
		this.time_formats = new Array();
		this.time_format = prefs.getInt("time_format");
		this.date_format = prefs.getInt("date_format");
		
		var dayofweek = prefs.getBool("dayofweek") == true ? 'l, ' : ''; 
		var seconds = prefs.getBool("seconds") == true ? ':s' : ''; 
		
		this.date_formats[0] = dayofweek + 'F j, Y';
		this.date_formats[1] = dayofweek + 'j. F Y';
		this.date_formats[2] = dayofweek + 'Y, F j';
		this.date_formats[3] = dayofweek + 'j F Y';
		
		this.time_formats[0] = 'g:i' + seconds;
		this.time_formats[1] = 'H:i' + seconds;
	},
	
	display: function() {
		$('time').setHTML(this.date.format(this.time_formats[this.time_format]));
		$('date').setHTML(this.date.format(this.date_formats[this.date_format]));
		
		if (this.time_format == 0) {
			$('am_pm').setHTML(this.date.format('A'));
		}
		
		if (this.date.getHours() >= 5 && this.date.getHours() < 12) {
			$('greeting').innerHTML = prefs.getMsg('goodmorning');
		} else if (this.date.getHours() >= 12 && this.date.getHours() < 18) {
			$('greeting').innerHTML = prefs.getMsg('goodafternoon');
		} else if (this.date.getHours() >= 18 && this.date.getHours() < 24) {
			$('greeting').innerHTML = prefs.getMsg('goodevening');	
		} else if (this.date.getHours() < 5) {
			$('greeting').innerHTML = prefs.getMsg('goodnight');
		}
	},
	
	go: function() {
		this.date.setTime(this.date.getTime() + 1000);
		this.display();
	}
});