﻿/**
* Converts an xs:date or xs:dateTime formatted string into the local timezone
* and outputs a human-readable form of this date or date/time.
*
* @param {string} gCalTime is the xs:date or xs:dateTime formatted string
* @return {string} is the human-readable date or date/time string
*/
function formatGCalDateTime(gCalTime) {
	// text for regex matches
	var remtxt = gCalTime;

	function consume(retxt) {
		var match = remtxt.match(new RegExp('^' + retxt));
		if (match) {
			remtxt = remtxt.substring(match[0].length);
			return match[0];
		}
		return '';
	}

	// minutes of correction between gCalTime and GMT
	var totalCorrMins = 0;

	var year = consume('\\d{4}');
	consume('-?');
	var month = consume('\\d{2}');
	consume('-?');
	var dateMonth = consume('\\d{2}');
	var timeOrNot = consume('T');

	// if a DATE-TIME was matched in the regex 
	if (timeOrNot == 'T') {
		var hours = consume('\\d{2}');
		consume(':?');
		var mins = consume('\\d{2}');
		consume('(:\\d{2})?(\\.\\d{3})?');
		var zuluOrNot = consume('Z');

		// if time from server is not already in GMT, calculate offset
		if (zuluOrNot != 'Z') {
			var corrPlusMinus = consume('[\\+\\-]');
			if (corrPlusMinus != '') {
				var corrHours = consume('\\d{2}');
				consume(':?');
				var corrMins = consume('\\d{2}');
				totalCorrMins = (corrPlusMinus == '-' ? 1 : -1) *
			(Number(corrHours) * 60 +
		(corrMins == '' ? 0 : Number(corrMins)));
			}
		}

		// get time since epoch and apply correction, if necessary
		// relies upon Date object to convert the GMT time to the local
		// timezone
		var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
		var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
		var ld = new Date(gmtDateEpoch);

		// date is originally in YYYY-MM-DD format
		// time is originally in a 24-hour format
		// this converts it to MM/DD hh:mm (AM|PM) 
		dateString = (ld.getMonth() + 1) + '/' + ld.getDate() + ' ' +
		((ld.getHours() > 12) ? (ld.getHours() - 12) : (ld.getHours() === 0 ? 12 :
	ld.getHours())) + ':' + ((ld.getMinutes() < 10) ? ('0' +
	ld.getMinutes()) : (ld.getMinutes())) + ' ' +
	((ld.getHours() >= 12) ? 'PM' : 'AM');
	} else {
		// if only a DATE was matched
		dateString = parseInt(month, 10) + '/' + parseInt(dateMonth, 10);
	}
	return dateString;
}

function formatGCalTime(gCalTime) {
	// text for regex matches
	var remtxt = gCalTime;

	function consume(retxt) {
		var match = remtxt.match(new RegExp('^' + retxt));
		if (match) {
			remtxt = remtxt.substring(match[0].length);
			return match[0];
		}
		return '';
	}

	// minutes of correction between gCalTime and GMT
	var totalCorrMins = 0;

	var year = consume('\\d{4}');
	consume('-?');
	var month = consume('\\d{2}');
	consume('-?');
	var dateMonth = consume('\\d{2}');
	var timeOrNot = consume('T');

	// if a DATE-TIME was matched in the regex 
	if (timeOrNot == 'T') {
		var hours = consume('\\d{2}');
		consume(':?');
		var mins = consume('\\d{2}');
		consume('(:\\d{2})?(\\.\\d{3})?');
		var zuluOrNot = consume('Z');

		// if time from server is not already in GMT, calculate offset
		if (zuluOrNot != 'Z') {
			var corrPlusMinus = consume('[\\+\\-]');
			if (corrPlusMinus != '') {
				var corrHours = consume('\\d{2}');
				consume(':?');
				var corrMins = consume('\\d{2}');
				totalCorrMins = (corrPlusMinus == '-' ? 1 : -1) *
			(Number(corrHours) * 60 +
		(corrMins == '' ? 0 : Number(corrMins)));
			}
		}

		// get time since epoch and apply correction, if necessary
		// relies upon Date object to convert the GMT time to the local
		// timezone
		var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
		var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
		var ld = new Date(gmtDateEpoch);

		// date is originally in YYYY-MM-DD format
		// time is originally in a 24-hour format
		// this converts it to MM/DD hh:mm (AM|PM) 
		dateString = ((ld.getHours() > 12) ? (ld.getHours() - 12) : (ld.getHours() === 0 ? 12 :
	ld.getHours())) + ':' + ((ld.getMinutes() < 10) ? ('0' +
	ld.getMinutes()) : (ld.getMinutes())) + ' ' +
	((ld.getHours() >= 12) ? 'PM' : 'AM');
	} else {
    // if only a DATE was matched
        var justDate = new Date(parseInt(month, 10) + '/' + parseInt(dateMonth, 10) + '/' + parseInt(year,10));
        dateString = justDate.addDays(1).getMonth() + '/' + justDate.addDays(1).getDay();
	}
	return dateString;
}

Date.prototype.addDays = function (days) {
    try {
        this.setDate(this.getDate() + days);
    }
    catch (e) {
    }
}
