/**
 * Copyright (C) A. Ellerton 2006, http://software.ellerton.net/
 *
 * My first javascript application, so any flaws/errors are my own.
 */
zeros="00000000000000000000000000000000" // for padding

// take a number like "101" and pad to "00000101"
function pad(width, converted) {
	var numChars=width-converted.length;
	return zeros.substr(0,numChars)+converted;
}

// certain chars need to be escaped to show up properly in 
// the results section
function myEscape(c) {
	switch (c) {
	case ' ': return '&nbsp;'
	case '\n': return '&#8629;'
	case '<': return '&lt;';
	case '>': return '&gt;';
	default: return c;
	}
}

function regenerate() {
	var src=document.getElementById('input')
	var dest=document.getElementById('result')
	var raw=src.value
	var gen=""
	var base=2
	var padWidth=parseInt(document.getElementById('padwidth').value)
	if(isNaN(padWidth)) padWidth=0
	var breakdown=document.getElementById('breakdown').checked
	var sep=document.getElementById('sep').value
	var linewidth=parseInt(document.getElementById('width').value)
	if (document.getElementById('mode_hex').checked) {
		base=16;
	} else if (document.getElementById('mode_dec').checked) {
		base=10;
	}
	// If the separator is a newline, it gets ugly to break line width
	if (sep=='<br/>') linewidth=0
		
	for (i=0;i<raw.length;i++) { // Firefox works with "for i in raw", but not IE
		var converted=""+raw.charCodeAt(i).toString(base)
		if (padWidth>0) converted=pad(padWidth, converted)
		if (breakdown) {
			//gen+=String(myEscape(c))+"="+converted+"<br/>"
			gen=gen.concat(myEscape(raw.charAt(i)), "<span class='eq'>=</span><span class='val'>", converted, "</span><br/>")
		} else {
			if (i>0) gen+=sep
			gen+=converted
		}
	}
	if (linewidth > 0 && !breakdown) {
		var pattern=new RegExp("(.{"+linewidth+"})", "g")
		gen=gen.replace(pattern, "$1<br/>" )
	}
	dest.innerHTML=gen
}

function changeOption() {
	regenerate()
}

function doInit() {
	setInput('Hello, World', 'bin', 32, 8, '', true)
	regenerate()
}

function toggle(name) {
	var element=document.getElementById(name)
	element.checked = !element.checked
	changeOption()
}

function select(name) {
	var element=document.getElementById(name)
	element.checked = true
	changeOption()
}

function setInput(text, mode, width, padwidth, sep, breakdown) {
	var input=document.getElementById('input')
	input.value=text // "Hello,??"
	if (undefined!=mode) document.getElementById('mode_'+mode).checked=true
	if (undefined!=width) document.getElementById('width').value=width
	if (undefined!=padwidth) document.getElementById('padwidth').value=padwidth
	if (undefined!=sep) document.getElementById('sep').value=sep
	if (undefined!=breakdown) document.getElementById('breakdown').checked=breakdown
	changeOption()
	input.focus()
	input.select()
}

function addValue(node_id, delta) {
	var node=document.getElementById(node_id)
	var i=parseInt(node.value)
	i += delta
	node.value=i.toString()
	changeOption()
}

function setValue(node_id, v) {
	var node=document.getElementById(node_id)
	node.value=v
	changeOption()
}

function autoPadWidth() {
	// I'm sure there is a better way to check the setting of a radio button...
	var w;
	if (document.getElementById('mode_hex').checked) {
		w=4
	} else if (document.getElementById('mode_dec').checked) {
		w=4
	} else {
		var w=8
	}
	setValue('padwidth', w)
}

function autoWidth() {
	var widthNode=document.getElementById('width').value=width
	var padNode=document.getElementById('padwidth')
	var sepNode=document.getElementById('sep')
	
	var w=parseInt(padNode.value)+sepNode.value.length
	w*=4
	widthNode.value=w.toString()
	changeOption()
}


