function stringToByteArray(string)
{
	var byteArray = new Array(string.length);
	for (var i=0; i<string.length; i++) byteArray[i] = string.charCodeAt(i);
	return byteArray;
}

function byteArrayToString(byteArray)
{
	var string = '';
	for (var i=0; i<byteArray.length; i++) string += String.fromCharCode(byteArray[i]);
	return string;
}

function byteArrayToString2(byteArray)
{
	var string = '';
	for (var i=0; i<byteArray.length; i++)
	{
		var c = byteArray[i];
		if (c < 32) c = 63;	// ?
		string += String.fromCharCode(c);
	}
	return string;
}

function hexdigit(c)
{
	if (c >= 'a') return c.charCodeAt(0) - 87;
	if (c >= 'A') return c.charCodeAt(0) - 55;
	if (c >= '0') return c.charCodeAt(0) - 48;
	return -1;
}

function hexToByteArray(hexString)
{
	var byteArray = new Array();
	var upper4 = true;
	var o=0;
	for (var i=0; i<hexString.length; i++)
	{
		var c = hexdigit(hexString.charAt(i));
		if (c < 0) continue;
		if (upper4)
			byteArray[o] = c << 4;
		else
			byteArray[o++] |= c;
		upper4 = !upper4;
	}
	if (!upper4) byteArray.length--;
	return byteArray;
}

function byteArrayToHex(byteArray)
{
	var hexdigits = '0123456789ABCDEF';
	var hexString = '';
	for (var i=0; i<byteArray.length; i++)
	{
		hexString += hexdigits.charAt(byteArray[i] >> 4) + hexdigits.charAt(byteArray[i] & 15);
	}
	return hexString;
}

function String2Hex(id, reverse)
{
	if (reverse)
		document.getElementById(id).value = byteArrayToString(hexToByteArray(document.getElementById(id).value));
	else
		document.getElementById(id).value = byteArrayToHex(stringToByteArray(document.getElementById(id).value));
}

function GetByteArray(id, fromstring)
{
	if (fromstring)
		return stringToByteArray(document.getElementById(id).value);
	else
		return hexToByteArray(document.getElementById(id).value);
}

function OnXorChanged()
{
	var r = new Array();
	var s = document.getElementById('xor_string').checked;
	var a = GetByteArray('xor_a', s);
	var b = GetByteArray('xor_b', s);
	var c = GetByteArray('xor_c', s);
	var d = GetByteArray('xor_d', s);
	var bi = 0, ci = 0, di = 0;
	for (var ai=0; ai<a.length; ai++)
	{
		var x = a[ai];
		if (bi < b.length) x ^= b[bi++];
		if (c.length > 0) x ^= c[ci++]; if (ci >= c.length) ci = 0;
		if (d.length > 0) x = (x + d[di++]) & 0xFF; if (di >= d.length) di = 0;
		r[ai] = x;
	}
	document.getElementById('xor_result_string').value = byteArrayToString2(r);
	document.getElementById('xor_result_hex').value = byteArrayToHex(r);
}

function OnXorModeChanged()
{
	var r = document.getElementById('xor_string').checked;
	String2Hex('xor_a', r);
	String2Hex('xor_b', r);
	String2Hex('xor_c', r);
	String2Hex('xor_d', r);
}
