/* 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("18203 18199 10464 9689 5446 10245 16793 15040 7572 883 15040 15040 12755 5446 5669 12092 15040 8130 9270 10245 2393 9689 10464 5446 10245 16793 15040 5669 6259 5669 226 16793 15977 12529 2390 883 14821 226 8185 16793 3549 6841 2390 883 12529 8185 9270 5446 883 226 7572 5527 5373 9689 5669 9689 13413 5446 5669 13413 5527 1068 9270 5446 16793 226 9270 12529");  // [0] bookinfo - at - rlhamilton.net
addresses.push("18203 18199 10464 9689 5446 10245 16793 15040 7572 12092 226 226 15578 883 9689 8185 12755 8130 9270 10245 2393 9689 10464 5446 10245 16793 15040 5669 6259 5669 226 16793 15977 12529 2390 883 14821 226 8185 16793 3549 2001 226 226 15578 883 9689 8185 12755");  // [1] feedback - at - rlhamilton.net
addresses.push("18203 18199 10464 9689 5446 10245 16793 15040 7572 10464 9689 5446 10245 5446 5669 13413 10245 5446 12529 16793 8130 14268 10464 10245 221 9270 226 12529 12529 6259 5669 226 16793 15977 12529 2390 883 14821 226 8185 16793 3549 6841 2390 883 12529 8185 9270 5446 883 226 7572 5527 16002 5373 5592 5527 17302 9270 226 12529 12529");  // [2] mailinglist - at - xmlpress.net
addresses.push("3379 3373 1744 2837 365 1852 2478 1652 1255 2487 2297 563 1852 365 641 1718 2172 135 500 418 1744 1852 2487 135 2172 641 641 1790 2399 2172 2478");  // [3] publisher - at - xmlpress.net
