/* Tablica zawiera odwrotnosci liczb modulo 257 */
tab = new Array(
		1, 129, 86, 193, 103, 43, 147, 225, 200, 
		180, 187, 150, 178, 202, 120, 241, 121, 
		100, 230, 90, 49, 222, 190, 75, 72, 89, 
		238, 101, 195, 60, 199, 249, 148, 189, 
		235, 50, 132, 115, 145, 45, 163, 153, 6, 
		111, 40, 95, 175, 166, 21, 36, 126, 173, 
		97, 119, 243, 179, 248, 226, 61, 30, 59, 
		228, 102, 253, 87, 74, 234, 223, 149, 246, 
		181, 25, 169, 66, 24, 186, 247, 201, 244, 
		151, 165, 210, 96, 205, 127, 3, 65, 184, 
		26, 20, 209, 176, 152, 216, 46, 83, 53, 
		139, 135, 18, 28, 63, 5, 215, 164, 177, 
		245, 188, 224, 250, 44, 218, 116, 124, 38, 
		113, 134, 159, 54, 15, 17, 158, 140, 114, 
		220, 51, 85, 255, 2, 172, 206, 37, 143, 
		117, 99, 240, 242, 203, 98, 123, 144, 219, 
		133, 141, 39, 213, 7, 33, 69, 12, 80, 93, 
		42, 252, 194, 229, 239, 122, 118, 204, 174, 
		211, 41, 105, 81, 48, 237, 231, 73, 192, 
		254, 130, 52, 161, 47, 92, 106, 13, 56, 10, 
		71, 233, 191, 88, 232, 76, 11, 108, 34, 23, 
		183, 170, 4, 155, 29, 198, 227, 196, 31, 9, 
		78, 14, 138, 160, 84, 131, 221, 236, 91, 
		82, 162, 217, 146, 251, 104, 94, 212, 112, 
		142, 125, 207, 22, 68, 109, 8, 58, 197, 62, 
		156, 19, 168, 185, 182, 67, 35, 208, 167, 27, 
		157, 136, 16, 137, 55, 79, 107, 70, 77, 57, 
		32, 110, 214, 154, 64, 171, 128, 256
		);

/* Cyklicznie przesowa bity znaku */
function rot(ch, a)
{
	a %= 8;
	return ((ch >> a) | (ch << (8 - a))) % 256;
}

function permutation(text)
{
	var i, pos, seed, temp;

	seed = 0;
	
	for (i = 0; i < 256; i++) 
		seed ^= text[i];

	for (i = 0; i < 256; i++) {
		pos = tab[(i + seed) % 256] - seed - 1;
		if (pos >= i) {
			temp = text[i];
			text[i] = text[pos];
			text[pos] = temp;
		}
	}

	return text;
}

function szyfruj(text, key)
{
	var i, k;

	for (k = 0; k < 256; k++) {	 
		i = k % 8;
		text[k] ^= key[i];
		text[k] = ((text[k] + 1) * (key[i] + 1)) % 257 - 1;
		text[k] = (text[k] + key[i]) % 256;
	} 

	text = permutation(text);

	for (k = 0; k < 256; k++) {	 
		i = k % 8;
		text[k] = (text[k] + 256 - key[i]) % 256;
		text[k] = ((text[k] + 1) * tab[key[i]]) % 257 - 1;
		text[k] ^= key[i];
	}

	return text;
}

function mySplit(str)
{
	var i;

	arr = new Array();

	for (i = 0; i < str.length; i++)
	{
		arr[i] = str.charCodeAt(i);
	}

	return arr;
}

function myJoin(arr)
{
	var i;

	str = "";
	
	for (i = 0; i < arr.length; i++)
	{
		str += String.fromCharCode(arr[i]);
	}

	return str;
}

function encryption(plaintext, key)
{
	var i, j;

	textArr = mySplit(plaintext);
	keyArr = mySplit(key);

	for (i = 0; i < 2; i++) {
		textArr = szyfruj(textArr, keyArr);
		for (j = 0; j < 8; j++)
			keyArr[j] = rot(keyArr[j], 4);
	}

	return myJoin(textArr);
}

function decryption(cyphertext, key)
{
	var i, j;

	textArr = mySplit(cyphertext);
	keyArr = mySplit(key);

	for (i = 0; i < 2; i++) {
		for (j = 0; j < 8; j++)
			keyArr[j] = rot(keyArr[j], 4);
		textArr = szyfruj(textArr, keyArr);
	}

	return myJoin(textArr);
}

function str_pad_ex(str, mod)
{
	var i;

	len = str.length;
	rem = len % mod;

	if (rem > 0)
	{   	
		for (i = 0; i < mod - rem; i++)
		{
			str += " ";
		}
	}

	return str;
}

function str_split(string, split_length)
{
	var chunks = new Array();
	var str = "";

	if (split_length < 1)
	{
		return false;
	}

	for (var pos = 0; pos < string.length; pos += split_length)
	{
		str = string.substring(pos, pos + split_length);
		chunks.push(str);
	}
	
	return chunks;
}


function decrypt_text(text, key)
{
	var decrypted = "";
	var arr = str_split(str_pad_ex(text, 256), 256);
	
	for (var i = 0; i < arr.length; i++)
	{
		decrypted += decryption(arr[i], key);
	}

	return decrypted;
}

function readCookie(name) 
{
	var ca = document.cookie.split(';');
	name += "=";
	for (var i = 0; i < ca.length; i++) {
		var c = ca[i];
		var j = 0;
		while (c.charAt(j) == ' ')
			j++; 
		c = c.substring(j, c.length);
		if (c.indexOf(name) == 0) 
			return c.substring(name.length, c.length);
	}
	return null;
}

function base64_decode(input) 
{
    	var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = keyStr.indexOf(input.charAt(i++));
            enc2 = keyStr.indexOf(input.charAt(i++));
            enc3 = keyStr.indexOf(input.charAt(i++));
            enc4 = keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output += String.fromCharCode(chr1);

            if (enc3 != 64) {
                output += String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output += String.fromCharCode(chr3);
            }

        }

        return output;

}


function utfDecode(utftext) {  
         var string = "";  
         var i = 0;  
         var c = c1 = c2 = 0;  
   
         while ( i < utftext.length ) {  
   
             c = utftext.charCodeAt(i);  
   
             if (c < 128) {  
                 string += String.fromCharCode(c);  
                 i++;  
             }  
             else if((c > 191) && (c < 224)) {  
                 c2 = utftext.charCodeAt(i+1);  
                 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));  
                 i += 2;  
             }  
             else {  
                 c2 = utftext.charCodeAt(i+1);  
                 c3 = utftext.charCodeAt(i+2);  
                 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));  
                 i += 3;  
             }  
   
         }  
   
         return string;  
}  

function GenPassFromId(a_nId)
{
	var str = encryption(str_pad_ex("" + a_nId, 256), "12345678");
	return str.substring(0, 8);
}

