// This script is (c) copyright 2006 Jim Tucek under the
// GNU General Public License (http://www.gnu.org/licenses/gpl.html)
// For more information, visit www.jracademy.com/~jtucek/email/ 
// Leave the above comments alone!

var decryption_cache = new Array();

if(!addresses) var addresses = new Array();
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 4304 15585 2008 2008 15585 3595 4304 15585 2008 2008 15585 9120 9269 15585 15531");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 4304 15585 2008 2008 15585 844 4304 267 4732 15585 3595 4304 15585 2008 2008 15585 9120 9269 15585 15531");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 2008 15585 15585 5614 9120 2008 267 1220 4304 11447 12996 1616 12996 3595 4304 15585 2008 2008 15585 9120 9269 15585 15531");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 9410 267 4732 4732 5614 9120 11080 5614 2919 4732 11447 12996 1616 12996 3595 4304 15585 2008 2008 15585 9120 9269 15585");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 1616 4304 267 12996 15585 2008 15585 9120 1220 267 4732 267 12996 15585 2008 15585 3595 4304 15585 2008 2008 15585 9120 9269 15585");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 2008 5614 15306 15585 9120 11080 5614 1616 2919 4304 11447 9410 5614 3595 4304 15585 2008 2008 15585 9120 9269 15585");
addresses.push("16171 6365 2008 5614 15585 2919 4304 11447 8220 9410 267 2267 5614 9120 15306 11447 4732 4732 5614 12996 1616 12996 3595 5614 4304 7072 267 1220 15585 12996 1616 1220 1220 9120 10306 11447 2008");

function decrypt_string(crypted_string,n,decryption_key,just_email_address) {
	var cache_index = "'"+crypted_string+","+just_email_address+"'";

	if(decryption_cache[cache_index])					// If this string has already been decrypted, just
		return decryption_cache[cache_index];				// return the cached version.

	if(addresses[crypted_string])						// Is crypted_string an index into the addresses array
		var crypted_string = addresses[crypted_string];			// or an actual string of numbers?

	if(!crypted_string.length)						// Make sure the string is actually a string
		return "Error, not a valid index.";

	if(n == 0 || decryption_key == 0) {					// If the decryption key and n are not passed to the
		var numbers = crypted_string.split(' ');			// function, assume they are stored as the first two
		n = numbers[0];	decryption_key = numbers[1];			// numbers in crypted string.
		numbers[0] = ""; numbers[1] = "";				// Remove them from the crypted string and continue
		crypted_string = numbers.join(" ").substr(2);
	}

	var decrypted_string = '';
	var crypted_characters = crypted_string.split(' ');

	for(var i in crypted_characters) {
		var current_character = crypted_characters[i];
		var decrypted_character = exponentialModulo(current_character,n,decryption_key);
		if(just_email_address && i < 7)				// Skip 'mailto:' part
			continue;
		if(just_email_address && decrypted_character == 63)	// Stop at '?subject=....'
			break;
		decrypted_string += String.fromCharCode(decrypted_character);
	}
	
	decryption_cache[cache_index] = decrypted_string;			// Cache this string for any future calls

	return decrypted_string;
}

function decrypt_and_email(crypted_string,n,decryption_key) {
	if(!n || !decryption_key) { n = 0; decryption_key = 0; }
	if(!crypted_string) crypted_string = 0;

	var decrypted_string = decrypt_string(crypted_string,n,decryption_key,false);
	parent.location = decrypted_string;
}

function decrypt_and_echo(crypted_string,n,decryption_key) {
	if(!n || !decryption_key) { n = 0; decryption_key = 0; }
	if(!crypted_string) crypted_string = 0;

	var decrypted_string = decrypt_string(crypted_string,n,decryption_key,true);
	document.write(decrypted_string);
	return true;
}

// Finds base^exponent % y for large values of (base^exponent)
function exponentialModulo(base,exponent,y) {
	if (y % 2 == 0) {
		answer = 1;
		for(var i = 1; i <= y/2; i++) {
			temp = (base*base) % exponent;
			answer = (temp*answer) % exponent;
		}
	} else {
		answer = base;
		for(var i = 1; i <= y/2; i++) {
			temp = (base*base) % exponent;
			answer = (temp*answer) % exponent;
		}
	}
	return answer;
}
// -->