
var monthAbbr = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Nov", "Dec" ];

function schedule(index, minMonthsAway, minAdditionalDaysAway)
{
	var now = new Date();
	var target = offsetUTCDays(offsetUTCMonths(now, minMonthsAway), minAdditionalDaysAway);
	if (target.getUTCDate() > 1)
	{
		target.setUTCDate(1);
		target.setUTCMonth(target.getUTCMonth() + 1);
	}
	if (target.getUTCMonth() % 2 == 1)
		target.setUTCMonth(target.getUTCMonth() + 1);
	var targetMonth = target.getUTCMonth();

	var table_title = document.getElementById("table_title_" + index);
	var issue = monthAbbr[targetMonth] + '-' + monthAbbr[targetMonth + 1] + ", " + target.getUTCFullYear();
	table_title.innerHTML = issue;

	setOffset("theme_choice", index, target, -65);
	setOffset("theme_advertised", index, target, -58);
	setOffset("cover_concepts_sent", index, target, -58);
	setOffset("cover_concept_response", index, target, -51);
	setOffset("cover_design_to_me", index, target, -44);
	setOffset("cover_design_response", index, target, -37);
	setOffset("print_ready_cover_to_ed", index, target, -30);
	setOffset("attribution_info_to_me", index, target, -51);
	setOffset("art_and_story_deadline", index, target, -51);
	setOffset("contribution_info_to_ed", index, target, -44);
	setOffset("contribution_info_saved", index, target, -7);
	setOffset("editing_editorial_and_assembly", index, target, -44);
	setOffset("sent_to_proofreaders", index, target, -44);
	setOffset("feedback_from_proofreaders", index, target, -37);
	setOffset("print_ready_inner_pages_sent", index, target, -23);
	setOffset("publication_info_to_ed", index, target, -23);
	setOffset("publication_info_saved", index, target, -7);
	setOffset("print_and_mail_receipt_confirmed", index, target, -2);
	setOffset("presorted_first_class_mailing", index, target, -7);
	setOffset("domestic_delivery_expected", index, target, 0);
}

function setOffset(baseName, index, target, days)
{
	var el = document.getElementById(baseName + "_" + index);
	el.innerHTML = offsetUTCDays(target, days).toLocaleDateString();
}

function offsetUTCDays(date, days)
{
	// this doesn't always handle leap seconds
	var time = date.getTime();
	return new Date(time + days * 24 * 60 * 60 * 1000);
}

function offsetUTCMonths(date, months)
{
	var result = new Date(date);
	if (months == 0)
		return result;

	var month = result.getUTCMonth() + months;

	result.setUTCMonth(month >= 0
			? month % 12
			: 11 - (11 - month) % 12);
	
	if (month >= 12)
		result.setUTCFullYear(date.getUTCFullYear() + month / 12);
	else if (month < 0)
		result.setUTCFullYear(date.getUTCFullYear() + (month - 11) / 12);

	return result;
}
