function assert_operation() {
	return confirm("Are you sure that you really want to do that?") && confirm("If you delete this record, you will also be deleting associated records in other tables. Are you really sure that you want to do that?");
}

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 compress_text(Item) {
	CompressText(Item);
}
function CompressTextSwitch(Item, Disabled) {
	if (!Disabled) {
		CompressText(Item);
	}
}
function CompressText(Item) {
	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 Index in Replacements) {
		Item.value = Item.value.replace(Replacements[Index].Search, Replacements[Index].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;
}
