// NYSIISEncode computes a surname's NYSIIS code.
function NYSIISModified()
{
	surname = document.source.input.value.toUpperCase();

	// ignore input strings with digits in it
	if(/\d/.test(surname)) {
		document.encodedModified.output.value = "No numerics allowed!";
		return;
	}

	// trim whitespace from right of string
	surname = surname.replace(/\s+$/, "");
	
	// remove "JR", "SR", or Roman Numerals from the end of the name
	// (where "Roman Numerals" can be a malformed run of 'I' and 'V' chars)
	if((suffix = /\s+[JS]R$/.exec(surname)) != null || (suffix = /\s+[VI]+$/.exec(surname)) != null)
		surname = surname.substr(0, surname.length - suffix[0].length);

	// remove all non-alpha characters
	surname = surname.replace(/[^A-Z]+/g, "");

	// BEGIN ALGORITHM *******************************************
	// Save first char for later
	// (if first char is a vowel, it is used as first char of code)
	// if the first character of the surname is a vowel, remember it
	if(/^[AEIOU]/.test(surname)) {
		document.modified01.output.value = surname.charAt(0);
	}

	// remove all 'S' and 'Z' chars from the end of the surname
	if(/[SZ]+$/.test(surname)) {
		surname = surname.replace(/[SZ]+$/, "");
		if(surname.length == 0)
			surname = "S";
	}
	document.modified02.output.value = surname;

	// change initial MAC to MC and initial PF to F
	if(/^MAC/.test(surname))
		surname = surname.replace(/^MAC/, "MC");
	else if(/^PF/.test(surname))
		surname = surname.replace(/^PF/, "F");
	document.modified03.output.value = surname;

	// Change two-character suffix as follows,
	//	                IX -> IC
	//	                EX -> EC
	//	        YE, EE, IE -> Y
	//	DT, RT, RD, NT, ND -> D
	if(/IX$/.test(surname))
		surname = surname.replace(/IX$/, "IC");
	else if(/EX$/.test(surname))
		surname = surname.replace(/EX$/, "EC");
	else if(/YE$|EE$|IE$/.test(surname))
		surname = surname.replace(/YE$|EE$|IE$/, "Y");
	else while(/DT$|RT$|RD$|NT$|ND$/.test(surname)) {
		surname = surname.replace(/DT$|RT$|RD$|NT$|ND$/, "D");
	}
	document.modified04.output.value = surname;

	// Change 'EV' to 'EF' if not at start of name
	if(/^EV/.test(surname))
		surname = "EV" + surname.substring(2).replace(/EV/g, "EF");
	else
		surname = surname.replace(/EV/g, "EF");
	document.modified05.output.value = surname;

	// Save first char for later
	// (if first char is a vowel, it is used as first char of code)
	firstChar = surname.charAt(0);
	document.modified06.output.value = firstChar;

	// Remove any 'W' that follows a vowel
	surname = surname.replace(/([AEIOU])W/g, "A");
	document.modified07.output.value = surname;

	// Replace all vowels with 'A' and collapse all strings of 'A' to one 'A'
	surname = surname.replace(/[AEIOU]+/g, "A");
	document.modified08.output.value = surname;

	// Change 'GHT' to 'GT'
	surname = surname.replace(/GHT/g, "GT");
	document.modified09.output.value = surname;

	// Change 'DG' to 'G'
	surname = surname.replace(/DG/g, "G");
	document.modified10.output.value = surname;

	// Change 'PH' to 'F'
	surname = surname.replace(/PH/g, "F");
	document.modified11.output.value = surname;

	// If not first character, eliminate all 'H' preceded or followed by a vowel
	if(/^H/.test(surname))
		surname = "H" + surname.substring(1).replace(/AH|HA/g, "A");
	else
		surname = surname.replace(/AH|HA/g, "A");
	document.modified12.output.value = surname;

	// Change 'KN' to 'N', else 'K' to 'C'
	surname = surname.replace(/KN/g, "N");
	surname = surname.replace(/K/g, "C");
	document.modified13.output.value = surname;

	// If not first character, change 'M' to 'N'
	if(/^M/.test(surname))
		surname = "M" + surname.substring(1).replace(/M/g, "N");
	else
		surname = surname.replace(/M/g, "N");
	document.modified14.output.value = surname;

	// If not first character, change 'Q' to 'G'
	if(/^Q/.test(surname))
		surname = "Q" + surname.substring(1).replace(/Q/g, "G");
	else
		surname = surname.replace(/Q/g, "G");
	document.modified15.output.value = surname;

	// Change 'SH' to 'S'
	surname = surname.replace(/SH/g, "S");
	document.modified16.output.value = surname;

	// Change 'SCH' to 'S'
	surname = surname.replace(/SCH/g, "S");
	document.modified17.output.value = surname;

	// Change 'YW' to 'Y'
	surname = surname.replace(/YW/, "Y");
	document.modified18.output.value = surname;

	// If not first or last character, change 'Y' to 'A'
	if(/^Y/.test(surname) && /Y$/.test(surname))
 		surname = "Y" + surname.slice(1, -1).replace(/Y/g, "A") + "Y";
	else if(/^Y/.test(surname))
 		surname = "Y" + surname.substring(1).replace(/Y/g, "A");
 	else if(/Y$/.test(surname))
 		surname = surname.slice(0, -1).replace(/Y/g, "A") + "Y";
	else
		surname = surname.replace(/Y/g, "A");
	document.modified19.output.value = surname;

	// Change 'WR' to 'R'
	surname = surname.replace(/WR/g, "R");
	document.modified20.output.value = surname;

	// If not first character, change 'Z' to 'S'
	if(/^Z/.test(surname))
		surname = "Z" + surname.substring(1).replace(/Z/g, "S");
	else
		surname = surname.replace(/Z/g, "S");
	document.modified21.output.value = surname;

	// Change terminal 'AY' to 'Y'
	surname = surname.replace(/AY$/, "Y");
	document.modified22.output.value = surname;

	// remove traling vowels
	surname = surname.replace(/A+$/, "");
	document.modified23.output.value = surname;

	// Collapse all strings of repeated characters
	// This is more brute force that it needs to be
	surname = surname.replace(/[AEIOU]+/g, "A");
	surname = surname.replace(/B+/g, "B");
	surname = surname.replace(/C+/g, "C");
	surname = surname.replace(/D+/g, "D");
	surname = surname.replace(/F+/g, "F");
	surname = surname.replace(/G+/g, "G");
	surname = surname.replace(/H+/g, "H");
	surname = surname.replace(/J+/g, "J");
	surname = surname.replace(/K+/g, "K");
	surname = surname.replace(/L+/g, "L");
	surname = surname.replace(/M+/g, "M");
	surname = surname.replace(/N+/g, "N");
	surname = surname.replace(/P+/g, "P");
	surname = surname.replace(/Q+/g, "Q");
	surname = surname.replace(/R+/g, "R");
	surname = surname.replace(/S+/g, "S");
	surname = surname.replace(/T+/g, "T");
	surname = surname.replace(/V+/g, "V");
	surname = surname.replace(/W+/g, "W");
	surname = surname.replace(/X+/g, "X");
	surname = surname.replace(/Y+/g, "Y");
	surname = surname.replace(/Z+/g, "Z");
	document.modified24.output.value = surname;

	// if first char of original surname is a vowel,
	// use it as first char of code (instead of transcoded 'A')
	if(/^[AEIOU]/.test(firstChar))
		surname = surname.replace(/^A*/, firstChar);
	document.modified25.output.value = surname;

	// Technially, the NYSIIS code is only 6 chars long, but curious
	// people want to see the rest of the resulting transcoding
	if (surname.length > 6) {
		surname = surname.substr(0,6) + "[" + surname.substr(6) + "]";
	}

	document.encodedModified.output.value = surname;
}

