
/***   TIME ZONES 1.0   ***/
/* tommaso.perego@gmail.com */
// find remove clear undefined
/* 
How to use:
1- Simply add onload="getTime(true)" to the body element
2- Add the timezones you need then set the GMT offset and the daylight saving time start and stop date for each of them
3- Add a parent element to the HTLM with id="TimeZones" to output the timings
*/

// Global Variables
var timeZones = new Object()

// TimeZones initialization function
function initTimeZones(date) {
	// TIME ZONES
	var wantedTimeZones = new Array('LOCAL','GMT','reykjavik','london','oslo','newyork');
	for (i=0; i<=6; i++) { timeZones[wantedTimeZones[i]] = new Object();	}
	for (zone in timeZones) {
		timeZones[zone] = new Object();
		timeZones[zone]['time'] = null;
		timeZones[zone]['GMTOffset'] = null;
		timeZones[zone]['DST'] = new Object();
		timeZones[zone]['DST']['inc'] = 0;
		timeZones[zone]['DST']['active'] = false;
		timeZones[zone]['DST']['startDate'] = new Date();
		timeZones[zone]['DST']['stopDate']  = new Date();
		timeZones[zone]['display'] = false;
	}
	timeZones['GMT']		['GMTOffset'] = 0;
	timeZones['reykjavik']	['GMTOffset'] = 0;	timeZones['reykjavik']	['display'] = true; 
	timeZones['london']		['GMTOffset'] = -1;	timeZones['london']		['display'] = true;
	timeZones['oslo']		['GMTOffset'] = 0;	timeZones['oslo']		['display'] = true;
	timeZones['newyork']	['GMTOffset'] = -6;	timeZones['newyork']	['display'] = true;
	
	// DAYLIGHT SAVING TIME
	// London: start the last Sunday of March, stop the last Sunday of October
	timeZones['london']['DST']['active'] = true;
	timeZones['london']['DST']['startDate'].setMonth(3);	timeZones['london']['DST']['startDate'].setDate(31);	timeZones['london']['DST']['startDate'].setDate(31-timeZones['london']['DST']['startDate'].getDay());
	timeZones['london']['DST']['stopDate'].setMonth(10);	timeZones['london']['DST']['stopDate'].setDate(31);		timeZones['london']['DST']['stopDate'].setDate(31-timeZones['london']['DST']['stopDate'].getDay());
	// Oslo: start the last Sunday of March, stop the last Sunday of October
	timeZones['oslo']['DST']['active'] = true;
	timeZones['oslo']['DST']['startDate'].setMonth(3);		timeZones['oslo']['DST']['startDate'].setDate(31);		timeZones['oslo']['DST']['startDate'].setDate(31-timeZones['oslo']['DST']['startDate'].getDay());
	timeZones['oslo']['DST']['stopDate'].setMonth(10);		timeZones['oslo']['DST']['stopDate'].setDate(31);		timeZones['oslo']['DST']['stopDate'].setDate(31-timeZones['oslo']['DST']['stopDate'].getDay());
	// Newyork: start the second Sunday of March, stop the first Sunday of November
	timeZones['newyork']['DST']['active'] = true;
	timeZones['newyork']['DST']['startDate'].setMonth(3);	timeZones['newyork']['DST']['startDate'].setDate(14);	timeZones['newyork']['DST']['startDate'].setDate(14-timeZones['newyork']['DST']['startDate'].getDay());
	timeZones['newyork']['DST']['stopDate'].setMonth(11);	timeZones['newyork']['DST']['stopDate'].setDate(7);		timeZones['newyork']['DST']['stopDate'].setDate(7-timeZones['newyork']['DST']['stopDate'].getDay());
	
	for (zone in timeZones) { if ( (timeZones[zone]['DST']['active']) && (date > timeZones[zone]['DST']['startDate'] || date <= timeZones[zone]['DST']['stopDate']) )	{ timeZones[zone]['DST']['inc'] = 1; }	}
	
	// Create HTML elements
	timeInitRender();
}

// Get time function
function getTime(init) {
	// Get current (local) date
	var date = new Date();
	
	// Initialize TimeZones
	if(init) initTimeZones(date);
	
	// LOCAL TIME
	timeZones['LOCAL']['time']	= date.getHours();
	// GMT
	timeZones['GMT']['time'] 	= ( date.getHours() + (date.getTimezoneOffset()/60) );
	// ZONES TIME
	for (zone in timeZones) { timeZones[zone]['time'] = timeCheck24( timeZones['GMT']['time'] + timeZones[zone]['GMTOffset'] + timeZones[zone]['DST']['inc'] );	}
	
	// Update HTML
	timeRender(date);
	
	// Set update frequency timing
	setTimeout("getTime(false)", 1000);
}

// Prepare HTML elements
function timeInitRender() {
	/* Disabled to allow manual ordering of elements
	for (zone in timeZones) {
		if(timeZones[zone]['display']) {
			// Create Html element to display the time
			timeHTMLElement(zone);
		}
	}
	*/
	timeHTMLElement('reykjavik');
	timeHTMLElement('oslo');
	timeHTMLElement('newyork');
	timeHTMLElement('london');
}

// Helper function
function timeHTMLElement(zone) {
	var HTMLElementID = 'TimeZone_' + zone;
	var HTMLElement = document.createElement('div');
	HTMLElement.setAttribute('id',HTMLElementID);
	document.getElementById('TimeZones').appendChild(HTMLElement);
	timeZones[zone]['HTMLElement'] = document.getElementById(HTMLElementID);
}

// Render function
function timeRender(date) {
	var min = ":" + timeAddZero(date.getMinutes());
	var sec = ":" + timeAddZero(date.getSeconds());
	
	for (zone in timeZones) {
		if(timeZones[zone]['display']) {
			timeZones[zone]['HTMLElement'].innerHTML = timeAddZero(timeZones[zone]['time'])	+ min;
		}
	}
	
	document.getElementById('TimeZone_reykjavik').innerHTML = timeAddZero(timeZones['reykjavik']['time']) + min + sec;
}

// Time utility functions
function timeCheck24(hour)	{ return (hour % 24);  }
function timeAddZero(num)	{ return ((num <= 9) ? ("0" + num) : num); }
