/* 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("4009 4007 1701 2559 478 1230 1780 3386 3288 2601 1596 723 1596 1701 1596 2459 820 820 1572 3279 1037 2559 1289 3386 3386 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 2519 478 876 2559 876 2601 1867 3279 2601 2559 1780 1289 3386 1230 478 2601 723 478 876 1513 1230 1867 723 1701 478 876 478 723 1780 817 1037 525 3386 817 1513");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1289 817 3279 2601 2559 1780 1289 3386 1230 478 2601 723 478 876 1513 1230 1867 723 1701 478 876 478 723 1780 817 1037 525 3386 817 1513");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 577 478 1230 1230 1830 2559 1062 3279 1289 3386 1780 1701 2559 478 1230 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1243 1867 1062 3279 876 1867 1780 723 3386 1230 1062 1867 817 525 876 1867 1780");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1243 1701 1830 525 1867 1701 2559 478 1230 3279 2559 1780 1780 525 876 1867 1780");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1230 478 876 3999 2559 723 1780 1022 1326 1326 723 1071 3279 1513 1701 2559 478 1230 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 2559 1867 1513 2559 876 723 3999 2559 3999 1071 2356 2356 3483 3279 1037 2559 1289 3386 3386 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 2601 3999 1326 2559 2601 3279 1037 2559 1289 3386 3386 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 3999 1022 2559 817 1780 1867 3020 3279 2601 3386 442 525 876 1867 1780");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 1867 1701 1289 478 1243 1867 817 3279 2559 3386 1230 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 1289 1867 478 3999 1867 876 1326 1230 1022 1780 3279 2559 3386 1230 525 2601 3386 1701");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 1022 723 478 2601 3999 478 817 1867 2601 1780 3386 817 3279 2601 2559 1780 1289 3386 1230 478 2601 723 478 876 1513 1230 1867 723 1701 478 876 478 723 1780 817 1037 525 3386 817 1513");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 1701 1022 723 1243 1037 1230 3386 1062 1867 3279 2601 3386 442 525 876 1867 1780");
addresses.push("4009 4007 1701 2559 478 1230 1780 3386 3288 723 2601 3386 817 1830 478 3386 3354 3020 3354 3020 3279 1701 723 876 525 2601 3386 1701");