//Modified by / Date:
//Description:
//----------------------------------
//B.Lim - JUL-19-2006
//Utils added

function getStrFromLong(v, w) {
  var vl = v.length;
  var sl = v[vl - 1] & 0xffffffff;
  for (var i = 0; i < vl; i++) {
    v[i] = String.fromCharCode(v[i] & 0xff,
                               v[i] >>> 8 & 0xff,
                               v[i] >>> 16 & 0xff,
                               v[i] >>> 24 & 0xff);
  }
  if (w) {
    return v.join('').substring(0, sl);
  } else {
    return v.join('');
  }
}
  
function getLongFromStr(s, w) {
  var len = s.length;
  var v = [];
  for (var i = 0; i < len; i += 4) {
    v[i >> 2] = s.charCodeAt(i)
              | s.charCodeAt(i + 1) << 8
              | s.charCodeAt(i + 2) << 16
              | s.charCodeAt(i + 3) << 24;
  }
  if (w) {
    v[v.length] = len;
  }
  return v;
}
  
function encryptToBT(str, key) {
  if (str == '') {
    return '';
  }
  var v = getLongFromStr(str, true);
  var k = getLongFromStr(key, false);
  var n = v.length - 1;
 
  var z = v[n], y = v[0], delta = 0x9E3779B9;
  var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = 0;
  while (0 < q--) {
    sum = sum + delta & 0xffffffff;
    e = sum >>> 2 & 3;
    for (var p = 0; p < n; p++) {
      y = v[p + 1];
      mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
      z = v[p] = v[p] + mx & 0xffffffff;
    }
    y = v[0];
    mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
    z = v[n] = v[n] + mx & 0xffffffff;
  }
 
  return getStrFromLong(v, false);
}
  
function decryptFromBT(str, key) {
  if (str == '') {
    return '';
  }
  var v = getLongFromStr(str, false);
  var k = getLongFromStr(key, false);
  var n = v.length - 1;

  var z = v[n - 1], y = v[0], delta = 0x9E3779B9;
  var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = q * delta & 0xffffffff;
  while (sum != 0) {
    e = sum >>> 2 & 3;
    for (var p = n; p > 0; p--) {
      z = v[p - 1];
      mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
      y = v[p] = v[p] - mx & 0xffffffff;
    }
    z = v[n];
    mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
    y = v[0] = v[0] - mx & 0xffffffff;
    sum = sum - delta & 0xffffffff;
  }

  return getStrFromLong(v, true);
}

var ENC_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var DEC_TABLE = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function encodeToB64(sValue) {
  var sRetVal = '';
  var iLen = sValue.length;
  var c1, c2, c3;
  var iCtr = 0;

  while(iCtr < iLen) {
    c1 = sValue.charCodeAt(iCtr++) & 0xff;
    sRetVal += ENC_TABLE.charAt(c1 >> 2);
    if(iCtr == iLen) {
      sRetVal += ENC_TABLE.charAt((c1 & 0x3) << 4);
      sRetVal += '==';
    } else {
      c2 = sValue.charCodeAt(iCtr++);
      sRetVal += ENC_TABLE.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
      if(iCtr == iLen) {
        sRetVal += ENC_TABLE.charAt((c2 & 0xF) << 2);
        sRetVal += '=';
      } else {
        c3 = sValue.charCodeAt(iCtr++);
        sRetVal += ENC_TABLE.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
        sRetVal += ENC_TABLE.charAt(c3 & 0x3F);
      }
    }
  }
  return sRetVal;
}

function decodeFromB64(sValue) {
  var sRetVal = '';
  var sDecVal = '';
  var iLen = sValue.length;
  var c1, c2, c3, c4;
  var iCtr = 0;

  while(iCtr < iLen) {
    c1 = DEC_TABLE[sValue.charCodeAt(iCtr++) & 0xff];
    c2 = DEC_TABLE[sValue.charCodeAt(iCtr++) & 0xff];
    if ((c1 != -1) && (c2 != -1)) {
      sRetVal += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
      c3 = sValue.charCodeAt(iCtr++) & 0xff;
      if (c3 != 61) {
        c3 = DEC_TABLE[c3];
        if (c3 != -1) {
          sRetVal += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
          c4 = sValue.charCodeAt(iCtr++) & 0xff;
          if (c4 != 61) {
            c4 = DEC_TABLE[c4];
            if (c4 != -1) {
              sRetVal += String.fromCharCode(((c3 & 0x03) << 6) | c4);
            }
          }
        } 
      }
    }
  }
  return sRetVal;
}