// JavaScript Document
/* 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("24961 24953 6540 3949 6447 9591 21944 12449 8840 17183 3949 9591 1458 17183 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [0] sales - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 6540 6540 7157 1939 6447 13787 13787 1458 10792 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [1] mmckibben - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 17183 21868 9505 9505 12449 5717 21944 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [2] support - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 22759 17183 12449 13787 1345 6447 7157 1939 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [3] jsobwick - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 1458 7157 5717 12449 7157 1939 1458 21944 21944 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [4] ecrockett - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 6447 10792 837 12449 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [5] info - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 21944 837 3949 21944 14012 13787 5717 21868 7157 1939 10792 1458 5717 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [6] tfathbruckner - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 17183 10792 1458 17183 21944 1458 5717 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [7] snester - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 9591 1458 3949 12923 1458 5717 3949 9591 1458 5717 21944 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [8] leaderalert - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 9591 1458 3949 12923 1458 5717 9505 14012 12449 10792 1458 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [9] leaderphone - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 9591 1458 3949 12923 1458 5717 6540 1458 1458 21944 6447 10792 6906 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [10] leadermeeting - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 9591 1458 3949 12923 1458 5717 12923 6447 3949 9591 12449 6906 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [11] leaderdialog - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 22759 10792 1458 1458 12923 14012 3949 6540 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [12] jneedham - at - leader.com
addresses.push("24961 24953 6540 3949 6447 9591 21944 12449 8840 21944 7157 3949 6540 9505 13787 1458 9591 9591 21083 9591 1458 3949 12923 1458 5717 9002 7157 12449 6540");  // [13] tcampbell - at - leader.com
