function gxvdate( Elem, nDateLen, nDateFmt, nTimeLen, nTimeFmt, sIdiom, pMandatoryCentury, nBlankWhenEmpty)
{
	var bMandatoryCentury = pMandatoryCentury || false;	
	var reEmpty = /^([ ]*(\/[ ]*\/[ ]*((00|12)(:00(:00)?)?[ ]*(a|am)?)?)?)?[ ]*$/i;
	var reVDTime;

	var wasEmpty = false;
	var oldValue = Elem.value;

	if (reEmpty.test( Elem.value))
	{
		wasEmpty = true;
		Elem.value = "";
	}
	
	var controlValue = "";

	var sVDTime = "^[ ]*(";
	if (nDateLen > 0)
	{
		if (nDateLen == 8)
			sVDTime = sVDTime + "([0-9]{1,2})[\/]?([0-9]{1,2})[\/]?([0-9]{2})";
		else
		{
			if (nDateFmt == 0)
			{
				if (bMandatoryCentury)
					sVDTime = sVDTime + "([0-9]{1,2})[\/]?([0-9]{1,2})[\/]?([0-9]{4})";
				else
					sVDTime = sVDTime + "([0-9]{1,2})[\/]?([0-9]{1,2})[\/]?([0-9]{2,4})";
			}
			else
			{
				if (bMandatoryCentury)
					sVDTime = sVDTime + "([0-9]{4})[\/]?([0-9]{1,2})[\/]?([0-9]{1,2})";
				else
					sVDTime = sVDTime + "([0-9]{2,4})[\/]?([0-9]{1,2})[\/]?([0-9]{1,2})";
			}					
		}
	}
	else
		/* Extra parenthesis are added to maintain parameter numbers */
		sVDTime = sVDTime + "( )?( )?( )?";

	if (nTimeLen > 0)
	{
		sVDTime = sVDTime + "(";
		if (nDateLen > 0)
			sVDTime = sVDTime + "[ ]*";
		sVDTime = sVDTime + "([0-9]{2})";

		if (nTimeLen > 2)
			sVDTime = sVDTime + "(:?([0-9]{2}))?";
		else
			sVDTime = sVDTime + "(( )?)?";

		if (nTimeLen > 5)
			sVDTime = sVDTime + "(:?([0-9]{2}))?";
		else
			sVDTime = sVDTime + "(( )?)?";

		if ( nTimeFmt == 1)
			sVDTime = sVDTime + "[ ]*(a|am|p|pm)?";
		else
			sVDTime = sVDTime + "(( )?)?";

		sVDTime = sVDTime + ")?";
	}
	sVDTime = sVDTime + ")?[ ]*$";
	reVDTime = new RegExp( sVDTime, "i");

	if (reVDTime.test( Elem.value))
	{
		var sTokArr = Elem.value.match( reVDTime);

		if (nDateLen > 0)
		{
			if (sTokArr[2] == "" || sTokArr[2] == null)
			{
				if (nBlankWhenEmpty == 1)
					controlValue = "        ";				
				else
					controlValue = "  /  /  ";
				if(nDateLen == 10)
					controlValue += "  ";
			}
			else
			{
				controlValue = sTokArr[2] + "/" + sTokArr[3] + "/" + sTokArr[4];
			}
		}
		else
			controlValue = "";

		if (nTimeLen > 0)
		{
			if (nDateLen > 0)
				controlValue = controlValue + " ";
			if (nBlankWhenEmpty == 1 && (sTokArr[6] == "" || sTokArr[6] == null) && (sTokArr[8] == "" || sTokArr[8] == null) && (sTokArr[10] == "" || sTokArr[10] == null))
			{
				controlValue = controlValue + "        ";
			}
			else{

				if (sTokArr[6] == "" || sTokArr[6] == null)
				{
						if(wasEmpty)
						{
							var emptTokArr = oldValue.match( reEmpty);
							if (emptTokArr[4] != "" && emptTokArr[4] != null)
								controlValue = controlValue + emptTokArr[4];
							else
								controlValue = controlValue + "00";
						}
						else
							controlValue = controlValue + "00";
				}
				else
					controlValue = controlValue + sTokArr[6];

				if (nTimeLen > 2)
				{
					if (sTokArr[8] == "" || sTokArr[8] == null)
						controlValue = controlValue + ":00";
					else
						controlValue = controlValue + ":" + sTokArr[8];
				}

				if (nTimeLen > 5)
				{
					if (sTokArr[10] == "" || sTokArr[10] == null)
						controlValue = controlValue + ":00";
					else
						controlValue = controlValue + ":" + sTokArr[10];
				}

				if ( nTimeFmt == 1)
				{
					var x;
					if (sTokArr[11] == "" || sTokArr[11] == null)
						x = "a";
					else
						x = sTokArr[11].substr(0,1);
					if (x.toLowerCase() == "p")
					{
						controlValue = controlValue + " PM";
					}
					else
					{
						controlValue = controlValue + " AM";
					}
				}
			}
		}
		
		var testDate = new gxdate('', gxdate.SFmt);
		try
		{
			testDate.assign_string(controlValue, gxdate.SFmt, (nTimeLen <= 0), true);
		}
		catch (E)
		{
			GXAlert( Elem, message_text( sIdiom, "datefmt"));
			return false;
		}
		
		if (controlValue != oldValue)
		{
		  Elem.value = controlValue;
		  if (navigator.userAgent.indexOf("Firefox/2") != -1)
		    //WA For FF 2.0 bug (https://bugzilla.mozilla.org/show_bug.cgi?id=357684)
		    Elem.onchange();
		}
		return true;
	}
	GXAlert( Elem, message_text( sIdiom, "datefmt"));
	return false;
}

function monthMaxDays(month, year)
{
	switch ( month)
	{
		case 0: return 31;
		case 1:
			if ((year % 100 != 0) && (year % 4 == 0) || (year % 400 == 0))
				return 29;
			else
				return 28;
		case 2: return 31;
		case 3: return 30;
		case 4: return 31;
		case 5: return 30;
		case 6: return 31;
		case 7: return 31;
		case 8: return 30;
		case 9: return 31;
		case 10: return 30;
		case 11: return 31;
	}
}

