function formatDate(date, dateFormatPattern){ 
	var date = new Date(date) ;
	var day = '' ;
	//For US, the date formatPattern is M/d/yy. Hence while formatting 
	//donot prefix with 0 when the date/month value is < 10
	var counter = countChar('d',dateFormatPattern) ;
	if(counter > 1){
		 day = prefixWithZero(date.getDate()); 
	}else{
		day = date.getDate(); 
	}
	
	var month = '' ;
	counter = countChar('m',dateFormatPattern) ;
	if(counter > 1){
		 month = prefixWithZero(date.getMonth()+1); 
	}else{
		month = date.getMonth()+1; 
	}

	var yearLong         = date.getFullYear() ; 
	var yearShort        = date.getFullYear().toString().substring(2); 
	var year             = (dateFormatPattern.indexOf("yyyy")>-1?yearLong:yearShort) ;
	return dateFormatPattern.replace(/d{1,2}/g, day).replace(/m{1,2}/g, month).replace(/y{1,4}/g, year) 
} 

function countChar(characterToCount,value){
	var counter = 0;
	var charArray = value.toLowerCase().split('');
	for (i=0;i<charArray.length;i++)
	{
		if (charArray[i] == characterToCount)
		{
			counter++;
		}
	}
	return counter ;
}

function prefixWithZero(number){ 
	return ((number < 10) ? "0" : "") + number ;
}

function isDateValid(date, dateFormatPattern) {

	if(!isDateInFormat(date,dateFormatPattern)){
		return false ;
	}
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;

	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;

	var mm = dateArr[1] ;
	var yy = dateArr[0]

	var newDate = new Date(yy, mm-1, dd);
	if (dd != newDate.getDate()) { 
		return false; 
	}
	if (mm-1 != newDate.getMonth()) { 
		return false; 
	}

	return true;
}

function dateInMMDDYYFormat(date, dateFormatPattern){
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	return dateArr[1]+"/"+dateArr[2]+"/"+dateArr[0] ;
}

function getCommaDelimitedDate(date, dateFormatPattern) {
	var parts = date.split(getDateSeperator(dateFormatPattern)); // Split into 3 parts based on what the divider was
	var format = getFormatForValidation(dateFormatPattern) ;
	//Check to see if the 3 parts end up making a valid date
	var mm ;
	var dd ;
	var yy ;
	if (format.substring(0, 1) == "m") {
		mm = parts[0]; 
	}else if (format.substring(1, 2) == "m") {
		mm = parts[1]; 
	} else { 
		mm = parts[2]; 
	}

	if (format.substring(0, 1) == "d") { 
		dd = parts[0]; 
	}else if (format.substring(1, 2) == "d") {
		dd = parts[1]; 
	}else { 
		dd = parts[2]; 
	}
	if (format.substring(0, 1) == "y") { 
		yy = parts[0]; 
	}else if (format.substring(1, 2) == "y") {
		yy = parts[1]; 
	} else { 
		yy = parts[2]; 
	}

	if (yy.length == 2) { 
		var year = new Date().getFullYear().toString();
		yy = year.substring(0,2) +yy ;
	}
	return yy+","+mm+","+dd ;
}

function isDateInFormat(date,dateFormatPattern){
	if((date == null || date == "") || (dateFormatPattern == null || dateFormatPattern == "") ){
		return null ;
	}
	//Get the date seperator in the dateFormatPattern and check if the supplied date has the same seperator.
	//return false if the seperators are different.
	var seperator = getDateSeperator(dateFormatPattern) ; 
	if(date.indexOf(seperator) == -1){
		return false;
	}

	var format = getFormatForValidation(dateFormatPattern) ;
	if (format.substring(0, 1) == "y") { // If the year is first
		var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
		var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	} else if (format.substring(1, 2) == "y") { // If the year is second
		var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
		var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
	} else { // The year must be third
		var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
		var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	}

	// If it doesn't conform to the right dateFormatPattern (with either a 2 digit year or 4 digit year), fail
	if ( (reg1.test(date) == false) && (reg2.test(date) == false) ) {
		return false; 
	}
	return true ;
}

function getFormatForValidation(dateFormatPattern){
	if(dateFormatPattern.substring(0, 1) == "d" ){
		dateFormatPattern = "dmy" ;
	}else if(dateFormatPattern.substring(0, 1) == "m"){
		dateFormatPattern = "mdy" ;
	}else{
		dateFormatPattern = "ymd" ; 
	}
	return dateFormatPattern ;
}

function isDateLessThanCurrentDate(date,dateFormatPattern){
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);

	if(date < new Date()){
		return true;
	}
	return false ;
}

function isDateEqualsCurrentDate(date,dateFormatPattern){
	var date = getDate(date,dateFormatPattern) ;
	var currentDate = new Date();
	var yy = currentDate.getFullYear() ;
	var mm = currentDate.getMonth()+1 ;
	var dd = currentDate.getDate() ;
	var finalDate = mm+"/"+dd+"/"+yy ;

	currentDate = getDate(finalDate,dateFormatPattern) ;
	if(date.toString() == currentDate.toString()){
		return true;
	}

	return false ;
}


function isDateLessThanDate1(date,date1,dateFormatPattern){

	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);

	commaDelimitedDate = getCommaDelimitedDate(date1,dateFormatPattern) ;
	dateArr = commaDelimitedDate.split(",") ;
	dd = dateArr[2] ;
	mm = dateArr[1] ;
	yy = dateArr[0]
	date1 = new Date(yy, mm-1, dd);

	if(date  < date1){
		return true;
	}
	return false ;
}

function isDateLessThanOrEqualToDate1(date,date1,dateFormatPattern){
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);

	commaDelimitedDate = getCommaDelimitedDate(date1,dateFormatPattern) ;
	dateArr = commaDelimitedDate.split(",") ;
	dd = dateArr[2] ;
	mm = dateArr[1] ;
	yy = dateArr[0]
	date1 = new Date(yy, mm-1, dd);

	if(date  <= date1){
		return true;
	}
	return false ;
}

function isDateGreaterThanDate1(date,date1,dateFormatPattern){

	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);
	
	commaDelimitedDate = getCommaDelimitedDate(date1,dateFormatPattern) ;
	dateArr = commaDelimitedDate.split(",") ;
	dd = dateArr[2] ;
	mm = dateArr[1] ;
	yy = dateArr[0]

	date1 = new Date(yy, mm-1, dd);
	if(date > date1){
		return true;
	}


	return false ;
}

function isDateEqualsDate1(date,date1,dateFormatPattern){
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);
	
	commaDelimitedDate = getCommaDelimitedDate(date1,dateFormatPattern) ;
	dateArr = commaDelimitedDate.split(",") ;
	dd = dateArr[2] ;
	mm = dateArr[1] ;
	yy = dateArr[0]
	date1 = new Date(yy, mm-1, dd);
	if(date.toString() == date1.toString()){
		return true;
	}
	return false ;
}

function getDateSeperator(dateFormatPattern){
	var seperator = "" ;

	if(dateFormatPattern.indexOf("/") != -1){
		seperator = "/" ;
	}else if(dateFormatPattern.indexOf("-") != -1){
		seperator = "-" ;
	}else if(dateFormatPattern.indexOf(".") != -1){
		seperator = "." ;
	}
	return seperator ;
}

//input date is in mm/dd/yy format
function getDateDay(date){
	var dateArr = date.split("/") ;
	var dd = dateArr[1] ;
	if (dd.substring(0, 1) == "0")
	{
		dd = dd.substring(1);
	}
	return dd;
}

//input date is mm/dd/yy format, return mm/yyyy format
function getDateMonth(date){
	var dateArr = date.split("/") ;
	var date = new Date(date) ;
	var month = date.getMonth()+1; 
	var yearLong = prefixWithZero(date.getFullYear()); 
	
	return month+"/"+yearLong;
}

function datePlusOne(date,dateFormatPattern){
	var dateObj = new Date(date) ;
	dateObj.setDate(dateObj.getDate()+1) ;

	var datePlusOne = (dateObj.getMonth() + 1) + '/' + dateObj.getDate() + '/' + dateObj.getFullYear();
	return formatDate(datePlusOne,dateFormatPattern) ;
}

function getDate(date,dateFormatPattern){
	var commaDelimitedDate = getCommaDelimitedDate(date,dateFormatPattern) ;
	var dateArr = commaDelimitedDate.split(",") ;
	var dd = dateArr[2] ;
	var mm = dateArr[1] ;
	var yy = dateArr[0]
	date = new Date(yy, mm-1, dd);

	return date ;

}
