/* 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("13157 13151 10156 11486 2264 7352 133 8974 11327 10156 9509 2712 2264 11486 1147 1649 3804 2264 8931 8974 1663 4173 2338");  // [0] media - at - fhi.org
addresses.push("13157 13151 10156 11486 2264 7352 133 8974 11327 11486 2264 2712 12049 6413 5309 4947 12049 1147 1649 3804 2264 8931 8974 1663 4173 2338");  // [1] aidspubs - at - fhi.org
addresses.push("13157 13151 10156 11486 2264 7352 133 8974 11327 6413 5309 4947 7352 2264 9187 11486 133 2264 8974 11576 12049 1147 1649 3804 2264 8931 8974 1663 4173 2338");  // [2] publications - at - fhi.org
addresses.push("13157 13151 10156 11486 2264 7352 133 8974 11327 1663 133 8974 6413 1147 1649 3804 2264 8931 8974 1663 4173 2338");  // [3] rtop - at - fhi.org
addresses.push("13157 13151 10156 11486 2264 7352 133 8974 11327 12049 9509 1663 2419 2264 9187 9509 12049 1147 1649 3804 2264 8931 8974 1663 4173 2338");  // [4] services - at - fhi.org
addresses.push("13157 13151 10156 11486 2264 7352 133 8974 11327 1771 9509 4947 10156 11486 12049 133 9509 1663 1147 1649 3804 2264 8931 8974 1663 4173");  // [5] webmaster - at - fhi.org
