// Generic Unit Conversion Program
// Author    : Jonathan Weesner (jweesner@cyberstation.net)  21 Nov 95
//           : Modified 20 Aug 2002 by 2WC - 2wc.com.au


function convertform(form){
	//alert ("form = " + form);
	var firstvalue = 0;
	for (var i = 0; i < form.length; i++) {
		// Find first non-blank entry
		if (form.elements[i].value != null && form.elements[i].value.length != 0) {
			if (i == 0 && form.elements[1].value != "") {
				clearform(form)
			} else {
			// Save the field that the value is drawn from
		  	var field = i;
          	firstvalue = form.elements[i].value / form.elements[i].factor;
          	break;
			}
		}
    }
	
    if (firstvalue == 0) {
       clearform(form);
    }
	
    for (var i = 0; i < form.length; i++) {
		if (form == document.joule) {
			//alert ("joule calc: value= " + (firstvalue * form.elements[i].factor) + " :field = " + field + " :form.rsize = " + form.rsize);
			form.elements[i].value = formatJoule((firstvalue * form.elements[i].factor), field, form.rsize);
		} else {
			form.elements[i].value = formatvalue((firstvalue * form.elements[i].factor), form.rsize);
			//var numx = form.elements[i].factor;
			//alert(numx.toFixed(2));
			//alert(numx);
			
		}
	}
}

function formatvalue(input, rsize) {
	if(input > 1000) {
		return round_decimals(input, 0, rsize);
	} 
	else if (1000 < input > 10) {
		return round_decimals(input, 1, rsize);
	}
	else if (10 < input > .1) {
		return round_decimals(input, 2, rsize);
	}
	else if (.1 < input > .01) {
		return round_decimals(input, 3, rsize);
	}
	else if (.10 < input > .001) {
		return round_decimals(input, 4, rsize);
	}
	else {
		return round_decimals(input, 8, rsize);
	}
}

/* Use different function for Joule as numbers are large and 
cause problems when converted to binary and back again */

function formatJoule(input, field, rsize) {
	switch (field) {
		case 0:
			return round_decimals(input, 15, rsize);
			break;
		case 1:
			return round_decimals(input, 12, rsize);
			break;
		case 2:
			return round_decimals(input, 9, rsize);
			break;
		case 3:
			return round_decimals(input, 6, rsize);
			break;
		case 4:
			return round_decimals(input, 3, rsize);
			break;
		case 5:
			return round_decimals(input, 0, rsize);
			break;
		default:
			return round_decimals(input, 0, rsize);
			break;
	}
}

function resetform(form) {
    clearform(form);
    form.elements[1].value = 1;
    convertform(form);
   return true;
}
function clearform(form) {
    for (var i = 0; i < form.length; i++) form.elements[i].value = "";
   //return true;
}

function round_decimals(original_number, decimals, rsize) {
	var invalid = "**************************";
	var nines = "999999999999999999999999";

	//alert ("rounding number: "  + original_number + " to " +  decimals + " decimal palces");
    var result1 = original_number * Math.pow(10, decimals)
    var result2 = Math.round(result1)
    var result3 = result2 / Math.pow(10, decimals)
	
	if (result1 == 0) {
		return result1;
	} else if (result3 == 0) {
		return invalid;
	} else {
		if (result3 > parseFloat(nines.substring(0,rsize)+".4")) {
			return invalid.substring(0, rsize);
		} else {
	    return result3;
		}
	}
}


