// ====================================================================
//       urlEncode and urlDecode functions
// ====================================================================
function URLEncode(unEncodedString) {
  // The Javascript escape and unescape functions do not correspond
  // with what browsers actually do...
  var SAFECHARS = "0123456789" + // Numeric
                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + // Alphabetic
                  "abcdefghijklmnopqrstuvwxyz" +
                  "-_.!~*'()";
  // RFC2396 Mark characters
  var HEX = "0123456789ABCDEF";

  var plaintext = unEncodedString;
  var encoded = "";
  for (var i = 0; i < plaintext.length; i++) {
    var ch = plaintext.charAt(i);
    if (ch == " ") {
      encoded += "+";
      // x-www-urlencoded, rather than %20
    } else if (SAFECHARS.indexOf(ch) != -1) {
      encoded += ch;
    } else {
      var charCode = ch.charCodeAt(0);
      if (charCode > 255) {
        alert("Unicode Character '"
            + ch
            + "' cannot be encoded using standard URL encoding.\n" +
              "(URL encoding only supports 8-bit characters.)\n" +
              "A space (+) will be substituted.");
        encoded += "+";
      } else {
        encoded += "%";
        encoded += HEX.charAt((charCode >> 4) & 0xF);
        encoded += HEX.charAt(charCode & 0xF);
      }
    }
  }
  // for

  return encoded;
}

function URLDecode(encodedString) {
  // Replace + with ' '
  // Replace %xx with equivalent character
  // Put [ERROR] in output if %xx is invalid.
  var HEXCHARS = "0123456789ABCDEFabcdef";
  var encoded = encodedString;
  var plaintext = "";
  var i = 0;
  while (i < encoded.length) {
    var ch = encoded.charAt(i);
    if (ch == "+") {
      plaintext += " ";
      i++;
    } else if (ch == "%") {
      if (i < (encoded.length - 2)
          && HEXCHARS.indexOf(encoded.charAt(i + 1)) != -1
          && HEXCHARS.indexOf(encoded.charAt(i + 2)) != -1) {
        plaintext += unescape(encoded.substr(i, 3));
        i += 3;
      } else {
        alert('Bad escape combination near ...' + encoded.substr(i));
        plaintext += "%[ERROR]";
        i++;
      }
    } else {
      plaintext += ch;
      i++;
    }
  }
  // while
  return plaintext;
}
