// PeakDates JavaScript Functions Version 1.0 - 09/16/2007
// g_rootpath, g_PeakToolsPath, g_PeakToolsImagesPath are generated by Peak to locate the application root path

// Function: PeakDate_IsDate(fld, required, minDate, maxDate)
// Description: Check for valid dates
// Parameters:  (object) fld - The field containing the date
//              (bool) required - Date entry required (optional - default=false)
//              (string) minDate - Minimum Date (optional)
//              (string) maxDate - Maximum Date (optional)
function PeakDate_IsDate(fld, required, minDate, maxDate) 
{
    var msg = "";
    var strDate = Trim(fld.value);
    if ((required==null || !required) && strDate.length==0)
        return "";
    if (required && strDate.length==0)
        msg = "Invalid date : This date field is required";
    else if (!PeakDate_ChkDateFormat(strDate))
        msg = "Invalid date format: You must enter a date in the format mm/dd/yyyy";
    else
    {
        strDate = PeakDate_FormatDate(strDate); //Convert to mm/dd/yyyy format if necessary    
        var month=parseInt(strDate.substring(0,2),10);
        var day=parseInt(strDate.substring(3,5),10);
        var year=parseInt(strDate.substring(6,10),10);
    
        if (month<1 || month>12) 
            msg = "Invalid date: An invalid month been entered";
        else if ((day<1 || day>31) || ((month==2 && day>(28+PeakDate_Leap(year)))) || ((month==4 || month==6 || month==9 || month==11) && day>30))
            msg = "Invalid date: An invalid day has been entered;"
        else if (year<1900 || year>2100)
            msg = "Invalid date: An invalid year has been entered";
    }
    //Check for minimum date
    if (msg=="" && minDate != null)
    {
        var dtDate = PeakDate_GetDate(strDate);
        var dtMin = PeakDate_GetDate(minDate);
        if (dtDate > dtMin)
            msg = "Invalid date: The date cannot be before " + minDate;
    }
    //Check for maximum date
    if (msg=="" && maxDate != null)
    {
        var dtDate = PeakDate_GetDate(strDate);
        var dtMax = PeakDate_GetDate(maxDate);
        if (dtDate > dtMax)
            msg = "Invalid date: The date cannot exceed " + maxDate;
    }
    if (msg=="")
    {
//        fld.style.backgroundColor = "";
        fld.value = strDate;
    }
    else 
    {
        PeakDate_ShowInvalidDate(fld, msg);
	    var today = new Date();
	    fld.value = PeakDate_GetShortString(today);
	    fld.focus();
    }
    return msg;
}//end function


//Highlight the field for date error
function PeakDate_ShowInvalidDate(fld, msg)
{
//    fld.style.backgroundColor = "#990000";
    alert(msg);
}

//Gets a short date string of a date object
function PeakDate_GetShortString(dtDate)
{
    var strDate = (dtDate.getMonth()+1) + "/" + dtDate.getDate() + "/" + dtDate.getUTCFullYear();
    return PeakDate_FormatDate(strDate);
}

function PeakDate_ChkDateFormat(strDate)
{
   // This function checks if the text entered in a field 
   // has the format MM/DD/YYYY. 
   // Only the format is checked, not the date itself.
   // ^ indicates start of expression
   // \d{1,2} - the \d means digits and {1,2} means 1 or 2 digits
   // $ indicates end of expression
   var date_regex = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/;
   return date_regex.test(strDate);
}

//Check for leap year
function PeakDate_Leap(year)
{
   if (year % 400 == 0) return 1;
   else if (year % 100 == 0) return 0;
   else if (year % 4 == 0) return 1;
   else return 0;
}

//AllTrim of a string
function Trim(str)
{
   if (str==null)   return "";
   for (var start=0; str.charAt(start)==" "; start++);
   if (start == str.length) return "";
   for (var end=str.length-1; str.charAt(end)==" "; end--);
   return str.substring(start,end+1);
}

//Takes a string in mm/dd/yyyy format and converts to Date object
function PeakDate_GetDate(strDate) 
{
   var str = PeakDate_FormatDate(strDate);
   var month = parseInt(str.substr(0,2));
   var day = parseInt(str.substr(3,2));
   var year = parseInt(str.substr(6,4));
   var dtDate = new Date(year, month, day);
   return dtDate;
}//end function

//Formats the string date into mm/dd/yyyy format string format
function PeakDate_FormatDate(strDate) 
{
   var str = Trim(strDate);
   if (str.substring(2,3)!="/")
      str = "0"+str;
   if (str.substring(5,6)!="/")
     str = str.substring(0,3)+"0"+str.substring(3);
   if (str.length < 10)
     str = str.substring(0,6)+"20"+str.substring(6);
   return str;
}//end function

// Function: PeakDate_GetCalendar(fld, callfunc, minDate, maxDate)
// Description: Calls the PeakCalendar with an update field and calling function
// Parameters:  (object) fld - The field containing the date
//              (string) callfunc - The calling function called after date selection (optional - default=null)
//              (string) minDate - Minimum Date (optional)
//              (string) maxDate - Maximum Date (optional)
function PeakDate_GetCalendar(fld, callfunc, minDate, maxDate)
{	
	var str = g_PeakToolsPath + "PeakCalendar.aspx?fld=" + fld.id + "&seldate=" + fld.value;
	if (callfunc != null && callfunc.length>0)
		str += "&callfunc=" + callfunc;
	if (minDate != null && minDate.length>0)
		str += "&min=" + minDate;
	if (maxDate != null && maxDate.length>0)
		str += "&max=" + maxDate;
	window.open(str, 'PeakCalendar','height=250,width=200,left=300,top=300');
}

function PeakDate_CheckBlockDate(strDate)
{
	var dtDate = new Date(strDate);
	var dow = dtDate.getDay();
	//Check for weekend or blocked date
	if (dow==0 || dow==6 || PeakDate_SearchBlockDays(strDate))
		return true;
	return false;
}

//Check for weekends and blocked days
function PeakDate_GetBlockDays(dtStart, dtEnd, flg)
{
	var dow;
	var cnt = 0;
	var dtDate = new Date(dtStart);
	while(dtEnd >= dtDate)
	{		
		if (PeakDate_CheckBlockDate(dtDate))
		{
			cnt++;
			if (flg)
				dtEnd = PeakDate_AddDate1(dtEnd, 1);
		}
		dtDate = PeakDate_AddDate1(dtDate, 1);
	}
	return cnt;
}

function PeakDate_SearchBlockDays(strDate)
{
	var dtDate = Date.parse(strDate);
	for (var cnt=0; cnt<blockDates.length; cnt++)
		if (Date.parse(blockDates[cnt])==dtDate)
			return true;
	return false;
}

//Return String type
function PeakDate_AddDate(strDate, numDays)
{
	var dtDate = new Date(strDate);
	dtDate.setMilliseconds(numDays*86400000);
	var strDate = (dtDate.getMonth()+1)+"/"+dtDate.getDate()+"/"+dtDate.getYear();
	return strDate;		
}

//Return Date type
function PeakDate_AddDate1(strDate, numDays)
{
	var dtDate = new Date(strDate);
	dtDate.setMilliseconds(numDays*86400000);
	return dtDate;		
}


//Select Start calendar function
function SelStartDateCalendar()
{
	getCalendar(form.StartDate, "updateStartDate(opener.form.StartDate, opener.form.EndDate, opener.form.Duration)");
}

//Select End calendar function
function SelEndDateCalendar()
{
	getCalendar(form.EndDate, "updateEndDate(opener.form.StartDate, opener.form.EndDate, opener.form.Duration)");
}


function updateWork(start, end, dur, work)
{	
	if (dur.value < 1)
		dur.value = 1;
	if (work.value <= 0)
		work.value = hrsPerDay;
	var intWork = work.value;
	var intDur = Math.floor(intWork/hrsPerDay) + (intWork%hrsPerDay>0 ? 1 : 0) - 1;		
	if (intDur>dur.value)
	{	
		var strStart = start.value;
		var dtStart = new Date(strStart);
		var dtEnd   = new Date(PeakDate_AddDate(strStart, intDur));
		var intCnt = PeakDate_GetBlockDays(dtStart, dtEnd, true);
		//Update the form fields
		dur.value = intDur+1;
		end.value = PeakDate_AddDate(dtStart, intCnt+intDur);		
	}
} 

function updateDuration(start, end, dur, work)
{	
//	alert("got to UpdateDuration");
	if (PeakDate_IsDate(start)!="")
		return;
	var intDur = dur.value;
	if (intDur < 1)
		intDur = 1;
	var intWrk = work.value;
	if (intWrk <= 0)
		intWrk = hrsPerDay;
	if ((intWrk/hrsPerDay)>intDur)
		intDur = parseInt(intWrk/hrsPerDay);
	intDur--;
	var strStart = start.value;
	var dtStart = new Date(strStart);
	var dtEnd   = new Date(PeakDate_AddDate(strStart, intDur));
	var intCnt = PeakDate_GetBlockDays(dtStart, dtEnd, true);
	end.value = PeakDate_AddDate(dtStart, intCnt+intDur);		
	dur.value = intDur + 1;
} 

function updateStartDate(start, end, dur)
{	
//	alert("got to UpdateStartDate");
	if (PeakDate_IsDate(start)!="")
		return;
	//Check to make sure the start date is not a block date
	var strStart = start.value;
	while (PeakDate_CheckBlockDate(strStart))
		strStart = PeakDate_AddDate(strStart,1);
	if (strStart != start.value)
		start.value = DateTime.parse(strStart);
	//Check the value of the Duration and decrement by 1
	var intDur = dur.value;
	if (intDur < 1)
		intDur = 1;
	intDur--;
	//Calculate the end date based on start and duration
	var dtStart = new Date(strStart);
	var dtEnd   = new Date(PeakDate_AddDate(strStart, intDur));
	var intCnt = PeakDate_GetBlockDays(dtStart, dtEnd, true);
	end.value = PeakDate_AddDate(dtStart, intCnt+intDur);		
} 

function updateEndDate(start, end, dur)
{	
//	alert("got to UpdateEndDate");
	if (PeakDate_IsDate(end)!="")
		return;
	//Check to make sure the end date is not a block date
	var strEnd = end.value;
	while (PeakDate_CheckBlockDate(strEnd))
		strEnd = PeakDate_AddDate(strEnd,1);
	if (strEnd != end.value)
		end.value = strEnd;
	//Check to see that the end date is greater that the start date
	var strStart = start.value;
	var intDiff = Date.parse(strEnd) - Date.parse(strStart);
	if (intDiff < 0)
	{
		alert("Cannot enter an End Date that is prior to the Start Date!");
		dur.value = 1;
		end.value =	strStartDate;
		end.focus();		
	}
	else
	{
		//Calcuate the duration
		var dtStartDate = new Date(strStart);
		var dtEndDate = new Date(strEnd);
		intDur = Math.floor(intDiff/86400000)+1;
		var intBlockDays = PeakDate_GetBlockDays(dtStartDate, dtEndDate, false);
		dur.value = intDur - intBlockDays;
	}

//	if (dur.value < 1)
//		dur.value = 1;
//	var dtStartDate = new Date(strStartDate);
//	var dtEndDate = new Date(strEndDate);
//	if (intDiff >= 0)
//	{
//		while (PeakDate_CheckBlockDate(strEndDate))
//			strEndDate = PeakDate_AddDate(strEndDate,1);
//		if (strEndDate != end.value)
//		{
//			end.value = strEndDate;
//			dtEndDate = Date(strEndDate);
//			intDiff = Date.parse(strEndDate) - Date.parse(strStartDate);
//		}
//		intDur = Math.floor(intDiff/86400000)+1;
//		var intBlockDays = PeakDate_GetBlockDays(dtStartDate, dtEndDate, false);
//		intDur -= intBlockDays;
//		dur.value = intDur;
//	}		
//	else
//	{
//		alert("Cannot enter an End Date that is prior to the Start Date!");
//		dur.value = 1;
//		end.value =	strStartDate;
//		end.focus();		
//	}
}
