  var b64Str;
  var b64Cnt;

  function setb64Str(str) {
    b64Str = str;
    b64Cnt = 0;
  }

  var END_OF_INPUT = -1;

  var base64Chars = new Array(
    'A','B','C','D','E','F','G','H',
    'I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X',
    'Y','Z','a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v',
    'w','x','y','z','0','1','2','3',
    '4','5','6','7','8','9','+','/'
  );

  var reverseBase64Chars = new Array();
  for (var i = 0; i < base64Chars.length; i++)
    reverseBase64Chars[base64Chars[i]] = i;

  function readReverseBase64() {
    if (!b64Str) return END_OF_INPUT;
    while (true) {
      if (b64Cnt >= b64Str.length) return END_OF_INPUT;
      var nextCh = b64Str.charAt (b64Cnt);
      b64Cnt++;
      if (reverseBase64Chars[nextCh]) return reverseBase64Chars[nextCh];
      if (nextCh == 'A') return 0;
    }
    return END_OF_INPUT;
  }

  function ntos (n) {
    n = n.toString(16);
    if (n.length == 1) n = "0" + n;
    n= "%" + n;
    return unescape(n);
  }

  function decodeBase64 (str) {
    setb64Str(str);
    var result = "";
    var inBuffer = new Array(4);
    var done = false;
    while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT) {
      inBuffer[2] = readReverseBase64();
      inBuffer[3] = readReverseBase64();
      result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
      if (inBuffer[2] != END_OF_INPUT) {
        result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
        if (inBuffer[3] != END_OF_INPUT)
          result +=  ntos ((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
        else
          done = true;
      }
      else
        done = true;
    }
    return result;
  }

  function email (cim) {
    var cim = decodeBase64(cim);
    document.write('<a href="mailto:' + cim +  '">' + cim + '</a>');
  }

