var JauthStarted =0;
function ResetJauth()
{
JauthStarted =0;
}

var LoadTime =0;

function TimeSkew(){
var diff;
var tdate = new Date ();
var CurrTime = tdate.getTime();
diff = Math.round((Math.abs(CurrTime - LoadTime))/1000);
return diff;
}

var ldate = new Date ();
LoadTime = ldate.getTime();

function HmacMD5(Key, Data, DataLen)
{
var DigestSize = 16;
var BlockSize = 64;
var ch;
Key = MD5(Key.toLowerCase());
var Kipad = new array(BlockSize);
var Kopad = new array(BlockSize);
var i = 0;
for(i = 0; i < BlockSize; i++)
{
Kipad[i] = xor(((i < DigestSize) ? Key[i] : 0), 0x36);
Kopad[i] = xor(((i < DigestSize) ? Key[i] : 0), 0x5c);
}
init();
for (i=0; i<BlockSize; i++)
{
update(Kipad[i]);
}
for (i=0;i<DataLen;i++)
{
ch = Data.charAt(i);
// absurd code because we have to avoid explicit dollar sign character
if ((ch > '#') && (ch < '%'))
{
update(36);
}
else
{
update(ascii.lastIndexOf(ch));
}
}
finish();
var InnerDigest = clone(digestBits);
init();
for (i=0; i<BlockSize; i++)
{
update(Kopad[i]);
}
for (i=0; i<DigestSize; i++)
{
update(InnerDigest[i]);
}
finish();
var temp = clone(digestBits);
init();
return temp;
}

function HmacMD5_B64(Key, Data, DataLen)
{
var res = HmacMD5(Key, Data, DataLen);
var temp = EncodeBase64(res);
return temp;
}

function Jauth()
{
var RawRes, Res, Temp, i, Skew, iPasswordLen;
var Data, Password;
var sOrigButtonText = document.loginbox.gofer.value;
if (JauthStarted == 0){
JauthStarted =1;
document.loginbox.gofer.value = "Wait...";
}else{
return false;
}
Skew = "" + TimeSkew();
Data = Skew + document.loginbox.snonce.value;
Password = document.loginbox.password.value;
iPasswordLen = Password.length;
RawRes = HmacMD5(Password, Data, Data.length);
Temp = new array((RawRes.length - 6));
for(i=6;i<RawRes.length;i++)
{
Temp[i-6] = RawRes[i];
}
Res = EncodeBase64(Temp);
var dummyPassword = '';
for (i = 0; i < iPasswordLen; i++)
   dummyPassword = dummyPassword + 'x';
document.loginbox.timeskew.value = Skew;
document.loginbox.crep.value = Res;
document.loginbox.password.value = dummyPassword;
document.loginbox.gofer.value = sOrigButtonText;
return true;
}