var Blowfish_P;
var Blowfish_S;
var Blowfish_previous_xHi=0;
var Blowfish_previous_xLo=0;
function Blowfish_setConstants()
{
	var s0 = new Array(
	0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
	0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
	0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
	0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
	0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A);
	var s1 = new Array(
	0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
	0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
	0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
	0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
	0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7);	
	var s2 = new Array(
	0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
	0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
	0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 
	0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
	0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0);	
	var s3 = new Array(
	0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
	0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
	0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
	0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
	0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6);
	Blowfish_S = new Array(s0, s1, s2, s3);	
	Blowfish_P = new Array(
	0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0,
	0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
	0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B); }
function Blowfish_encipher(x)
{
	var xHi = x[0];
	var xLo = x[1];
	var Round = 0;		
	xHi ^= Blowfish_P[0];			
	while(Round < 16)
	{
		xLo ^= (((Blowfish_S[0][xHi >>> 24] + Blowfish_S[1][(xHi >>> 16) & 0x0ff]) ^ Blowfish_S[2][(xHi >>> 8) & 0x0ff]) + Blowfish_S[3][xHi & 0x0ff]) ^ Blowfish_P[++Round];
		xHi ^= (((Blowfish_S[0][xLo >>> 24] + Blowfish_S[1][(xLo >>> 16) & 0x0ff]) ^ Blowfish_S[2][(xLo >>> 8) & 0x0ff]) + Blowfish_S[3][xLo & 0x0ff]) ^ Blowfish_P[++Round];	}	
	xLo ^= Blowfish_P[17];
	x[0] = xLo;
	x[1] = xHi; }
function Blowfish_decipher(x)
{	
	var xHi;
	var xLo;
	var Round;
	var temp;
	for(i=0;i < x.length;i+=2)
	{
		xHi = x[i];
		xLo = x[i+1];
		xHi ^= Blowfish_P[17];		
		Round=16;		
		while(Round>0)
		{
			xLo ^= (((Blowfish_S[0][xHi >>> 24] + Blowfish_S[1][(xHi >>> 16) & 0xff]) ^ Blowfish_S[2][(xHi >>> 8) & 0xff]) + Blowfish_S[3][xHi & 0xff]) ^ Blowfish_P[Round--];
			xHi ^= (((Blowfish_S[0][xLo >>> 24] + Blowfish_S[1][(xLo >>> 16) & 0xff]) ^ Blowfish_S[2][(xLo >>> 8) & 0xff]) + Blowfish_S[3][xLo & 0xff]) ^ Blowfish_P[Round--];		}
		xLo ^= Blowfish_P[0];
		temp = x[i];
		x[i] = xLo ^ Blowfish_previous_xHi;
		Blowfish_previous_xHi = temp;		
		temp = x[i+1];
		x[i+1] = xHi ^ Blowfish_previous_xLo;
		Blowfish_previous_xLo = temp;	}}
function Blowfish_initialise(key, IV)
{	var i, j;
	var block = new Array(2);
	Blowfish_previous_xHi = IV[0];
	Blowfish_previous_xLo = IV[1];
	Blowfish_setConstants();	
	for(j=0,i=0;i<18;i++)
	{
		Blowfish_P[i] = Blowfish_P[i] ^ key[j];
		j = (j+1)%14;	}
	for(i=0;i<18;)
	{
		Blowfish_encipher(block);
		Blowfish_P[i++] = block[0];
		Blowfish_P[i++] = block[1];	}
	for(i=0;i<4;i++)
	{	for(j=0;j<256;)
		{	
			Blowfish_encipher(block);
			Blowfish_S[i][j++] = block[0];
			Blowfish_S[i][j++] = block[1];
		}	}}
function stringtoints(instring)
{
	var binary = new Array();
	var i, ch;	
	for(i=0;i<instring.length;i++)
	{
		ch = instring.charCodeAt(i);
		binary[i>>2] |= ch << ((3 - i&3)<<3);	}	
	return binary; }
function base64tobin(codestring)
{
	var i = 0;
	var temp;
	var binary = new Array();
	while(i < codestring.length * 6)
	{
		temp = codestring.charCodeAt(i/6);		
		if(temp>47 && temp<58)	temp -= 48;
		if(temp>62 && temp<91)	temp -= 53;
		if(temp>96 && temp<123)	temp -= 59;		
		switch(i&0x1f)//i%32
		{
		case 0:		binary[i>>5] = temp;
					i += 6;
					break;
		case 28:	binary[i>>5] = (binary[i>>5] << 4) | (temp >> 2);
					i += 4;
					binary[i>>5] = temp & 0x03;
					i += 2;
					break;
		case 30:	binary[i>>5] = (binary[i>>5] << 2) | (temp >> 4);
					i += 2;
					binary[i>>5] = temp & 0x0f;
					i += 4;
					break;
		default:	binary[i>>5] = (binary[i>>5] << 6) | temp;
					i += 6;
		}	}
	return binary; }
function intstostring(intvalues)
{	var outstring = new String();
	for(var i=0;i<intvalues.length;i++)
	{
		outstring += String.fromCharCode
		(
			intvalues[i] >>> 24,
			(intvalues[i] >>> 16) & 0xff,
			(intvalues[i] >>> 8) & 0xff,
			intvalues[i] & 0xff
		);
	}
	return outstring; }
function decipher(ciphertext)
{
	var buffer = base64tobin(ciphertext);
	Blowfish_decipher(buffer);	
	document.write(intstostring(buffer));
	document.close(); }
function passtokey(pass, HiIV, LoIV)
{
	var binarypassword = stringtoints(pass);
	var block = new Array(2);
	var key = new Array(16);
	var i=0, j;
	block[0] = HiIV;
	block[1] = LoIV;
	do
	{	Blowfish_initialise(key, block);		
		for(j=0;j<16;)
		{
			block[0] ^= binarypassword[i];
			Blowfish_encipher(block);		
			key[j++] ^= block[0];
			key[j++] ^= block[1]; 		}
	}while(++i < binarypassword.length)
	return key; }
function password_submit(b64initialints)
{
	var initialints = base64tobin(b64initialints);
	var password = document.passform.passbox.value;
	var key = passtokey(password, initialints[2], initialints[3]);	
	if((initialints[4] == key[14]) && (initialints[5] == key[15]))
	{
		Blowfish_initialise(key, initialints);
		decipherDocument();	}
	else
	{
		alert("Incorrect Password!!!");
	}
	return false; }
