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


if(!addresses) var addresses = new Array();
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 558 1220 1384 268 659 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 558 1552 226 1642 313 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 456 79 226 1384 1552 456 1795 124 226 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 680 1220 680 1231 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 1552 268 268 79 442 354 961 1220 1231 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 590 313 442 268 1665 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 226 1220 268 268 79 442 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 124 1220 268 79 226 1552 1795 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 253 1552 124 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 456 680 1552 1384 442 268 1552 4 4 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 124 1552 456 659 79 268 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 79 590 1552 128 442 590 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 1384 1552 79 1795 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 588 1552 313 207 226 1795 809 590 659 128 226 1795 354 226 1220 124 850");
addresses.push("1843 1037 124 1552 79 128 659 1220 1806 313 207 590 1552 128 442 590 482 809 590 659 128 226 1795 354 226 1220 124");
addresses.push("3379 3373 1744 2837 365 1852 2478 1652 1255 2610 2487 2172 135 2172 678 500 641 2478 1852 2610 1671 1790 2610 1652 1744 2967");
addresses.push("3379 3373 1744 2837 365 1852 2478 1652 1255 135 1652 2610 365 1652 500 641 2478 1852 2610 1671 1790 2610 1652 1744 2967");  
addresses.push("3379 3373 1744 2837 365 1852 2478 1652 1255 2837 2487 365 1744 2172 2399 2478 2172 1852 500 641 2478 1852 2610 1671 1790 2610 1652 1744 2967"); 
addresses.push("3379 3373 1744 2837 365 1852 2478 1652 1255 641 2610 2837 135 135 2172 2478 2172 135 1652 500 641 2478 1852 2610 1671 1790 2610 1652 1744");
