function ConfirmDelete(Checked) {
	if (Checked) {
		return confirm("Are you sure that you want to perform a delete operation?\n\nPerforming a delete operation will initiate a cascading-delete action. All records that are associated with the record that you are deleting will also be deleted as well as the records that are associated with those records ad infinitum.\n\nAre you sure that you want to perform a delete operation?") && confirm("Because this can't be undone, are you REALLY SURE that you want to perform a delete operation?");
	}
	return true;
}

function ToggleCommentVisibility(BlockID, LinkID) {
	document.getElementById(BlockID).style.display = document.getElementById(BlockID).style.display == "block" ? "none" : "block";
	document.getElementById(LinkID).removeChild(document.getElementById(LinkID).firstChild);
	document.getElementById(LinkID).appendChild(document.createTextNode(document.getElementById(BlockID).style.display == "none" ? "Write or View" : "Hide"));
}

function ToggleArchiveVisibility(BlockID) {
	document.getElementById(BlockID).style.display = document.getElementById(BlockID).style.display == "block" ? "none" : "block";
}

function AssignSubject(ElementID) {
	if (document.getElementById(ElementID).value == "") {
		document.getElementById(ElementID).value = prompt("You did not specify a subject for this message. If you would like to provide one, please type it now.", "(no subject)");
	}
}

function AreNotEmpty(ElementIDs) {
	var FirstInvalid = null;
	for (var Index in ElementIDs) {
		var Element = document.getElementById(ElementIDs[Index]);
		if (Element.value == "") {
			if (FirstInvalid == null) {
				FirstInvalid = Element;
			}
			Element.className = "Invalid";
		}
		else {
			if (Element.className == "Invalid") {
				Element.className = "";
			}
		}
	}
	if (FirstInvalid == null) {
		return true;
	}
	else {
		alert("You have left one or more required fields empty. Please enter the appropriate data in all fields before proceeding.");
		FirstInvalid.focus();
		FirstInvalid.select();
		return false;
	}
}
function IsValidEmail(ElementID) {
	var Element = document.getElementById(ElementID);
	if (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(Element.value)) {
		if (Element.className == "Invalid") {
			Element.className = "";
		}
		return true;
	}
	else {
		Element.className = "Invalid";
		alert("The e-mail address that you entered is invalid. Please enter a vaild e-mail address before proceeding.");
		Element.focus();
		Element.select();
		return false;
	}
}
function ValidateCommentForm(FormNumber) {
	AssignSubject("Subject" + FormNumber);
	var EmptyResult = AreNotEmpty(["Name" + FormNumber, "Subject" + FormNumber, "Text" + FormNumber]);
	var ValidEmailResult = IsValidEmail("Email" + FormNumber);
	return EmptyResult && ValidEmailResult;
}
function ConvertToLowercase(Item) {
	Item.value = Item.value.toLowerCase();
}
function BeautifyText(ItemIDs) {
	for (var Index = 0; Index < ItemIDs.length; Index++) {
		var Item = document.getElementById(ItemIDs[Index]);

		Item.value = Item.value.replace(/\r/g, ""); // Strip carriage returns
		Item.value = Item.value.replace(/  +/g, " "); // Multiple spaces
		Item.value = Item.value.replace(/^ | $/gm, ""); // Beginning and trailing spaces on each line
		Item.value = Item.value.replace(/\n{3,}/g, "\n\n"); // Multiple line breaks
		Item.value = Item.value.replace(/^\n+|\n+$/g, ""); // Beginning and trailing line breaks
		Item.value = Item.value.replace(/\.{2,}/g, "…"); // Multiple periods
		Item.value = Item.value.replace(/!{2,}/g, "!"); // Multiple exclamination marks
		Item.value = Item.value.replace(/-{2,}/g, "—"); // Multiple dashes
		Item.value = Item.value.replace(/\^2\b/g, "²"); // squared
		Item.value = Item.value.replace(/\^3\b/g, "³"); // cubed
		Item.value = Item.value.replace(/\(C\)/g, "©"); // copyright
		Item.value = Item.value.replace(/\(R\)/g, "®"); // registered trademark
		Item.value = Item.value.replace(/ TM\b/g, "™"); // trademark
		Item.value = Item.value.replace(/\b1\/8\b/g, "⅛"); // one eighth
		Item.value = Item.value.replace(/\b1\/4\b/g, "¼"); // one fourth
		Item.value = Item.value.replace(/\b3\/8\b/g, "⅜"); // three eighths
		Item.value = Item.value.replace(/\b1\/2\b/g, "½"); // one half
		Item.value = Item.value.replace(/\b5\/8\b/g, "⅝"); // five eighths
		Item.value = Item.value.replace(/\b3\/4\b/g, "¾"); // three fourths
		Item.value = Item.value.replace(/\b7\/8\b/g, "⅞"); // seven eithths
		Item.value = Item.value.replace(/^\"/gm, "“"); // open quote
		Item.value = Item.value.replace(/ \"/g, " “");
		Item.value = Item.value.replace(/\"$/gm, "”"); // close quote
		Item.value = Item.value.replace(/\"([ \.,:;?!\[])/g, "”$1");
		
		var Replacements = [
			{Search: /\ba la\b/g, Replace: "à la"},							// à la
			{Search: /\bA la\b/g, Replace: "À la"},
			{Search: /\b([aA])dios\b/g, Replace: "$1diós"},						// adiós
			{Search: /\bangstr[oö]e?m(s)?\b/g, Replace: "ångström$1"},				// ångström(s)
			{Search: /\bAngstr[oö]e?m(s)?\b/g, Replace: "Ångström$1"},
			{Search: /\b([aA])nime\b/g, Replace: "$1nimé"},						// animé
			{Search: /\b([aA])peratif(s)?\b/g, Replace: "$1pératif$2"},				// apéritif(s)
			{Search: /\b([aA])ttache(s)?\b/g, Replace: "$1ttaché$2"},				// attaché(s)
			{Search: /\b([bB])ete noire\b/g, Replace: "$1ête noire"},				// bête noire
			{Search: /\b([bB])outonniere(s)?\b/g, Replace: "$1outonnière$2"},			// boutonnière(s)
			{Search: /\b([bB])r[uû]l[eé]e\b/g, Replace: "$1rûlée"},					// brûlée
			{Search: /\b([cC])achaca\b/g, Replace: "$1achaça"},					// cachaça
			{Search: /\b([c|C])afe\b/g, Replace: "$1afé"},						// café
			{Search: /\b([cC])hateau(x)?\b/g, Replace: "$1hâteau$2"},				// château(x|s)
			{Search: /\b([cC])hateaus\b/g, Replace: "$1hâteaux"},
			{Search: /\b([cC])harge d\'affaires\b/g, Replace: "$1hargé d'affaires"},		// chargé d'affaires
			{Search: /\b([cC])ause c[eé]l[eè]bre\b/g, Replace: "$1ause célèbre"},			// cause célèbre
			{Search: /\b([cC])liche(s)?\b/g, Replace: "$1liché$2"},					// cliché(s)
			{Search: /\b([cC])ommunique(s)?\b/g, Replace: "$1ommuniqué$2"},				// communiqué(s)
			{Search: /\b[cC]ote d\'[iI]voire\b/g, Replace: "Côte d'Ivoire"},			// Côte d'Ivoire
			{Search: /\b([cC])oup d\'etat\b/g, Replace: "$1oup d'état"},				// coup d'état
			{Search: /\b([cC])oup de grace\b/g, Replace: "$1oup de grâce"},				// coup de grâce
			{Search: /\b([cC])reme\b/g, Replace: "$1rème"},						// crème
			{Search: /\b([cC])repe(s)?\b/g, Replace: "$1rêpe$2"},					// crêpe(s)
			{Search: /\b[cC]uracao\b/g, Replace: "Curaçao"},					// Curaçao
			{Search: /\b([dD])ebutante(s)?\b/g, Replace: "$1ébutante$2"},				// débutante(s)
			{Search: /\b([dD])ecor\b/g, Replace: "$1écor"},						// décor
			{Search: /\b([dD])[eé]j[aà] vu\b/g, Replace: "$1éjà vu"},				// déjà vu
			{Search: /\b([dD])[eé]mod[eé]\b/g, Replace: "$1émodé"},					// démodé
			{Search: /\b([dD])enouement(s)?\b/g, Replace: "$1énouement$2"},				// dénouement(s)
			{Search: /\b([dD])iscotheque(s)?\b/g, Replace: "$1iscothèque$2"},			// discothèque(s)
			{Search: /\b([dD])oppelgae?nger(s)?\b/g, Replace: "$1oppelgänger$2"},			// doppelgänger(s)
			{Search: /\belite(s)?\b/g, Replace: "élite$1"},						// élite(s)
			{Search: /\bElite(s)?\b/g, Replace: "Élite$1"},
			{Search: /\bémigr[eé](s)?\b/g, Replace: "émigré$1"},					// émigré(s)
			{Search: /\bEmigr[eé](s)?\b/g, Replace: "Émigré$1"},
			{Search: /\b([eE])ntree(s)?\b/g, Replace: "$1ntrée$2"},					// entrée(s)
			{Search: /\bep[eé]e(s)?\b/g, Replace: "épée$1"},					// épée(s)
			{Search: /\bEp[eé]e(s)?\b/g, Replace: "Épée$1"},
			{Search: /\b([eE])xpose(s)?\b/g, Replace: "$1xposé$2"},					// exposé(s)
			{Search: /\b([fF])acade(s)?\b/g, Replace: "$1açade$2"},					// façade(s)
			{Search: /\b([fF])ete(s)?\b/g, Replace: "$1ête$2"},					// fête(s)
			{Search: /\b([fF])iance(e)?(s)?\b/g, Replace: "$1iancé$2$3"},				// fiancé(e)(s)
			{Search: /\b([fF])rappe(s)?\b/g, Replace: "$1rappé$2"},					// frappé(s)
			{Search: /\b([fF])rae?uleins?\b/g, Replace: "$1räulein"},				// fräulein
			{Search: /\b([fF])ue?hrer(s)?\b/g, Replace: "$1ührer$2"},				// führer(s)
			{Search: /\b([gG])arcon(s)?\b/g, Replace: "$1arçon$2"},					// garçon(s)
			{Search: /\b([gG])lace\b/g, Replace: "$1lacé"},						// glacé
			{Search: /\b([hH])[aá][cč]h?ek(s)?\b/g, Replace: "$1áček$2"},				// háček
			{Search: /\b([iI])ngenue\b/g, Replace: "$1ngénue"},					// ingénue
			{Search: /\b([jJ])ae?ger\b/g, Replace: "$1äger"},					// jäger
			{Search: /\b([jJ])alapeno(s)?\b/g, Replace: "$1alapeño$2"},				// jalapeño(s)
			{Search: /\b([lL])angue d\'oil\b/g, Replace: "$1angue d'oïl"},				// langue d'oïl
			{Search: /\b([mM])a[iî]tre d\'h[oô]tel\b/g, Replace: "$1aître d'hôtel"},		// maître d'hôtel
			{Search: /\b([mM])anana(s)?\b/g, Replace: "$1añana$2"},					// mañana(s)
			{Search: /\b([mM])atinee(s)?\b/g, Replace: "$1atinée$2"},				// matinée(s)
			{Search: /\b([mM])[eê]l[eé]e\b/g, Replace: "$1êlée"},					// mêlée
			{Search: /\b([mM])[eé]nage [aà] trois\b/g, Replace: "$1énage à trois"},			// ménage à trois
			{Search: /\b[mM]etis\b/g, Replace: "Métis"},						// Métis
			{Search: /\b([nN])aif\b/g, Replace: "$1aïf"},						// naïf
			{Search: /\b([nN])aive\b/g, Replace: "$1aïve"},						// naïve
			{Search: /\b([nN])aivet([eé])\b/g, Replace: "$1aïveté"},				// naïveté
			{Search: /\b([nN])e(e)?\b/g, Replace: "$1é$2"},						// né(e)
			{Search: /\b([nN])egligee?(s)?\b/g, Replace: "$1egligé$2"},				// negligé(s)
			{Search: /\b[nN]eufchatel\b/g, Replace: "Neufchâtel"},					// Neufchâtel
			{Search: /\b[nN]ez [pP]erce(s)?\b/g, Replace: "Nez Percé$1"},				// Nez Percé(s)
			{Search: /\b([nN])ina(s)?\b/g, Replace: "$1iña$2"},					// niña(s)
			{Search: /\b([nN])ino(s)?\b/g, Replace: "$1iño$2"},					// niño(s)
			{Search: /\b([nN])oel\b/g, Replace: "$1oël"},						// noël
			{Search: /\b([oO])le\b/g, Replace: "$1lé"},						// olé
			{Search: /\b([pP])apier-m[aâ]ch[eé]\b/g, Replace: "$1apier-mâché"},			// papier-mâché
			{Search: /\b([pP])asse\b/g, Replace: "$1assé"},						// passé
			{Search: /\b([pP])[aâ]t[eé]\b/g, Replace: "$1âté"},					// pâté
			{Search: /\b([pP])i[eè]ce(s)? de r[eé]sistance\b/g, Replace: "$1ièce$2 de résistance"},	// pièce(s) de résistance
			{Search: /\b([pP])ina(s)?\b/g, Replace: "$1iña$2"},					// piña(s)
			{Search: /\b([pP])inata(s)?\b/g, Replace: "$1iñata$2"},					// piñata(s)
			{Search: /\b([pP])irana(s)?\b/g, Replace: "$1iraña$2"},					// piraña(s)
			{Search: /\b([pP])rot[eé]g[eé](e)?(s)?\b/g, Replace: "$1rotégé$2$3"},			// protégé(e)(s)
			{Search: /\b([pP])uree\b/g, Replace: "$1urée"},						// purée
			{Search: /\b[qQ]u[eé]b[eé]cois\b/g, Replace: "Québécois"},				// Québécois
			{Search: /\b[qQ]uebec\b/g, Replace: "Québec"},						// Québec
			{Search: /\b([rR])aison(s)? d\'etre\b/g, Replace: "$1aison$2 d'être"},			// raison(s) d'être
			{Search: /\b([rR])[eé]sum[eé](s)?\b/g, Replace: "$1ésumé$2"},				// résumé(s)
			{Search: /\b([rR])isque\b/g, Replace: "$1isqué"},					// risqué
			{Search: /\b([rR])iviere\b/g, Replace: "$1ivière"},					// rivière
			{Search: /\b[sS][aã]o [tT]om[eé] and [pP]r[ií]ncipe\b/g, Replace: "São Tomé and Príncipe"},	// São Tomé and Príncipe
			{Search: /\b([sS])aute\b/g, Replace: "$1auté"},						// sauté
			{Search: /\b([sS])eance\b/g, Replace: "$1éance"},					// séance
			{Search: /\b([sS])enor(es)?\b/g, Replace: "$1eñor$2"},					// señor(es)
			{Search: /\b([sS])enora(s)?\b/g, Replace: "$1eñora$2"},					// señora(s)
			{Search: /\b([sS])enorita(s)?\b/g, Replace: "$1eñorita$2"},				// señorita(s)
			{Search: /\b([sS])ouffle(s)?\b/g, Replace: "$1oufflé$2"},				// soufflé(s)
			{Search: /\b([tT])ouche\b/g, Replace: "$1ouché"},					// touché
			{Search: /\buber/g, Replace: "über"},							// über-
			{Search: /\bUber/g, Replace: "Über"},
			{Search: /\b([vV])is a vis\b/g, Replace: "$1is à vis"},					// vis à vis
			{Search: /\b([vV])oila\b/g, Replace: "$1oilà"}						// voilà
		];
		for (var ReplacementIndex in Replacements) {
			Item.value = Item.value.replace(Replacements[ReplacementIndex].Search, Replacements[ReplacementIndex].Replace);
		}
	}
	
}
function IsLeapYear(Year) {
	return (Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0));
}
function GetDaysInMonth(Month, Year) {
	Month = parseInt(Month);
	Year = parseInt(Year);
	switch (Month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		case 2:
			return IsLeapYear(Year) ? 29 : 28;
	}
}
function UpdateDateDropDown(ID) {
	
	var YearItem = document.getElementById(ID + "Year");
	var MonthItem = document.getElementById(ID + "Month");
	var DayItem = document.getElementById(ID + "Day");
	
	var SelectedDay = parseInt(DayItem.value);
	
	while (DayItem.firstChild) {
		DayItem.removeChild(DayItem.firstChild);
	}
	for (var Index = 1; Index <= GetDaysInMonth(MonthItem.value, YearItem.value); Index++) {
		var Node = document.createElement("option");
		Node.setAttribute("value", Index);
		if (Index == SelectedDay) {
			Node.setAttribute("selected", "selected");
		}
		Node.appendChild(document.createTextNode(Index));
		DayItem.appendChild(Node);
	}
}

function SetEnabledState(ID) {
	var State = document.getElementById(ID + "NoDate").checked;
	document.getElementById(ID + "Year").disabled = State;
	document.getElementById(ID + "Month").disabled = State;
	document.getElementById(ID + "Day").disabled = State;
}

