/*
	Suggetions are Welcome.
	
	This library is usful when you want allow user to type the date in text box and you want
	to validate the date. you can validate dates in dd/mm/yy or mm/dd/yy formats.

	Most of the date functions takes two arguments

	1. dtDate :
		data type   - string
		description - String representing the date.

	2. Format
		data type   - integer
		description - date format.
		
		This argument can have value 1, 2 or 3.

		1 - d/m/y format. This is DEFAULT format.
		    when you want to validate date in this format pass 1 as
		    Format argument. This will allow all the following formats
		    dd/mm/yy, dd/mm/yyyy, dd/mmm/yy, dd/mmm/yyyy.
		    
 		    Moreover you can use '-'(Dash) or ' '(space) characters to seperate the date.


		2 - m/d/y format. when you want to validate date in this format pass 2 as
		    Format argument. This will allow all the following formats
		    mm/dd/yy, mm/dd/yyyy, mmm/dd/yy, mmm/dd/yyyy.
		    
 		    Moreover you can use '-'(Dash) or ' '(space) characters to seperate the date.


		3 - m/y format. when you want to validate date in this format pass 3 as
		    Format argument. This will allow all the following formats
		    mm/yy, mm/yyyy, mmm/yy, mmm/yyyy.
		    
 		    Moreover you can use '-'(Dash) or ' '(space) characters to seperate the date.

	Also you can validate date like 5 july, 2001 (with Format = 1 for dd/mm/yy).

LIST OF FUNCTIONS IN THIS LIBRARY
----------------------------------

	1. IsDate(dtDate, [Format])
		Argument	Data Type	Desc
		--------	---------   ----
		dtDate	:	String		String containing date to validate
		Format	:	integer		Optional. default is 1 (d/m/y).

		Returns false if the entered date is invalid otherwise returns true.

	2. GetDay(dtDate, [Format])
		Argument	Data Type	Desc
		--------	---------   ----
		dtDate	:	String		String containing date
		Format	:	integer		Optional. default is 1 (d/m/y).

		Valid return values range between 1 and 31. Returns 0 if dtDate is invalid.

	3. GetMonth(dtDate, [Format])
		Argument	Data Type	Desc
		--------	---------   ----
		dtDate	:	String		String containing date
		Format	:	integer		Optional. default is 1 (d/m/y).

		Valid return values range between 1 and 12. Returns 0 if dtDate is invalid.

	4. GetYear(dtDate, [Format])
		Argument	Data Type	Desc
		--------	---------   ----
		dtDate	:	String		String containing date
		Format	:	integer		Optional. default is 1 (d/m/y).

		Returns four digit year. Returns 0 if dtDate is invalid.

	5. IsLeapYear(MyYear)
		Argument	Data Type	Desc
		--------	---------   ----
		MyYear	:	integer		year to be tested

		Returns true if MyYear is Leap year. Otherwise returns false.

	7. GetCurrentDate([Format])
		Argument	Data Type	Desc
		--------	---------   ----
		Format	:	integer		Optional. default is 1 (d/m/y).

		Returns current date in dd/MM/yyy, MM/dd/yyyy or MM/yyyy format as per the
		Format argument.

	7. GetDbDate(dtDate, [Format])
		Argument	Data Type	Desc
		--------	---------   ----
		dtDate	:	String		String containing date
		Format	:	integer		Optional. default is 1 (d/m/y).

		Returns date in dd/MMM/yyy, MMM/dd/yyyy or MMM/yyyy format. This is used
		when date is stored in database.

*/

////////////////////////////////////////////////////////////////////////////////////////////////


function IsDate(dtDate, Format)
{
	//Supported date formates (d/m/y - 1),	(m/d/y - 2),  (m/y - 3)

	var iDay, iMonth, iYear;
	
	//If no arguments are passed
	if(arguments.length == 0)
	{
		alert("No arguments passed.");
		return false;
	}
	
	//If format is not passed in argument
	if(arguments.length == 1)
	{
		//take default format as "d/m/y"
		Format = 1;
	}
	
	if(TestFormat(Format)==false)
	{
		return false;
	}

	if(dtDate == "")
	{
		return false;
	}

	//Get Day, month and year parts of date
	iDay	= GetDay(dtDate, Format);
	iMonth	= GetMonth(dtDate, Format);
	iYear	= GetYear(dtDate, Format);

	if(iYear == 0)
	{
		return false;
	}
	
	if(iMonth < 1 || iMonth > 12)
	{
		return false;
	} 	

	/*
		1	- 31
		2	- Check Leap Year for the days in month
		3	- 31
		4	- 30
		5	- 31
		6	- 30
		7	- 31
		8	- 31
		9	- 30
		10	- 31
		11	- 30
		12	- 31
	*/

	//For months which have 31 days
	if(iMonth==1 || iMonth==3 || iMonth==5 || iMonth==7 || 
	   iMonth==8 || iMonth==10 || iMonth==12)
	{
		if(iDay < 1 || iDay > 31)
		{
			return false;
		} 	
	}

	if(iMonth==4 || iMonth==6 || iMonth==9 || iMonth==11)
	{
		if(iDay < 1 || iDay > 30)
		{
			return false;
		} 	
	}
	
	//Only Leap year can have 29 days in february
	if(iMonth == 2)
	{
		if(IsLeapYear(iYear)==true)
		{
			if(iDay < 1 || iDay > 29)
			{
				return false;
			} 	
		}
		else
		{
			if(iDay < 1 || iDay > 28)
			{
				return false;
			} 	
		}
	}
	
	return true;
}

function GetDay(dtDate, Format)
{
	//Supported date formates (d/m/y - 1), (m/d/y - 2), (m/y - 3)
	var sSeperator;	
	var sDay;
	var iDay, iStart, iEnd;
	
	//If no arguments are passed
	if(arguments.length == 0)
	{
		alert("No arguments passed.");
		return 0;
	}
	
	if(arguments.length == 1)
	{
		Format = 1;
	}
	
	if(TestFormat(Format)==false)
	{
		return false;
	}

	sSeperator = GetSeperator(dtDate);

	if(Format==1)
	{
		iStart = 0;
		
		iEnd = dtDate.indexOf(sSeperator);
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
		
		sDay = dtDate.substring(iStart, iEnd);
		
		//If given day is not a number
		if(isNaN(sDay)==true)
		{
			return 0;
		}
		
		iDay = new Number(sDay);
		
		return iDay;
	}
	
	if(Format==2)
	{
		iStart = dtDate.indexOf(sSeperator);
		
		if(iStart==0)
		{
			return 0;
		}
		
		iStart++; 
		
		iEnd = dtDate.indexOf(sSeperator, iStart);
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
		
		sDay = dtDate.substring(iStart, iEnd);
		
		//If given day is not a number
		if(isNaN(sDay)==true)
		{
			return 0;
		}
		
		iDay = new Number(sDay);
		
		return iDay;
	}
	
	if(Format==3)
	{
		return 1;
	}
}

function GetMonth(dtDate, Format)
{
	//Supported date formates (d/m/y - 1), (m/d/y - 2), (m/y   - 3)
	var sSeperator;	
	var sDay;
	var iMonth, iStart, iEnd;
	
	//If no arguments are passed
	if(arguments.length == 0)
	{
		alert("No arguments passed.");
		return 0;
	}
	
	if(arguments.length == 1)
	{
		Format=1;
	}

	if(TestFormat(Format)==false)
	{
		return false;
	}

	sSeperator = GetSeperator(dtDate);

	if(Format==1)
	{
		iStart = dtDate.indexOf(sSeperator);
		
		if(iStart==0)
		{
			return 0;
		}
		
		iStart++;
		
		iEnd = dtDate.indexOf(sSeperator, iStart);
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
	}
	
	if(Format==2 || Format==3)
	{
		iStart = 0;
		
		iEnd = dtDate.indexOf(sSeperator);
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
	}

	sDay = dtDate.substring(iStart, iEnd);
		
	//If given month is a number
	if(isNaN(sDay)==false)
	{
		iMonth = new Number(sDay);
	}
	else
	{
		//Check for month name
		if(sDay.length<3)
		{
			return 0;
		}
	
		sDay = sDay.toUpperCase();
		sDay = sDay.substring(0,3);

		switch(sDay)
		{
			case "JAN": iMonth="01"; break;
			case "FEB": iMonth="02"; break;
			case "MAR": iMonth="03"; break;

			case "APR": iMonth="04"; break;
			case "MAY": iMonth="05"; break;
			case "JUN": iMonth="06"; break;

			case "JUL": iMonth="07"; break;
			case "AUG": iMonth="08"; break;
			case "SEP": iMonth="09"; break;

			case "OCT": iMonth="10"; break;
			case "NOV": iMonth="11"; break;
			case "DEC": iMonth="12"; break;
			default: return 0;
		}
	}

	return iMonth;
}

function GetMonthName(Month)
{
	var sMonth;
	
	sMonth = "";
	
	if(Month==1) sMonth = "Jan";
	
	if(Month==2) sMonth = "Feb"; 
	if(Month==3) sMonth = "Mar"; 

	if(Month==4) sMonth = "Apr"; 
	if(Month==5) sMonth = "May"; 
	if(Month==6) sMonth = "Jun"; 

	if(Month==7) sMonth = "Jul"; 
	if(Month==8) sMonth = "Aug"; 
	if(Month==9) sMonth = "Sep"; 

	if(Month==10) sMonth = "Oct";
	if(Month==11) sMonth = "Nov";
	if(Month==12) sMonth = "Dec";
	
	return sMonth;
}

function GetYear(dtDate, Format)
{
	//Supported date formates (d/m/y - 1), (m/d/y - 2), (m/y   - 3)
	var dt, year;	

	dt = new Date();			//Gets today's date right now (to the millisecond).
	year = dt.getFullYear();	//Get current year

	//Supported date formates (d/m/y - 1), (m/d/y - 2), (m/y   - 3)
	var sSeperator;
	var sDay;
	var iYear, iStart, iEnd;
	
	//If no arguments are passed
	if(arguments.length == 0)
	{
		alert("No arguments passed.");
		return 0;
	}

	if(arguments.length == 1)
	{
		Format = 1;
	}

	if(TestFormat(Format)==false)
	{
		return false;
	}

	sSeperator = GetSeperator(dtDate);

	if(Format==1 || Format==2)
	{
		//Find first slash
		iStart = dtDate.indexOf(sSeperator);
		
		if(iStart==0)
		{
			return 0;
		}
		
		//Find Second slash
		iStart++;
		
		iStart = dtDate.indexOf(sSeperator, iStart);
		
		if(iStart==0)
		{
			return 0;
		}
		
		iStart++;
		
		iEnd = dtDate.length;
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
	}
	
	if(Format==3)
	{
		//Find first slash

		iStart = dtDate.indexOf(sSeperator);

		
		if(iStart==0)
		{
			return 0;
		}
		
		iStart++;
		
		iEnd = dtDate.length;
		
		//If seperator is not found
		if(iEnd <= 0)
		{
			return 0;
		}
	}

	sDay = dtDate.substring(iStart, iEnd);
		
	//If given month is a number
	if(isNaN(sDay)==false)
	{
		//If year is not entered in yyyy format
		if(sDay.length < 4)
		{
			year = (year/1000);
			year = parseInt(year);
			year = year * 1000;
			
			iYear = new Number(sDay);
			iYear = year + iYear;
		}
		else
		{
			iYear = new Number(sDay);
		}
		
		return iYear;
	}
	else
	{
		return 0;
	}
}

function GetSeperator(dtDate)
{
	if( dtDate.indexOf('/')>=0)
	{
		return '/';
	}
	
	if( dtDate.indexOf('-')>=0)
	{
		return '-';
	}

	if( dtDate.indexOf(' ')>=0)
	{
		return ' ';
	}
	
	return ' ';
}

function IsLeapYear(MyYear)
{
	if(MyYear % 4 == 0 )
	{
		if(MyYear % 100 == 0)
		{
		    if(MyYear % 400 == 0)
		    {
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return true;
		}
	}
	else
	{
		return false;
	}
}

function GetDbDate(dtDate, Format)
{
	if(arguments.length == 0)
	{
		alert("No arguments passed.");
		return "";
	}
	
	if(arguments.length == 1)
	{
		Format = 1;
	}
	
	if(TestFormat(Format)==false)
	{
		return false;
	}

	Format = parseInt(Format);

	iDay = GetDay(dtDate, Format);
	iMon = GetMonth(dtDate, Format);
	iYear = GetYear(dtDate, Format);
	
	switch(Format)
	{
		case 1: return (iDay + "-" + GetMonthName(iMon) + "-" + iYear); break;
		case 2: return (iMon + "-" + iDay + "-" + iYear); break;
		case 3: return (GetMonthName(iMon) + "-" + iYear); break;
	}
}
	
function SetDbDate(objTextBox, Format)
{
	objTextBox.value = GetDbDate(objTextBox.value,  Format);
}

function GetCurrentDate(Format)
{
	dt = new Date();   //Gets today's date right now (to the millisecond).
	month = dt.getMonth()+1;
	day = dt.getDate();
	year = dt.getFullYear();

	if(arguments.length==0)
	{
	 	Format = 1;
	}
	
	if(TestFormat(Format)==false)
	{
		return false;
	}

	switch(Format)
	{
		case 1: return (day + '/' + month + '/' + year); break;
		case 2: return (month + '/' + day + '/' + year); break;
		case 3: return (month + '/' + year); break;
	}
}

function TestFormat(Format)
{
	if(Format>=1 && Format <= 3)
	{
		return true;
	}
	else
	{
		alert("Invalid Format. Format must be between 1 and 3.");
		return false;
	}
}

