var plaintext = document.getElementById("plaintext");
var ciphertext = document.getElementById("ciphertext");
var key = document.getElementById("key");

function hexOnly(str) {
	return str.replace(/[^0-9A-Fa-f]/g, '');
}

function randomkey_click() {
	key.value = numToHexString(Math.floor(0xFFFF * Math.random()), 16);
}

function encrypt_click() {
	ciphertext.value = '';
	var ctext = encrypt(hexStringToNum(key.value), plaintext.value); 
	for (var i=0; i < ctext.length; i += 40) {
		ciphertext.value += ctext.substr(i, 40) + "\n";
	}
}

function decrypt_click() {
	var ptext = decrypt(hexStringToNum(key.value), hexOnly(ciphertext.value));
	if (ptext == null) {
		status("Decryption failed");
	} else {
		plaintext.value = ptext;
	}
}

var crack_key = null;
var crack_str = null;
var crack_t = null;
function crack_click() {
	if (crack_key != null) return;
	key.value = '';
	crack_key = 0;
	crack_str = hexOnly(ciphertext.value);
	crack_t = new Date();

    if (!window.opera && window.Worker) {
        status('Cracking using Web Workers');
        var cryptoworker = new Worker('static/cryptoworker.js');
        cryptoworker.onmessage = function(event) {
            switch(event.data.type) {
            case 'status':
                key.value = numToHexString(event.data.value, 16);
                break;
            case 'finished':
                key.value = numToHexString(event.data.value, 16);
                cryptoworker.terminate();
                crack_finish();
                if (event.data.ptext == null) {
                    status("Could not find key. Corrupted ciphertext?");
                } else {
                    plaintext.value = event.data.ptext;
                }
                break;
            }
        }
        cryptoworker.postMessage(crack_str);
    } else {
        crack_thread();
    }
}

function crack_thread() {
	for (var k = crack_key; k < crack_key + 0x10; k++) {
		ptext = decrypt(k, crack_str);
		if (ptext != null) {
			crack_finish();
			plaintext.value = ptext;
			key.value = numToHexString(k, 16);
			return;
		}
	}
	key.value = numToHexString(k, 16);
	if (k >= 0x10000) {
		crack_finish();
		status("Could not find key. Corrupted ciphertext?");
	} else {
		crack_key = k;
		setTimeout('crack_thread()', 0);
	}
}

function crack_finish() {
	crack_key = crack_str = null;
	var t2 = new Date();
	t2 = (t2 - crack_t) / 1000.0;
	status("Cracking took " + t2.toFixed(3).toString() + " seconds");
}

function status(text) {
	document.getElementById('statusbar').innerHTML = text;
}

