// For more information, visit:
// http://www.jracademy.com/~jtucek/email/
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 current_character = parseInt(crypted_characters[i]);
		if (current_character > 10) {
			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;
}

function uncryptMailto( s ) {
	var n = 0;
	var r = "";
	for ( var i = 0; i < s.length; i++ ) {
		n = s.charCodeAt( i );
		if( n >= 8364 ) {
			n = 128;
		}
		r += String.fromCharCode( n - 2 );
	}
	return r;
}

function linkToUncryptMailto( s ) {
	location.href = uncryptMailto( s );
}

function setEmail( s ) {
	if (document.getElementById) {
		document.getElementById('ep635').innerHTML = '<a href="' + uncryptMailto('ocknvq<kphq3:5Bpgvvqdgtgejpwpi0fg') + '">' + uncryptMailto('kphq3:5Bpgvvqdgtgejpwpi0fg') + '</a>';
	}
}

