/////////////////////////////////////////////////////////////////////////////
//  $Workfile: W3C_DTF.js $ $Revision: 1.2 $ $Author: biden $ $Date: 2006/06/05 14:06:38 $
/////////////////////////////////////////////////////////////////////////////

var HYPHEN = "-";
var COLON =  ":";

var REX_YYYY_MM_DDTHH_MMZ =  /\d\d\d\d-\d\d-\d\dT\d\d:\d\dZ$/;
var REX_YYYY_MM_DDTHH_MMTZD = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d[+-]\d\d:\d\d$/;
var REX_YYYY_MM_DDTHH_MM_SSZ = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ$/;
var REX_YYYY_MM_DDTHH_MM_SSTZD = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d[+-]\d\d:\d\d$/;
var REX_YYYY_MM_DDTHH_MM_SSMZ = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{1,}Z$/;
var REX_YYYY_MM_DDTHH_MM_SSMTZD = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{1,}[+-]\d\d:\d\d$/;

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF()
//
//	DESCRIPTION: checks if dates conform to W3C-DTF.
//  Valid Examples:
//                  YYYY
//                  YYYY-MM
//                  YYYY-MM-DD
//                  YYYY-MM-DDThh:mmZ  eg. 1997-07-16T19:20Z  * Z is Zulu
//                  YYYY-MM-DDThh:mm+HH:MM  eg. 1997-07-16T19:20+01:00  **TZD is Time-Zone Difference in HH:MM
//                  YYYY-MM-DDThh:mm:ss+HH:MM  eg. 1997-07-16T19:20:30+01:00
//                  YYYY-MM-DDThh:mm:ss+HH:MM  eg. 1997-07-16T19:20:30+01:00
//                  YYYY-MM-DDThh:mm:ss.s+HH:MM  eg. 1997-07-16T19:20:30.45+01:00, where s is one or more
//
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF(sDate)
{

	///////////////////////////////////////
  // Assert Format type by length
	///////////////////////////////////////
	if(isW3C_DTF_1(sDate))
	{
		//alert("Valid DTF 1");
		return true;
	}
	else if(isW3C_DTF_2(sDate))
	{
		//alert("Valid DTF 2");
		return true;
	}
	else if(isW3C_DTF_3(sDate))
	{
		//alert("Valid DTF 3");
		return true;
	}
	else if(isW3C_DTF_4(sDate))
	{
		//alert("Valid DTF 4");
		return true;
	}
	else if(isW3C_DTF_5(sDate))
	{
		//alert("Valid DTF 5");
		return true;
	}
	else if(isW3C_DTF_6(sDate))
	{
		//alert("Valid DTF 6");
		return true;
	}
	else if(isW3C_DTF_7(sDate))
	{
		//alert("Valid DTF 7");
		return true;
	}
	else if(isW3C_DTF_8(sDate))
	{
		//alert("Valid DTF 8");
		return true;
	}
	else if(isW3C_DTF_9(sDate))
	{
		//alert("Valid DTF 9");
		return true;
	}
	else
		return false;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF1()
//
//	DESCRIPTION: strData is in 'YYYY' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_1(sDate)
{
	var REX_YYYY = /^\d{4}$/;
	if(!REX_YYYY.test(sDate))
		return false;
	else
		return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF2()
//
//	DESCRIPTION: strData is in 'YYYY-MM' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_2(sDate)
{
	var REX_YYYY_MM = /^\d\d\d\d-(\d\d)$/;
	if(!REX_YYYY_MM.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;
	else
		return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF3()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DD' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_3(sDate)
{
	var REX_YYYY_MM_DD = /^\d\d\d\d-(\d\d)-(\d\d)$/;
	if(!REX_YYYY_MM_DD.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2))
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF4()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MMZ' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_4(sDate)
{
	var REX_YYYY_MM_DDTHH_MMZ =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d)Z$/;
	if(!REX_YYYY_MM_DDTHH_MMZ.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	return true;

}


//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF5()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MM+/-HH:MM' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_5(sDate)
{
	var REX_YYYY_MM_DDTHH_MMZ =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d)[+-](\d\d):(\d\d)$/;
	if(!REX_YYYY_MM_DDTHH_MMZ.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	if(!isHour(RegExp.$5,true,false))
		return false;
	/**{
		alert("TZD must have 00-12 hours!");
		return false;
	}*/

	if(!isMinute(RegExp.$6,true))
		return false;

	return true;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF6()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MM:SSZ' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_6(sDate)
{
	var REX_YYYY_MM_DDTHH_MM_SSZ =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/;
	if(!REX_YYYY_MM_DDTHH_MM_SSZ.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	if(!isMinute(RegExp.$5,false))	// isSecond
		return false;

	return true;

}


//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF7()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MM:SS+/-HH:MM' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_7(sDate)
{
	var REX_YYYY_MM_DDTHH_MM_SSTZD =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)[+-](\d\d):(\d\d)$/;
	if(!REX_YYYY_MM_DDTHH_MM_SSTZD.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	if(!isMinute(RegExp.$5,true))
		return false;

	if(!isHour(RegExp.$6,true,false))
		return false;
	/**{
		alert("TZD must have 00-12 hours!");
		return false;
	}*/

	if(!isMinute(RegExp.$7,true))
		return false;

	return true;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF8()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MM:SS.SZ' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_8(sDate)
{
	var REX_YYYY_MM_DDTHH_MM_SS_SZ =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)\.\d{1,}Z$/;
	if(!REX_YYYY_MM_DDTHH_MM_SS_SZ.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	if(!isMinute(RegExp.$5,true))
		return false;

	return true;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isW3C_DTF9()
//
//	DESCRIPTION: strData is in 'YYYY-MM-DDTHH:MM:SS.S+/-HH:MM' according to W3C-DTF
//	PARAMETERS:  strDate
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isW3C_DTF_9(sDate)
{
	var REX_YYYY_MM_DDTHH_MM_SS_STZD =  /^\d\d\d\d-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)\.\d{1,}[+-](\d\d):(\d\d)$/;
	if(!REX_YYYY_MM_DDTHH_MM_SS_STZD.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2,true))
		return false;

	if(!isHour(RegExp.$3,true,true))
		return false;

	if(!isMinute(RegExp.$4,true))
		return false;

	if(!isMinute(RegExp.$5,true))
		return false;

	if(!isHour(RegExp.$6,true,false))
	{
		alert("TZD must have 00-12 hours!");
		return false;
	}

	if(!isMinute(RegExp.$7,true))
		return false;

	return true;

}
