// addressScrambler.js version 0.2.1 // copyright 2001, 2002, Josiah Q. Hamilton // This software is provided under the Artistic license of the Open // Source Initiative, as it exists on 2001-12-19, including the optional // provision regarding aggregation with a commercial distribution. // This notice must be included with any distribution. // The offset determines what the ascii values of the scrambled // text will be shifted to. It may be that, in the future, more // sophisticated scrambling algorithms will be needed -- for now, // a simple ascii offset is used. If you are using a server side // component to scramble the addresses on their way out of the server, // you must be using the same algorithm as this javascript uses to // unscramble them, and for this one, you must have the same offset value var scrambleOffset = 5; // This array holds the visible ascii character set // it may be that Unicode would be better, but this version // uses ascii. Characters outside this range are basically // ignored. var asciicode = new Array(); asciicode[32] = " "; asciicode[33] = "!"; asciicode[34] = "\""; asciicode[35] = "#"; asciicode[36] = "$"; asciicode[37] = "%"; asciicode[38] = "&"; asciicode[39] = "'"; asciicode[40] = "("; asciicode[41] = ")"; asciicode[42] = "*"; asciicode[43] = "+"; asciicode[44] = ","; asciicode[45] = "-"; asciicode[46] = "."; asciicode[47] = "/"; asciicode[48] = "0"; asciicode[49] = "1"; asciicode[50] = "2"; asciicode[51] = "3"; asciicode[52] = "4"; asciicode[53] = "5"; asciicode[54] = "6"; asciicode[55] = "7"; asciicode[56] = "8"; asciicode[57] = "9"; asciicode[58] = ":"; asciicode[59] = ";"; asciicode[60] = "<"; asciicode[61] = "="; asciicode[62] = ">"; asciicode[63] = "?"; asciicode[64] = "@"; asciicode[65] = "A"; asciicode[66] = "B"; asciicode[67] = "C"; asciicode[68] = "D"; asciicode[69] = "E"; asciicode[70] = "F"; asciicode[71] = "G"; asciicode[72] = "H"; asciicode[73] = "I"; asciicode[74] = "J"; asciicode[75] = "K"; asciicode[76] = "L"; asciicode[77] = "M"; asciicode[78] = "N"; asciicode[79] = "O"; asciicode[80] = "P"; asciicode[81] = "Q"; asciicode[82] = "R"; asciicode[83] = "S"; asciicode[84] = "T"; asciicode[85] = "U"; asciicode[86] = "V"; asciicode[87] = "W"; asciicode[88] = "X"; asciicode[89] = "Y"; asciicode[90] = "Z"; asciicode[91] = "["; asciicode[92] = "\\"; asciicode[93] = "]"; asciicode[94] = "^"; asciicode[95] = "_"; asciicode[96] = "`"; asciicode[97] = "a"; asciicode[98] = "b"; asciicode[99] = "c"; asciicode[100] = "d"; asciicode[101] = "e"; asciicode[102] = "f"; asciicode[103] = "g"; asciicode[104] = "h"; asciicode[105] = "i"; asciicode[106] = "j"; asciicode[107] = "k"; asciicode[108] = "l"; asciicode[109] = "m"; asciicode[110] = "n"; asciicode[111] = "o"; asciicode[112] = "p"; asciicode[113] = "q"; asciicode[114] = "r"; asciicode[115] = "s"; asciicode[116] = "t"; asciicode[117] = "u"; asciicode[118] = "v"; asciicode[119] = "w"; asciicode[120] = "x"; asciicode[121] = "y"; asciicode[122] = "z"; asciicode[123] = "{"; asciicode[124] = "|"; asciicode[125] = "}"; asciicode[126] = "~"; // this function returns the ascii code for a given character // or "0" if the character is not in the set represented by // the array. function getAsciiCode(theChar) { var i = 32; var ret = 0; var match = false; while (i < 127 && match != true) { if (asciicode[i] == theChar) { ret = i; } i ++; } return ret; } // this function returns the character associated with a given // ascii code, or an empty string if the code is not in the range // of 32 through 126 function getCharacter(theCode) { var ret = ""; if (theCode > 31 && theCode < 127) { ret = asciicode[theCode]; } return ret; } // This "private" function holds the scrambling // algorithm -- it uses the global variable scrambleOffset // to determine the shift in ascii value // The first argument is the text to be scrambled or unscrambled // The second argument is boolean -- false if the text is to be // scrambled or true if it is to be unscrambled function _scramble(inText,inverse) { var i = 0; var outText = ""; var currentCode = 0; var newCode = 0; var newChar = ''; var offset = scrambleOffset; if (inverse == true) { offset = offset * -1; } while (i < inText.length) { currentCode = getAsciiCode(inText.charAt(i)); if (currentCode != 0) { newCode = currentCode + offset; if (newCode > 125) { newCode = (newCode - 125) + 31; } if (newCode < 32) { newCode = 126 - (32 - newCode); } } else { newCode = 0; } // sub tilde for backslash if (inverse == false && newCode == 92) { newCode = 126; } else if (inverse == true && currentCode == 126) { newCode = 92 + offset; } outText += getCharacter(newCode); i++; } return outText; } // This function returns unscrambled text // It takes scrambled text as an input function descrambleText(inText) { var outText = _scramble(inText,true); return outText; } // This function returns scrambled text // It takes unscrambled text as an input function scrambleText(inText) { var outText = _scramble(inText,false); return outText; } function writeDescrambledAddress(scrambledAddress) { document.open(); document.write(descrambleText(scrambledAddress)); document.close(); } // This "public" function takes a scrambled address // and a not-scrambled display text string // and writes a mailto tag with them. // Note that the display text is not scrambled when you // use this function, so if the display text *is* // also the address, you should use the function // writeMailTo instead, // and just use the scrambled address for the argument. function writeMailToWithClearDisplayText(scrambledAddress, text) { document.open(); document.write("" + text + ""); document.close(); } // This "public" function takes a scrambled address *and* // scrambled display text, descrambles them both, and writes // a mailto tag. This is useful when you want to hide the display // text from harvesters for some reason. If you're simply using the // address again as display text, it'll be easier to use the // writeMailToUsingAddress function, which takes just one argument - the address function writeMailToWithScrambledDisplayText(scrambledAddress, scrambledText) { document.open(); document.write("" + descrambleText(scrambledText) + ""); document.close(); } // This "public" function writes a mailto tag using the // address itself as the display value function writeMailTo(scrambledAddress) { document.open(); document.write("" + descrambleText(scrambledAddress) + ""); document.close(); } // the following methods are only used by the helper pages function getMailToWithClearDisplayText(scrambledAddress, text) { return("" + text + ""); } function getMailTo(scrambledAddress) { return("" + descrambleText(scrambledAddress) + ""); } function getMailToCode(scrambledAddress) { return (""); } function getEscapedMailToCode(scrambledAddress) { return ("<script language="JavaScript">writeMailTo('" + scrambledAddress + "');</script>"); } function getMailToCodeWithClearDisplayText(scrambledAddress, text) { return (""); } function getEscapedMailToCodeWithClearDisplayText(scrambledAddress, text) { return ("<script language="JavaScript">writeMailToWithClearDisplayText('" + scrambledAddress + "','"+ text + "');</script>"); } function writeScrambledAddress(address) { document.open(); document.write(scrambleText(address)); document.close(); }