var decryption_cache = new Array();

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;
}

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;
}

if(!addresses) var addresses = new Array();
addresses.push("10207 6651 8947 4250 4234 4251 9432 10100 1179 4251 4234 4251 5750 6969 9921 9601 32 9432 4234 4251 4234 4090 10100 5473 634 10100 8947 5079 32 9321 2148 7004 9601 634 9432 2427 1151 32 4251 4250 2147 190 10100 4250 9432 4250 4090 3528 2147 5796 10100 4090 9921 9321 1529 4250 32");
addresses.push("1963 1543 255 943 1444 1304 1091 214 852 1145 611 820 1868 934 787 869 820 725 891 835 611 835 1438");
addresses.push("18721 7373 11279 17557 17248 10313 8419 15382 17229 14851 17964 5795 11158 10653 6400 13778 5795 12801 13949 17838 11158 5795 12801");
addresses.push("12367 8091 8861 9882 7494 10645 2654 7261 9607 7731 7261 9871 8861 9882 7731 10640 2437 10640 3840 12101 2654 7494 10645 7494 7731 7261 10767 5673 7261 8861 2707 12101 6270 1300 3784 3840 5673 2654 4375 5640 12101 10645 9882 8034 7220 7261 9882 2654 9882 7731 10982 8034 2238 7261 7731 10640 6270 9871 9882 12101");

