/* EMAIL ENCRYPTION SCRIPT */

// This script is (c) copyright 2008 by Dan Appleman under the
// GNU General Public License (http://www.gnu.org/licenses/gpl.html)
// This script is modified from an original script by Jim Tucek
// For more information, visit www.danappleman.com 
// Leave the above comments alone!
// see encryption_instructions.txt for explanation of usage

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;
}

// 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;
}

 if(!addresses) var addresses = new Array();
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 814 1903 1584 1903 5323 1903 16991 15210 15210 28502 7255 706 17953 11365 18129 18129 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 814 11365 17953 7414 12173 10250 17275 6362 25620 10250 5323 17275 7703 17275 29170 7255 814 18129 866 6362 7703 17275 23284 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 12878 10250 7703 17953 7703 814 17275 7255 814 17953 23284 11365 18129 12173 10250 814 1584 10250 7703 28420 12173 17275 1584 5323 10250 7703 10250 1584 23284 7414 706 6362 18129 7414 28420 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 17953 17275 28420 17953 7703 1584 14008 17953 14008 14372 260 260 4884 7255 706 17953 11365 18129 18129 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 11365 7414 7255 814 17953 23284 11365 18129 12173 10250 814 1584 10250 7703 28420 12173 17275 1584 5323 10250 7703 10250 1584 23284 7414 706 6362 18129 7414 28420 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 1584 814 18129 7414 3022 10250 18129 4294 18761 4294 18761 7255 5323 1584 7703 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 25126 5323 3022 6362 17275 5323 17953 10250 12173 7255 17953 23284 23284 6362 7703 17275 23284 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 25126 17275 13794 7255 7703 17275 23284 1584 18129 12173 13794 17275 7414 6362 7703 17275 23284 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 12173 10250 7703 14008 17953 1584 23284 3744 8296 8296 1584 14372 7255 28420 5323 17953 10250 12173 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 6362 23284 17275 7414 7414 706 6362 28502 7255 11365 18129 23284 5323 17953 10250 12173 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 25620 8296 16991 25237 260 28502 7255 11365 18129 23284 5323 17953 10250 12173 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 17275 5323 11365 10250 25126 17275 7414 7255 17953 18129 12173 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 11365 17275 10250 14008 17275 7703 8296 12173 3744 23284 7255 17953 18129 12173 6362 814 18129 5323 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 3744 1584 10250 814 14008 10250 7414 17275 814 23284 18129 7414 7255 814 17953 23284 11365 18129 12173 10250 814 1584 10250 7703 28420 12173 17275 1584 5323 10250 7703 10250 1584 23284 7414 706 6362 18129 7414 28420 4397");
addresses.push("29591 29587 5323 17953 10250 12173 23284 18129 17452 5323 3744 1584 25126 706 12173 18129 13794 17275 7255 814 18129 866 6362 7703 17275 23284");