/*
  http://www.faqts.com/knowledge_base/view.phtml/aid/1748/fid/146
  2004-02-09 modified by l.levesque@fotovista.com
*/

var Base64 = {
  // modified to replace '=' (61) sign by ',' (44)
  base64s : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",

  encode : function(decStr) {
    //decStr=escape(decStr);    //line add for chinese char
    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 +=
        Base64.base64s.charAt((bits & 0x00fc0000) >>18) +
        Base64.base64s.charAt((bits & 0x0003f000) >>12) +
        Base64.base64s.charAt((bits & 0x00000fc0) >> 6) +
        Base64.base64s.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 +=
        Base64.base64s.charAt((bits & 0x00fc0000) >>18) +
        Base64.base64s.charAt((bits & 0x0003f000) >>12) +
        (dual ? Base64.base64s.charAt((bits & 0x00000fc0) >>6) : ',') +
        ',';
    }
    //return escape(encOut);
    return encOut;
  },

  decode : function(encStr) {
    //encStr = escape(encStr);

    var bits, decOut = '', i = 0;
    for (; i<encStr.length; i += 4) {
      bits =
        (Base64.base64s.indexOf(encStr.charAt(i))  & 0xff) <<18 |
        (Base64.base64s.indexOf(encStr.charAt(i +1)) & 0xff) <<12 |
        (Base64.base64s.indexOf(encStr.charAt(i +2)) & 0xff) << 6 |
        Base64.base64s.indexOf(encStr.charAt(i +3)) & 0xff;
      decOut += String.fromCharCode((bits & 0xff0000) >>16, (bits & 0xff00) >>8, bits & 0xff);
    }

    /*
    if (encStr.charCodeAt(i -2) == 61) {
      undecOut=decOut.substring(0, decOut.length -2);
    } else if (encStr.charCodeAt(i -1) == 61) {
      undecOut=decOut.substring(0, decOut.length -1);
    } else {
      undecOut=decOut;
    }
    */

    if (encStr.charCodeAt(i -2) == 44) {
      undecOut=decOut.substring(0, decOut.length -2);
    } else if (encStr.charCodeAt(i -1) == 44) {
      undecOut=decOut.substring(0, decOut.length -1);
    } else {
      undecOut=decOut;
    }

    //return unescape(undecOut);    //line add for chinese char
    return undecOut;
  }
}


