
var isoDate_pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d{3})?$/;

function nowDate()
{
	var now = new Date();
	now.setHours(0, 0, 0, 0);
	return now;
}

function nowDateTime()
{
	return new Date();
}

function startOfDay()
{
	var returnTime = new Date();
	returnTime.setHours(0, 0, 0, 0);
	return returnTime;
}

function endOfDay()
{
	var returnTime = new Date();
	returnTime.setHours(23, 59, 59, 0);
	return returnTime;
}

function nowDateShortString()
{
	return dateShortString(new Date());
}

function dateShortString(dateObject)
{
	var dateArray = new Array();
	dateArray['d'] = stringRight("0" + dateObject.getDate(), 2);
	dateArray['m'] = stringRight("0" + (dateObject.getMonth() + 1), 2);
	dateArray['y'] = dateObject.getFullYear();
	
	return dateArray[date_order_output[0]] + date_separator + dateArray[date_order_output[1]] + date_separator + dateArray[date_order_output[2]];
}

function nowDateFullString()
{
	return dateFullString(new Date());
}

function dateFullString(dateObject)
{
	return shortdaynames[dateObject.getDay()] + " " + dateShortString(dateObject);
}

function nowTimeShortString()
{
	return timeShortString(new Date());
}

function timeShortString(dateObject)
{
	return stringRight("0" + dateObject.getHours(), 2) + time_separator + stringRight("0" + dateObject.getMinutes(), 2);
}

function nowTimeFullString()
{
	return timeFullString(new Date());
}

function timeFullString(dateObject)
{
	return stringRight("0" + dateObject.getHours(), 2) + time_separator + stringRight("0" + dateObject.getMinutes(), 2) + time_separator + stringRight("0" + dateObject.getSeconds(), 2);
}

function dateISOformat(dateObject)
{
	return dateObject.getFullYear() + "-" + stringRight("0" + (dateObject.getMonth() + 1), 2) + "-" + stringRight("0" + dateObject.getDate(), 2) + "T" + timeFullString(dateObject).replace(time_separator,":") + ".000"
}

// You should probably use isValidDate unless you know the date string is valid
function makeDate(htcName)
{
	document.all(htcName).value.match(date_pattern);
	
	var dateArray = new Array(parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$3, 10));
	
	var dateObject = new Date(2000, 1, 1);

	dateObject.setFullYear(dateArray[date_order['y']]);
	dateObject.setMonth(dateArray[date_order['m']] - 1);
	dateObject.setDate(dateArray[date_order['d']]);
	
	dateObject.setHours(0, 0, 0, 0);

	return dateObject;
}

function isFutureDate(dateObject)
{
	return (compareTwoDateObjects(dateObject, nowDate()) == 1);
}

function isPastDate(dateObject)
{
	return (compareTwoDateObjects(dateObject, nowDate()) == -1);
}

function isNowOrFutureDate(dateObject)
{
	return (compareTwoDateObjects(dateObject, nowDate()) != -1);
}

function isNowOrPastDate(dateObject)
{
	return (compareTwoDateObjects(dateObject, nowDate()) != 1);
}

function compareTwoDates(htcName1, htcName2)
{
	return compareTwoDateObjects(makeDate(htcName1), makeDate(htcName2));
}

function compareTwoDateObjects(dateObject1, dateObject2)
{
	var time1 = dateObject1.getTime();
	var time2 = dateObject2.getTime();
	
	if (time1 <  time2) { return -1; }
	if (time1 == time2) { return  0; }
	if (time1 >  time2) { return  1; }
}

function isValidDate(htcName)
{
	document.all(htcName).value.match(date_pattern);
	
	var dateArray = new Array(parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$3, 10));
	
	return isValidDateDDMMYYYY(dateArray[date_order['d']], dateArray[date_order['m']], dateArray[date_order['y']]);
}

function isValidDateDDMMYYYY(day, month, year)
{
	month--;
	
	var testDate = new Date(2000, 1, 1);

	testDate.setFullYear(year);
	if (testDate.getFullYear() != year) { return false; }
	
	testDate.setMonth(month);
	if (testDate.getMonth() != month) {return false; }

	testDate.setDate(day);
	if (testDate.getDate() != day) {return false; }
	
	testDate.setHours(0, 0, 0, 0);
	
	return testDate;
}

function isValidTime(htcName)
{
	if (!document.all(htcName).value.match(optionalfulltime_pattern))
	{
		return false;
	}
	var timeArray = new Array(parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$4, 10));

	if (isNaN(timeArray[2]))
	{
		timeArray[2] = 0;
	}

	if (timeArray[0] < 0 || timeArray[0] > 23 || timeArray[1] < 0 || timeArray[1] > 59 || timeArray[2] < 0 || timeArray[2] > 59)
	{
		return false;
	}

	var testTime = new Date();
	testTime.setHours(timeArray[0], timeArray[1], timeArray[2], 0);
	return isNaN(testTime)?false:testTime;
}

function isValidTimeOrBlank(htcName)
{
	if (document.all(htcName).value == "")
	{
		return true;
	}
	
	return isValidTime(htcName);
}

function isValidFullTime(htcName)
{
	document.all(htcName).value.match(fulltime_pattern);
	var timeArray = new Array(parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$3, 10));
	if (timeArray[0] < 0 || timeArray[0] > 23 || timeArray[1] < 0 || timeArray[1] > 59 || timeArray[2] < 0 || timeArray[2] > 59)
	{
		return false;
	}

	var testTime = new Date();
	testTime.setHours(timeArray[0], timeArray[1], timeArray[2], 0);
	
	return isNaN(testTime)?false:testTime;
}

function isValidFullTimeOrBlank(htcName)
{
	if (document.all(htcName).value == "")
	{
		return true;
	}
	
	return isValidFullTime(htcName);
}

function isValidDateTime(dateHtc, timeHtc)
{
	var dateObject = isValidDate(dateHtc);
	
	if (! dateObject) { return false; }
	
	var timeObject = isValidTime(timeHtc);
	
	if (! timeObject) { return false; }

	dateObject.setHours(timeObject.getHours(), timeObject.getMinutes(), timeObject.getSeconds(), 0);
	
	return dateObject;
}

function isValidDateTimeObjects(dateObject, timeObject)
{
	if (! dateObject) { return false; }
	if (! timeObject) { return false; }

	dateObject.setHours(timeObject.getHours(), timeObject.getMinutes(), timeObject.getSeconds(), 0);
	
	return dateObject;
}

function isValidISODate(sDate)
{
	sDate.match(isoDate_pattern);
	
	var testDate = new Date(parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10) - 1, parseInt(RegExp.$3, 10), 
							parseInt(RegExp.$4, 10), parseInt(RegExp.$5, 10), parseInt(RegExp.$6, 10), 0);
	
	return isNaN(testDate)?false:testDate;
}

function durationDates(htcName1, htcName2)
{
	return durationDateObjects(makeDate(htcName1), makeDate(htcName2));
}

// Returns the difference in seconds between the two objects
function durationDateObjects(dateObject1, dateObject2)
{
	var time1 = dateObject1.getTime();
	var time2 = dateObject2.getTime();
	
	return (time2 - time1) / 1000;
}

function stringRight(str, n)
{
	var iLen = String(str).length;

	if (n <= 0)
		return "";
	else if (n > iLen)
		return str;
	else
		return String(str).substring(iLen, iLen - n);
}
// This function is used to show/hide the chart panel
function hideshowCharts()
{	
		if(document.getElementById('dvCharts').style.display == 'block')
		{				
			document.getElementById('showChart').innerText = "Show";
			document.getElementById('arrowChart').innerText = document.getElementById('arrowChartDown').innerText; //"â";		
			document.getElementById('dvCharts').style.display = 'none';
		}
		else		
		{	
			document.getElementById('showChart').innerText = "Hide";
			document.getElementById('arrowChart').innerText = document.getElementById('arrowChartUp').innerText; //"á";			
			document.getElementById('dvCharts').style.display = 'block';				
		}	
}
