  // developed by Philip Blignaut
  String.prototype.toHex = StringToHex;
  String.prototype.toAscii = StringToAscii;
  function StringToHex()
  {
    var sHex =
      ['0','1','2','3','4','5','6','7'
      ,'8','9','A','B','C','D','E','F'
      ]
    ;
    var sTemp = this;
    var sRet = "";
    var sChar = new String();
    var sHigh, sLow;
    while (sTemp.length>0)
    {
      sChar = sTemp.charCodeAt(0);
      sTemp = sTemp.substr(1);
      sHigh = (sChar & 0xf0) >>> 4;
      sLow = sChar & 0x0f;
      sRet += sHex[sHigh] + sHex[sLow];
    }
    return sRet;
  }
  function StringToAscii()
  {
    var sHex = "0123456789ABCDEF";
    var sTemp = this.toUpperCase();
    var sCharH;
    var sCharL;
    var sRet = "";
    while (sTemp.length>0)
    {
      sCharH = sTemp.substr(0,1);
      sCharL = sTemp.length > 1 ? sTemp.substr(1,1) : "0";
      sTemp = sTemp.length > 1 ? sTemp.substr(2) : "";
      sCharH = sHex.indexOf(sCharH);
      sCharL = sHex.indexOf(sCharL);
      sRet += String.fromCharCode(sCharH*16+sCharL);
    }
    return sRet;
  }
  String.base64string =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    + "abcdefghijklmnopqrstuvwxyz"
    + "0123456789+/"
  ;
  String.prototype.Base64Encode = StringBase64Encode;
  function StringBase64Encode()
  {
    var decStr = this;
    var bits, dual, i = 0, encOut = '';
    while(decStr.length >= i + 3)
    {
      bits =
          (decStr.charCodeAt(i++) & 0xff) <<16
        | (decStr.charCodeAt(i++) & 0xff) <<8
        | (decStr.charCodeAt(i++) & 0xff)
      ;
      encOut +=
          String.base64string.charAt((bits & 0x00fc0000) >>18)
        + String.base64string.charAt((bits & 0x0003f000) >>12)
        + String.base64string.charAt((bits & 0x00000fc0) >> 6)
        + String.base64string.charAt((bits & 0x0000003f))
      ;
    }
    if (decStr.length -i > 0 && decStr.length -i < 3)
    {
      dual = Boolean(decStr.length -i -1);
      bits =
          ((decStr.charCodeAt(i++) & 0xff) <<16)
        | (dual ? (decStr.charCodeAt(i) & 0xff) <<8 : 0)
      ;
      encOut +=
          String.base64string.charAt((bits & 0x00fc0000) >>18)
        + String.base64string.charAt((bits & 0x0003f000) >>12)
        + (dual ? String.base64string.charAt((bits & 0x00000fc0) >>6) : '=')
        + '='
      ;
    }
    return encOut;
  }
  String.prototype.Base64Decode = StringBase64Decode;
  function StringBase64Decode()
  {
    var encStr = this;
    var bits, decOut = '', i = 0;
    for(; i<encStr.length; i += 4)
    {
      bits =
          (String.base64string.indexOf(encStr.charAt(i))    & 0xff) <<18
        | (String.base64string.indexOf(encStr.charAt(i +1)) & 0xff) <<12
        | (String.base64string.indexOf(encStr.charAt(i +2)) & 0xff) << 6 
        |  String.base64string.indexOf(encStr.charAt(i +3)) & 0xff
      ;
      decOut +=
          String.fromCharCode
            (
              (bits & 0xff0000) >>16
            , (bits & 0xff00) >>8
            , bits & 0xff
            )
      ;
    }
    if (encStr.charCodeAt(i -2) == 61)
    {
      return decOut.substring(0, decOut.length -2);
    }
    else if (encStr.charCodeAt(i -1) == 61)
    {
      return decOut.substring(0, decOut.length -1);
    }
    return decOut;
  }
