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

// Remove the comments below to improve spam resistance! 
// email addresses: 

 if(!addresses) var addresses = new Array();
addresses.push("23449 23447 21717 10052 10408 1749 22367 12733 20358 10052 6868 6868 10052 12297 6538 12733 12733 14545 11821 8302 6538 10408 6868 6868 10408 6868 6538 1307 215 10126 1307 21717 10126 21820 12733 20479 6538");  
addresses.push("23449 23447 21717 10052 10408 1749 22367 12733 20358 1307 16517 1307 10052 6868 12297 6538 12733 12733 14545 11821 8302 6538 10408 6868 6868 10408 6868 6538 1307 215 10126 1307 21717 10126 21820 12733 20479 6538");  
addresses.push("23449 23447 21717 10052 10408 1749 22367 12733 20358 16732 10408 6868 14545 10052 21820 13576 12733 1307 8302 6868 11821 8302 20479 6538 12297 10126 1307 14919 1307 21820 12733 20479 6538"); 
addresses.push("23449 23447 21717 10052 10408 1749 22367 12733 20358 14545 12733 20479 12733 22367 14919 10609 12297 6538 12733 12733 14545 11821 8302 6538 10408 6868 6868 10408 6868 6538 1307 215 10126 1307 21717 10126 21820 12733 20479 6538");  
addresses.push("23449 23447 21717 10052 10408 1749 22367 12733 20358 10408 6868 5103 12733 12297 6538 12733 12733 14545 11821 8302 6538 10408 6868 6868 10408 6868 6538 1307 215 10126 1307 21717 10126 21820 12733 20479 6538 16860 16860");  
