/* 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("3959 3947 2244 2841 2892 3746 224 3219 817 519 2618 2379 2648 2892 2304 2379 258 224 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 519 2618 2379 2648 2892 2304 2379 258 224 2379 3746 2379 1632 224 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 519 2841 2648 224 519 2618 2379 2648 2892 2304 2379 258 224 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 2648 2379 1632 2618 2379 224 2841 2618 3060 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 224 2618 2379 2841 2648 3472 2618 2379 2618 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 2379 2304 2892 224 3219 2618 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 3472 2244 2648 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 3472 2244 2995 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 2841 2618 1632 3059 2892 3416 2892 2648 224 2120 3472 2244 2648 229 2841 1632 229 3472 3531 3493");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 717 2379 3093 2648 2892 224 2379 2120 3472 2244 2648 229 2841 1632 229 3472 3531");
addresses.push("3959 3947 2244 2841 2892 3746 224 3219 817 3472 2648 2892 2244 2120 3472 2244 2648 229 2841 1632 229 3472 3531");
