﻿/*
Author: Giuseppe
Date: 14/08/2009
Provides extension to the Date.Parse by passing the format the date is.
While a date format like dd/mmm/yyyy would fail with the normal Date.parse the following will handle it correctly.
Note: pls add date formats if needed

Example of use:
NETJOHNHENRY.Date.parse('01/08/2008', 'dd/mm/yyyy')

*/
// Namespace existence test
var NETJOHNHENRY = window.NETJOHNHENRY || {};

NETJOHNHENRY.Date = (function()
{

	var ONE_SECOND = 1000;
	var ONE_MINUTE = ONE_SECOND * 60;
	var ONE_HOUR = ONE_MINUTE * 60;
	var ONE_DAY = ONE_HOUR * 24;
	var ONE_WEEK = ONE_DAY * 7;
	var DAY_MONTH_FULLYEAR_DASH_SEPARATED = 'dd-mm-yyyy';
	var DAY_MONTH_FULLYEAR_SPACE_SEPARATED = 'dd mm yyyy';
	var DAY_MONTH_FULLYEAR_SLASH_SEPARATED = 'dd/mm/yyyy';
	var MONTH_DAY_FULLYEAR_SLASH_SEPARATED = 'mm-dd-yyyy';

	function NewDate(date_string, date_format)
	{
		var regex = /\d+/g;
		var date_parts = date_string.match(regex);
		var date = null;
		switch (date_format)
		{
			case DAY_MONTH_FULLYEAR_DASH_SEPARATED:
			case DAY_MONTH_FULLYEAR_SPACE_SEPARATED:
			case DAY_MONTH_FULLYEAR_SLASH_SEPARATED:
				date = new Date(date_parts[1] + "/" + date_parts[0] + "/" + date_parts[2]);
				break;
			case MONTH_DAY_FULLYEAR_SLASH_SEPARATED:
				date = new Date(date_parts[0] + "/" + date_parts[1] + "/" + date_parts[2]);
			default:
				date = new Date(date_string);
				break;
		}
		return date;
	}
	//Note: returns the number of milliseconds like the built in Date.Parse
	//Use NewDate if a Date object is required as a return
	function parse(date_string, date_format)
	{
		return NewDate(date_string, date_format).getTime();
	}
	//Dates in javascript are held as the number of milliseconds elapsed from 1st January 1970.
	//To Add/Subtract days or hours to a date you should pass the equivalent number of milliseconds for a day or hour etc. 
	//The exposed constants (ie. ONE_SECOND, ONE_HOUR, ONE_DAY) can be used to facilitating the calculation
	//Returns: A new Date object.
	function AddToDate(date_object, milliseconds)
	{
		var mls = date_object.getTime() + milliseconds;
		return new Date(mls);
	}
	function FormatNumberToStringWithLeadingZero(n)
	{
		return n < 10 ? '0' + n : n.toString();
	}
	//Note: The getYear() method is a real mess. 
	//For dates prior to 2000, all browsers subtract 1900 from the year and 
	//return the two-digit result (for example, 99 for 1999). For 2000 and later, the behavior depends on the browser and version.
	//Returns: A string representing the date
	function FormatDateToString(date_object, date_format)
	{
		var date_string = '';
		var day = FormatNumberToStringWithLeadingZero(date_object.getDate());
		//Note: .getMonth() returns an integer ranging from 0 to 11;
		var month = FormatNumberToStringWithLeadingZero(date_object.getMonth() + 1)
		var year = date_object.getFullYear();
		switch (date_format)
		{
			case DAY_MONTH_FULLYEAR_DASH_SEPARATED:
				date_string = day + "-" + month + "-" + year;
				break;
			case DAY_MONTH_FULLYEAR_SPACE_SEPARATED:
				date_string = day + " " + month + " " + year;
				break;
			case DAY_MONTH_FULLYEAR_SLASH_SEPARATED:
				date_string = day + "/" + month + "/" + year;
				break;
			case MONTH_DAY_FULLYEAR_SLASH_SEPARATED:
				date_string = month + "/" + day + "/" + year;
			default:
				date_string = date_object.toString(); ;
				break;
		}
		return date_string;
	}

	function isDaylightSavingTime(date_object)
	{
		var jan = new Date(date_object.getFullYear(), 0, 1);
		var jul = new Date(date_object.getFullYear(), 6, 1);
		var stdTimeOffset = Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());

		return date_object.getTimezoneOffset() != stdTimeOffset;
	}

	

	return {
		NewDate: NewDate,
		parse: parse,
		AddToDate: AddToDate,
		FormatDateToString: FormatDateToString,
		isDaylightSavingTime: isDaylightSavingTime,
		ONE_SECOND: ONE_SECOND,
		ONE_MINUTE: ONE_MINUTE,
		ONE_HOUR: ONE_HOUR,
		ONE_DAY: ONE_DAY,
		ONE_WEEK: ONE_WEEK,
		DAY_MONTH_FULLYEAR_DASH_SEPARATED: DAY_MONTH_FULLYEAR_DASH_SEPARATED,
		DAY_MONTH_FULLYEAR_SPACE_SEPARATED: DAY_MONTH_FULLYEAR_SPACE_SEPARATED,
		DAY_MONTH_FULLYEAR_SLASH_SEPARATED: DAY_MONTH_FULLYEAR_SLASH_SEPARATED,
		MONTH_DAY_FULLYEAR_SLASH_SEPARATED: MONTH_DAY_FULLYEAR_SLASH_SEPARATED
		

	};
})();
