<!-- This script block stores your encrypted email address(es) in -->
<!-- the addresses array.  If you ever want to add new addresses to -->
<!-- a page, you can return to http://www.jracademy.com/~jtucek/email/ -->
<!-- and generate more, and then add this block to your existing page. -->

if(!addresses) var addresses = new Array();
addresses.push("551 101 390 298 421 147 203 384 58 180 421 171 309 302 203 384 171 486 410 390 262 147 203 344 384 390 298 510 68 171 421 309 344 180 115 278 384 171 487 138 115 262 72 311 309 302 203 359 390 262 147 203 344 384 390 298 510 185 68 171 421 309 344 180 115 185 446 309 72 185 115 421 203 309 185 302 384 344 203 298 302 203");
addresses.push("551 101 390 298 421 147 203 384 58 510 309 298 171 203 510 198 309 309 310 309 171 410 390 262 147 203 344 384 390 298 510 68 171 421 309 344 180 115 278 384 171 487 138 115 262 72 311 309 302 203 359 390 262 147 203 344 384 390 298 510 185 68 171 421 309 344 180 115 185 446 309 72 185 115 421 203 309 185 302 384 344 203 298 302 203");
addresses.push("551 101 390 298 421 147 203 384 58 446 309 72 198 309 309 310 309 171 410 390 262 147 203 344 384 390 298 510 68 171 421 309 344 180 115 278 384 171 487 138 115 262 72 311 309 302 203 359 390 262 147 203 344 384 390 298 510 185 68 171 421 309 344 180 115 185 446 309 72 185 115 421 203 309 185 302 384 344 203 298 302 203");


// This script is (c) copyright 2006 Jim Tucek under the
// GNU General Public License (http://www.gnu.org/licenses/gpl.html)
// For more information, visit www.jracademy.com/~jtucek/email/ 
// Leave the above comments alone!

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;
}


