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