﻿// JavaScript functions for general user controls.

/* DateField.ascx */
function dateField_allDay_onClick(prefix)
{
	var field = document.getElementById(prefix + "_AllDayI");
	if (field)
	{
		var timeFields = document.getElementById(prefix + "_TimeFields");
		timeFields.style.visibility = field.checked ? "hidden" : "visible";
	}
}

function dateField_getDate(prefix)
{
	return document.getElementById(prefix + "_Date").value;
}

function dateField_onChange(field,warnIfDateInPast)
{
	var value = field.value;
	
	//converts dates in these incomplete formats: mmdd[yy|yyyy], [m]m/[d]d[/yy|yyyy], [m]m.[d]d[.yy|yyyy]
	var re = new RegExp("^([0-9]{4}|[0-9]{6}|[0-9]{8}|[0-1]?[0-9]\/[0-3]?[0-9](\/[0-9]{2}|[0-9]{4})?|[0-1]?[0-9]\.[0-3]?[0-9](\.[0-9]{2}|[0-9]{4})?)$", "");
		
	//get matches
	var parts = re.exec(value);
	if (parts)
	{
		var whole = parts[0];
		var m, d, y;
		y = new Date().getFullYear();
		
		if (whole.indexOf("/") > -1)
		{
			subParts = whole.split("/");
			m = parseInt(subParts[0],10);
			d = parseInt(subParts[1],10);
			if (subParts.length == 3)
				y = parseInt(subParts[2],10);
		}
		else if (whole.indexOf(".") > -1)
		{
			subParts = whole.split(".");
			m = parseInt(subParts[0],10);
			d = parseInt(subParts[1],10);
			if (subParts.length == 3)
				y = parseInt(subParts[2],10);
		}
		else
		{
			m = parseInt(whole.substring(0,2),10);
			d = parseInt(whole.substring(2,4),10);
			
			if (whole.length == 6)
			{
				y = parseInt(whole.substring(4,6),10);
				
			}
			else if (whole.length == 8)
				y = parseInt(whole.substring(4,8),10);
		}
		
		//correct year
		if (y < 20) 
			y += 2000;
		else if (y < 100)
			y += 1900;
		
		//check values (TODO: should check days in month)
		if (1 <= m && m <= 12)
			if (1 <= d && d <= 31)
				field.value = m + "/" + d + "/" + y;
	}
	
	//verify date not in past
	if (warnIfDateInPast)
		dateField_validateDateInPast(field);
}

function dateField_time_onSelect(prefix, time)
{
	var timeField = document.getElementById(prefix + "_Time");
	timeField.value = time;
	breakoutSelector_hide(prefix + "_TimeSelector");
}

function dateField_setDate(prefix, value)
{
	document.getElementById(prefix + "_Date").value = value;
}

function dateField_validateDateInPast(field)
{
	var value = field.value;
	var dt = Date.parse(value);
	if (dt < new Date())
		alert("You have selected a date in the past.");
}

function dateField_validatorsEnable(prefix,enable)
{
	ValidatorEnable(document.getElementById(prefix + "_DateReqValidator"),enable);
	ValidatorEnable(document.getElementById(prefix + "_DateValidator"),enable);
}

/* DateRangeFields.ascx */
function dateRangeFields_allDay_onClick(prefix)
{
	//update Date2 fields
	var field = document.getElementById(prefix + "_Date1_AllDayI");
	if (field)
	{
		var timeFields = document.getElementById(prefix + "_Date2_TimeFields");
		timeFields.style.visibility = field.checked ? "hidden" : "visible";		
	}	
}

function dateRangeFields_startDate_onChange(prefix)
{
	var startDate = dateField_getDate(prefix + "_Date1");
	dateField_setDate(prefix + "_Date2",startDate);	
}

/* DateRangeSelector.ascx */
function dateRangeSelector_date_onChange(prefix)
{
	var field = document.getElementById(prefix + "_NamedRanges");
	field.value = "Custom";
}

function dateRangeSelector_getDaysInMonth(month,year)
{
	switch (month)
	{
		case 1: return 31;
		case 2:
			if (isLeapYear(year))
				return 29;
			else
				return 28;
		case 3: return 31;
		case 4: return 30;
		case 5: return 31;
		case 6: return 30;
		case 7: return 31;
		case 8: return 31;
		case 9: return 30;
		case 10: return 31;
		case 11: return 30;
		case 12: return 31;
	}
}

function dateRangeSelector_namedRange_onChange(field,dateFieldID1,dateFieldID2)
{
	var dateField1 = document.getElementById(dateFieldID1);
	var dateField2 = document.getElementById(dateFieldID2);
	var d1, d2, prevD1, prevD2;
	var dt = new Date();
	var msDay = 86400000;
	var resetField = false;

	if (dateField1.value.length > 0)
	{
		try {prevD1 = new Date(dateField1.value);} catch (ex) {prevD1 = new Date();}
	}
	else
		prevD1 = new Date();

	if (dateField2.value.length > 0)
	{
		try {prevD2 = new Date(dateField2.value);} catch (ex) {prevD2 = new Date();}
	}
	else
		prevD2 = new Date();	
	
	switch(field.value)
	{
		case "Custom":
			d1 = prevD1;
			d2 = prevD2;
			break;
		case "Today":
			d1 = dt;
			d2 = dt;
			break;
		case "Yesterday":
			d1 = new Date(dt.getTime() - msDay);
			d2 = new Date(dt.getTime() - msDay);
			break;
		case "ThisWeek":
			d1 = new Date(dt.getTime() - (msDay * dt.getDay()));
			d2 = new Date(d1.getTime() + (msDay * 6));
			break;
		case "ThisMonth":
			d1 = new Date(dt.getFullYear(), dt.getMonth(), 1);
			d2 = new Date(dt.getFullYear(), dt.getMonth(), dateRangeSelector_getDaysInMonth(dt.getMonth() + 1, dt.getFullYear()));
			break;
		case "ThisYear":
			d1 = new Date(dt.getFullYear(), 0, 1);
			d2 = new Date(dt.getFullYear(), 11, 31);
			break;
		case "NextDay":
			d1 = new Date(prevD1.getTime() + msDay);
			d2 = new Date(d1.getTime());
			resetField = true;
			break;
		case "NextWeek":
			d1 = new Date(prevD1.getTime() + (msDay * 7) - (msDay * prevD1.getDay()));
			d2 = new Date(d1.getTime() + (msDay * 6));
			resetField = true;
			break;
		case "NextMonth":
			d1 = new Date(prevD1.getFullYear() + (prevD1.getMonth() == 11 ? 1 : 0), (prevD1.getMonth() + 1) % 12, 1);
			d2 = new Date(d1.getFullYear(), d1.getMonth(), dateRangeSelector_getDaysInMonth(d1.getMonth() + 1, d1.getFullYear()));
			resetField = true;
			break;
		case "Next30Days":
			d1 = dt
			d2 = new Date(d1.getTime() + (msDay * 30));
			break;
		case "NextYear":
			d1 = new Date(prevD1.getFullYear() + 1, 0, 1);
			d2 = new Date(prevD1.getFullYear() + 1, 11, 31);
			resetField = true;
			break;
		case "PreviousDay":
			d1 = new Date(prevD1.getTime() - msDay);
			d2 = new Date(d1.getTime());
			resetField = true;
			break;
		case "PreviousWeek":
			d1 = new Date(prevD1.getTime() - (msDay * prevD1.getDay()) - (msDay * 7));
			d2 = new Date(d1.getTime() + (msDay * 6));
			resetField = true;
			break;
		case "PreviousMonth":
			d1 = new Date(prevD1.getFullYear() - (prevD1.getMonth() == 0 ? 1 : 0), (prevD1.getMonth() == 0 ? 11 : prevD1.getMonth() - 1), 1);
			d2 = new Date(d1.getFullYear(), d1.getMonth(), dateRangeSelector_getDaysInMonth(d1.getMonth() + 1, d1.getFullYear()));
			resetField = true;
			break;
		case "PreviousYear":
			d1 = new Date(prevD1.getFullYear() - 1, 0, 1);
			d2 = new Date(d1.getFullYear(), 11, 31);
			resetField = true;
			break;
	}

	//set date values in fields
	if (d1)
		dateField1.value = (d1.getMonth() + 1) + '/' + d1.getDate() + '/' + d1.getFullYear();
	else if (field.value == "All")
		dateField1.value = "";
	if (d2)
		dateField2.value = (d2.getMonth() + 1) + '/' + d2.getDate() + '/' + d2.getFullYear();
	else if (field.value == "All")
		dateField2.value = "";

	if (resetField)
		field.selectedIndex = 0;
}

/* DayOfWeekField.ascx */
function dayOfWeekField_setFromDateString(prefix,dtValue)
{
	var dt = new Date(dtValue);
	document.getElementById(prefix + "_DayOfWeek").value = dt.getDay();
}

/* HoursMinutesFields.ascx */
function hoursMinutesFields_onValidate(sender,args)
{
	var prefix = sender.id.substring(0, sender.id.lastIndexOf("_"));
	var hoursField = document.getElementById(prefix + "_Hours");
	var minutesField = document.getElementById(prefix + "_Minutes");
	
	if (hoursField && minutesField)
	{
		var hours = parseInt(hoursField.value);
		var minutes = parseInt(minutesField.value);
		args.IsValid = (hours > 0 || minutes > 0);
	}
}

function hoursMinutesFields_validatorsEnable(prefix,enable)
{
	ValidatorEnable(document.getElementById(prefix + "_ReqVal"),enable);
}

/* RecurrenceFields.ascx */
function recurrenceFields_onLoad(prefix)
{
	recurrenceFields_frequency_onChange(prefix);	
}

function recurrenceFields_frequency_onChange(prefix)
{
	var fields = document.getElementById(prefix);
	if (fields)
	{
		var isDaily = document.getElementById(prefix + "_Daily").checked;
		var isWeekly = document.getElementById(prefix + "_Weekly").checked;
		var isMonthly = document.getElementById(prefix + "_Monthly").checked;
		var isYearly = document.getElementById(prefix + "_Yearly").checked;
		
		//set visibility of fields
		document.getElementById(prefix + "_DailyFields").style.display = isDaily ? "block" : "none";
		document.getElementById(prefix + "_WeeklyFields").style.display = isWeekly ? "block" : "none";
		document.getElementById(prefix + "_MonthlyFields").style.display = isMonthly ? "block" : "none";
		document.getElementById(prefix + "_YearlyFields").style.display = isYearly ? "block" : "none";
	}
}

function recurrenceFields_toggleVisibility(prefix, show)
{
	var fields = document.getElementById(prefix);
	if (fields)
	{
		fields.style.display = show ? "block" : "none";
		
		//enable/disable validators
		ValidatorEnable(document.getElementById(prefix + "_DailyCountVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_WeeklyCountVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_MonthlyDayNumberVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_MonthlyDayNumberReqVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_MonthlyCountVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_MonthlyCount2Val"),show);
		ValidatorEnable(document.getElementById(prefix + "_YearlyDayNumberVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_YearlyDayNumberRegExVal"),show);
		ValidatorEnable(document.getElementById(prefix + "_EndAfterCountVal"),show);
		//dateField_validatorsEnable(prefix + "_StartDate",show);
		//dateField_validatorsEnable(prefix + "_EndByDate",show);
		dateField_validatorsEnable(prefix + "_StartDate",false);
		dateField_validatorsEnable(prefix + "_EndByDate",false);
	}
}

function recurrenceFields_setStartDate(prefix, value)
{
	dateField_setDate(prefix + "_StartDate", value);
}