// Copyright 2010-2011 nowehaslo.pl, All Rights Reserved


function escape_html(text)
{
	text = text.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;');
	return text.split('"').join('&quot;').split("'").join('&#x27;');
}


function byte2hex(b)
{
	if (b < 16) {
		return '0' + b.toString(16);
	} else {
		return b.toString(16);
	}
}


function str2utf8hex(str)
{
	var i, c;
	var result = '';
	for (i = 0; i < str.length; ++i) {
		c = str.charCodeAt(i);
		if (c < 0) {
			throw 'Invalid Unicode!';
		} else if (c < 128) {
			result += byte2hex(c);
		} else if (c < 2048) {
			result += byte2hex(0xC0 | (c >> 6));
			result += byte2hex(0x80 | (c & 0x3F));
		} else if (c < 65536) {
			result += byte2hex(0xE0 | (c >> 12));
			result += byte2hex(0x80 | ((c >> 6) & 0x3F));
			result += byte2hex(0x80 | (c & 0x3F));
		} else if (c <= 0x10FFFF) {
			result += byte2hex(0xF0 | (c >> 18));
			result += byte2hex(0x80 | ((c >> 12) & 0x3F));
			result += byte2hex(0x80 | ((c >> 6) & 0x3F));
			result += byte2hex(0x80 | (c & 0x3F));
		} else {
			throw 'Invalid Unicode!';
		}
	}
	return result;
}


var PASSWORD_PROCESSOR_PADDING = "1bf0266e800e0c8dfaf35e880677ba9c604300fdd90aa6f82baf5c788bf26167b16d9386bce93c94509654ca81fdab5b4a4ddf595d00d3e330e95f70bf2031dbdc01d334e760d728a4a6a4c619292124a7b2d0e17aa5163c19262d9d36fd9176f162b3c87e440dfed6f2e38344b261b88d6321d9fecc6a0f14bcadd6aac11b641da26155c1c9457fdc769d86f652ccc420569126fecd642ff63d51200834de28841d6e22cb597d4d56010a82a226086a72cdad009a255f6562fe667b9c7e8b464fa9dbcf56ad73e51bb2415cea6596cec99fe5c3547863411f7f2f7bd30b23e85bb41c7fc85604a5fbffa8246d7f38ac98c465f0828b60efe564eeab3e836c56364488f51271ace29ac609e0b2cae1919b84fd9237f681f9c23b4cc7cefd49eb7374f03432c06a9ac4b0123c9bcf5eec5a302d19db8a31749a93ff50e014fcec43d9cbae556f057191f04bca75260485bff8d44745b05e76dfae84a9b369166c95fb8f80deed0bd76bd5d59cc0911c5393a8101c804d20bdbed14e77a2c8c9990e48fe8fe5efafc9a9f4a7284c633cc162fa7b8641e388b58bd813587e902637a3e53bf086311ad9a1073008c2d96090f978bc0a66c1e939d615849b8ef3922f362442634ef1b8e9c4c1240fad62ff4e4c503af70e33ccd03a2bd774928aecefc6e6f3c8c3d65e5b4a56bf3aa1994fc07fbf85956bc1e2893a42285d890439a1";


function mixStrings(x, y)
{
	var i, z = '';
	for (i = 0; i < x.length; ++i) {
		z += x.charAt(i);
		if (i < y.length) {
			z += y.charAt(i);
		}
	}
	if (i < y.length) {
		z += y.substr(i);
	}
	return z
}


function password_processor(website, main_password, iterations, progress_function)
{
	var i;
	var text;
	var hash;

	if (iterations < 1) {
		throw 'iterations < 1';
	}

	// Zamiana tekstów Unicode na szesnastkowy format UTF-8.
	website = str2utf8hex(website);
	main_password = str2utf8hex(main_password);

	var text = mixStrings( PASSWORD_PROCESSOR_PADDING, mixStrings(website, main_password) )

	// Wzmacnianie hasla.
	i = 0;
	iterations -= 1;
	(function ()
	{
		var hash;
		var j = i + 8;
		if (j > iterations) {
			j = iterations;
		}
		while (i < j) {
			hash = new jsSHA(text, "HEX");
			text = hash.getHash("SHA-512", "HEX");
			i += 1;
		}

		if (i == iterations) {
			hash = new jsSHA(text, "HEX");
			text = hash.getHash("SHA-512", "B64");
			text = text.substr(0, 32);
			text = text.split('0').join('@');
			text = text.split('O').join('#');
			text = text.split('1').join('$');
			text = text.split('l').join('%');
			text = text.split('I').join('&');
//			text = text.split(('+').join('+');
			text = text.split('/').join('=');
			progress_function(i, i, text);
		} else if (progress_function(i, iterations + 1, undefined)) {
			setTimeout(arguments.callee, 0);
		}
	})();
}




var BANNED_PASSWORDS = ['starwars', 'butthead', 'password1', 'corvette', 'midnight', 'whatever', 'cokolwiek', 'jennifer', 'computer', 'komputer', 'einstein', 'rush2112', 'cocacola', 'superman', 'trustno1', 'mountain', 'mistress', 'scorpion', 'skorpion', 'startrek', 'marlboro', 'redwings', 'danielle', 'srinivas', 'nicholas', 'maverick', 'steelers', 'password12', 'football', 'access14', 'password123', 'samantha', 'sunshine', 'bigdaddy', 'internet', 'victoria', 'wiktoria', 'baseball', 'redskins', 'hardcore', 'password', 'princess', 'dolphins', 'michelle', 'firebird', 'iloveyou', 'mercedes', 'qwertyui', 'qwertyuio', 'qwertyuiop', 'qwertyuiop[', 'qwertyuiop[]', 'qwertyuiop[]\\', 'asdfghjk', 'asdfghjkl', 'asdfghjkl;', 'asdfghjkl;\'', 'zxcvbnm,', 'zxcvbnm,.', 'zxcvbnm,./', 'abcdefghi', 'abcdefghij', 'abcdefghijk', 'abcdefghijkl', 'abcdefghijklm', 'abcdefghijklmn', 'abcdefghijklmno', 'abcdefghijklmnop', 'abcdefghijklmnopq', 'abcdefghijklmnopqr', 'abcdefghijklmnopqrs', 'abcdefghijklmnopqrst', 'abcdefghijklmnopqrstu', 'abcdefghijklmnopqrstuv', 'abcdefghijklmnopqrstuvw', 'abcdefghijklmnopqrstuvwx', 'abcdefghijklmnopqrstuvwxy', 'abcdefghijklmnopqrstuvwxyz', 'swimming', 'hasło', 'nowehaslo', 'nowehasło', 'nowe haslo', 'nowe hasło', 'nowehaslo.pl', 'nowehasło.pl', 'mojehaslo', 'mojehasło', 'moje haslo', 'moje hasło', 'hasloglowne', 'haslo glowne', 'hasłogłówne', 'hasło główne', 'ppkp3,amdnwo5r!', 'kepulauan', 'kepulauan12'];


function password_strength(subject, password)
{
	var i, j, l, password_lc;

	if (password.length % 2 == 0) {
		l = password.length / 2;
		if (password.substr(0, l) == password.substr(l, l)) {
			password = password.substr(0, l);
		}
	} else {
		l = (password.length - 1) / 2;
		if (password.substr(0, l) == password.substr(l, l)) {
			password = password.substr(l);
		}
		if (password.substr(0, l) == password.substr(l + 1 , l)) {
			password = password.substr(0, l + 1);
		}
	}

	password_lc = password.toLowerCase();
	if (password_lc == subject.toLowerCase()) {
		return 1.0;
	}

	for (i = 0; i < BANNED_PASSWORDS.length; ++i) {
		if (password_lc == BANNED_PASSWORDS[i]) {
			return 7.0;
		}
	}

	var result = 0.0;
	if (password.search(/[a-z]/) != -1) {
		result += 26.0;
	}
	if (password.search(/[A-Z]/) != -1) {
		result += 26.0;
	}
	if (password.search(/[0-9]../) != -1) {
		result += 10.0;
	}
	if (password.search(/[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]/) != -1) { // ~`!@#$%^&*()-=_+{}[]\|:;"'<>,./?
 		result += 33.0;
	}
	if (password.search(/[^\x20-\x7E]/) != -1) {
		result += 128.0;
	}
	return Math.log(Math.pow(result, password.length)) / Math.log(2);
}




var randoms = mixStrings((new Date()).getTime().toString(16), Math.floor(0x100000000 * Math.random()).toString(16));




function getAntiphishingStamp()
{
	var stamp = parseInt($.cookie('antiphishing-stamp'), 16);
	if (isNaN(stamp) || stamp < 0 || stamp > 0xFFFF) {
		stamp = randoms
		if (stamp.length % 2 == 1) {
			stamp = stamp.substr(0, stamp.length - 1);
		}
		var hash = new jsSHA(stamp, "HEX");
		stamp = hash.getHash("SHA-512", "HEX").substr(0, 4);
		stamp = parseInt(stamp, 16);
	}
	$.cookie('antiphishing-stamp', stamp.toString(16), {expires: 1024, path: '/'});
	return stamp;
}




function createAntiphishingBox(stamp)
{
	var box = '<div id="antiphishing" title="Pieczęć antyphishingowa" onclick="location=\'/pytania/#p10\'">';
	for (var i = 0; i < 4; ++i) {
		var remainder = stamp % 16;
		box += '<div style="background-position:-' + (64 * remainder).toString() + 'px 0px;">&nbsp;</div>';
		stamp -= remainder;
		stamp = stamp / 16;
	}
	return box += '</div>';
}




var ANTIPHISHING_BOX = createAntiphishingBox(getAntiphishingStamp())




var HTML_PRINTOUT_TEMPLATE =
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n' +
'<html><head>\n' +
'	<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />\n' +
'	<title>nowehaslo.pl - Drukowanie hasła</title>\n' +
'	<link rel="stylesheet" type="text/css" href="wydruk.css" />\n' +
'</head><body><div>\n' +
'	Hasło wygenerowane w serwisie nowehaslo.pl.<br />\n' +
'	<br />\n' +
'	Strona www: <span>{website}</span><br/>\n' +
'	<br />\n' +
'	Nowe hasło: <span>{newpassword}</span><br />\n' +
'	<br />\n' +
'	UWAGA!<br />\n' +
'	Zabezpiecz ten wydruk przed dostępem osób niepowołanych.<br />\n' +
'	Nie wyrzucaj tego dokumentu bez uprzedniego zniszczenia go.<br />\n' +
'</div></body></html>\n';


function print_new_password()
{
	var website = document.getElementById('website').value;
	var newpassword = document.getElementById('newpassword').value;
	website = escape_html(website);
	newpassword = escape_html(newpassword);
	html = HTML_PRINTOUT_TEMPLATE.split('{website}').join(website).split('{newpassword}').join(newpassword);
	printout = window.open('', '_blank', 'width=800,height=600');
	printout.document.write(html);
	printout.document.close();
	printout.focus();
	printout.print();
	return false;
}




var NEW_PASSWORD_TEMPLATE =
	'Nowe hasło:<br />' +
	'<input id="newpassword" type="text" readonly="readonly" value="${newpassword}" tabindex="3" />' +
	'<img src="numbering.png" />' +
	'<span>Używając tego hasła oznajmiasz, że akceptujesz warunki <a href="/regulamin/">regulaminu</a>.</span>' +
	'<ul><li><a onclick="print_new_password()">drukuj</a></li>';

var referrer = document.referrer;
referrer = referrer.replace(/^http:\/\//i, '');
referrer = referrer.replace(/^https:\/\//i, '');
referrer = referrer.replace(/^www\./i, '');
referrer = referrer.replace(/\/.*/i, '');
referrer = referrer.toLowerCase();

if (referrer == 'nowehaslo.pl' ||
	referrer == 'google.pl' ||
	referrer == 'google.com'
) {
	referrer = ''
}

if (referrer) {
	NEW_PASSWORD_TEMPLATE += '<li>Powrót&nbsp;do <a href="' + escape_html(document.referrer) + '">' + escape_html(referrer) + '</a>.</li></ul>';
} else {
	referrer = '';
	NEW_PASSWORD_TEMPLATE += '</ul>';
}




var lastwebsite = '\x05';
var lastmainpassword = '\x05';
var password_processor_running = false;
var password_processor_stop = false;
var new_password_display_timeout = new Date(2038, 1, 1, 0, 0, 0, 0)


function process_password()
{
	var website = document.getElementById('website');
	var mainpassword = document.getElementById('mainpassword');
	var message = document.getElementById('message');

	if (new_password_display_timeout < new Date()) {
		website.value = '';
		mainpassword.value = '';
		new_password_display_timeout = new Date(2038, 1, 1, 0, 0, 0, 0)
	}

	if (lastwebsite != website.value || lastmainpassword != mainpassword.value || password_processor_stop) {
		if (password_processor_running) {
			password_processor_stop = true;
		}
		if (website.value == '') {
			message.innerHTML = '<a class="error" href="/pomoc/#p2">Wprowadź stronę www.</a>' + ANTIPHISHING_BOX;
		} else if (mainpassword.value == '') {
			message.innerHTML = '<a class="error" href="/pomoc/#p3">Wprowadź hasło główne.</a>' + ANTIPHISHING_BOX;
		} else if (password_strength(website.value, mainpassword.value) < 40) {
			message.innerHTML = '<a class="error" href="/pomoc/#p4">Hasło główne jest za słabe.</a>' + ANTIPHISHING_BOX;
		} else if (password_processor_running) {
			message.innerHTML = 'Generowanie nowego hasła... 0%';
		} else {
			message.innerHTML = 'Generowanie nowego hasła... 0%';
			password_processor_running = true;
			password_processor_stop = false;
			password_processor(website.value, mainpassword.value, 256,
				function (iteration, total, result)
				{
					if (password_processor_stop) {
						password_processor_running = false;
						return false;
					} else if (iteration == total) {
						password_processor_running = false;
						message.innerHTML = NEW_PASSWORD_TEMPLATE.replace('${newpassword}', result);
						new_password_display_timeout = new Date()
						new_password_display_timeout.setSeconds(new_password_display_timeout.getSeconds() + 60)
					} else {
						message.innerHTML = 'Generowanie nowego hasła... ' +
							(100 * iteration / total).toFixed().toString() +
							'%';
					}
					return true;
				}
			);
		}
		lastwebsite = website.value;
		lastmainpassword = mainpassword.value;
	}
	setTimeout(arguments.callee, 50);
}



$(document).ready(function() {

	// menu
	var menu = $('div.menu a');
	menu.mouseover(function() {
		$(this).css('border-top', 'solid 1px #FFF');
	});
	menu.mouseout(function() {
		$(this).css('border-top', 'none');
	});

	// home
	if ($(".home").length > 0) {
		if (referrer) {
			$('.home #website').attr('value', referrer);
		}
		
		$('body').mousemove(function (event) {
			if (randoms.length > 127) {
				randoms = randoms.substr(randoms.length - 127);
			}
			var x = event.pageX % 16;
			var y = event.pageY % 16;
			var r = y & 1;
			for (var i = 0; i < 3; ++i) {
				y = y >> 1;
				r = (r << 1) | (y & 1);
			}
			randoms += (r ^ x).toString(16);
		});
		
		$("#random-password-button").click(function() {
			$("#mainpassword").val(randoms + ((new Date()).getTime()  & 0xFFFF).toString(16));
		});

		$(".home #message").html('Sprawdzanie twojej przeglądarki...');
		password_processor('nowehasło.pl', 'NOWEHASŁO.PL', 19,
			function (iteration, total, result)
			{
				if (iteration == total) {
					if (result != 'W+mCF3qRj7R7@eSa3+H8aDWREvFwLMSS') {
						$(".home #message").html('<a class="error" href="/pomoc/#p7">Twoja przeglądarka źle generuje hasła.</a>');
					} else {
						process_password();
					}
				}
				return true;
			}
		);
	}

});




