// Defines some useful event handlers used to collect entropy.

var NUMBITS_ERROR = "Specified number of bits isn't correct.\n";
var INTERVAL = 500;
var TIMER_INTERVAL = 100;

var entropy;
var callback;
var previous_time;
var collected_entropy;
var finalization;

function set_entropy_handlers(numbits, progress_callback, finalization_func, error_callback)
{
    var numbits_int = Number(numbits);

    if (isNaN(numbits_int) || (numbits == "")) {
	alert(NUMBITS_ERROR);

	error_callback();

	return;
    }

    entropy = new Entropy(numbits_int);
    previous_time = null;
    finalization = finalization_func;
    callback = progress_callback;

    document.onkeypress = keypress_handler;
    if (document.captureEvents) {
	document.captureEvents(Event.MOUSEMOVE);
    }
    document.onmousemove = mouse_handler;

    setTimeout("timer_handler()", TIMER_INTERVAL);
}

function keypress_handler(e)
{
    var keycode;

    if(window.event) // IE
    {
		keycode = window.event.keyCode;
    }
    else if(e.which) // Netscape/Firefox/Opera
    {
	keycode = e.which;
    }

    entropy.stir_keycode(keycode);
    entropy.stir_keypress();
}

function mouse_handler(e)
{
    var date = new Date();
    var time = date.getTime();

    if (previous_time == null) {
	previous_time = time;
    }
    else if ((time - previous_time) > INTERVAL) {
	var x = (window.event) ? window.event.x : e.clientX;
	var y = (window.event) ? window.event.y : e.clientY;
	entropy.stir_mouse(x, y);

	previous_time = time;
    }
}

function timer_handler()
{
    var collected_percent = (entropy.entropy_collected() / entropy.wanted_entropy * 100) | 0;

    if (collected_percent < 100) {
	callback(collected_percent);
	setTimeout("timer_handler()", TIMER_INTERVAL);
    }
    else {
	collected_entropy = entropy.get_entropy();
	previous_time = null;
	callback = null;
	entropy = null;

	document.onkeypress = null;

	document.onmousemove = null;

	if (document.releaseEvents) {
		document.releaseEvents(Event.MOUSEMOVE);
	}

	finalization();
    }
}
