/* 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("13261 13259 13251 4339 3918 11309 4731 10292 8034 8120 10029 3918 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 10292 11989 12942 2809 4339 4731 3918 10292 12020 1467 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 13251 12942 13251 9807 12942 2809 1467 7469 3918 11989 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 12942 4453 12942 12020 4731 1467 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 1467 8120 2809 12942 12942 12020 1467 7469 10292 4731 1467 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 13038 1323 8120 3918 3447 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 13251 4339 11989 1467 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 2792 12942 9807 13251 4339 1467 4731 12942 2809 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 11309 10292 8120 8001 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 11309 10292 8120 13038 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 11309 10292 8120 3156 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 11309 10292 8120 1323 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 11309 10292 8120 4964 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 8985 4419 13251 13251 8649 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 2792 12942 9807 13251 3918 1467 4731 2809 12942 1467 1467 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 4379 326 13251 3918 12020 8985 7469 4339 13251 1908 9807 4731 3918 12020 4731 12942 2809 12020 12942 4731 326 8120 10292 13251");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 9807 4339 1467 3918 11309 7469 1908 4339 11989 13251 1769 13251 4339 3918 11309 8120 10292 2809 12942 326 8120 10292 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 13251 12942 11309 4453 8649 12020 7523 3918 2809 7523 4964 5181 1908 4731 3918 1467 8120 4339 11309 3918 326 8120 10292 326 4419 7523");
addresses.push("13261 13259 13251 4339 3918 11309 4731 10292 8034 10029 10292 2809 4419 13251 4339 8985 13251 3918 12020 1908 8120 3918 3447 4453 10029 2809 8120 11309 4419 9807 326 10292 2809 9508 326 4419 7523");