var defaultCatIndex = 0;
var defaultFromIndex = 0;
var defaultToIndex = 0;

function setUpCalculator()
{
    // Set up category
    updateCategory();
    categoryChanged(document.getElementById("categoryPopUp"));
    
    // Set up from
    var select = document.getElementById("fromPopUp");
    updateUnitSelect(select);
    select.options[defaultFromIndex].selected = true;
    fromChanged(select);
    
    // Set up to
    select = document.getElementById("toPopUp");
    updateUnitSelect(select);
    select.options[defaultToIndex].selected = true;
    toChanged(select);
}

function updateCategory()
{
    // Update category pop up
    var select = document.getElementById("categoryPopUp");
    
    for (var i = 0; i < Categories.length; i++) {
        var element = document.createElement("option");
        element.innerText = getLocalizedString(Categories[i].name);
        element.setAttribute("name", Categories[i].name);
        select.appendChild(element);
    }
    
    select.options[defaultCatIndex].selected = true;
}

function updateUnitSelect(select)
{
    // Remove old options
    while (select.hasChildNodes()) {
        select.removeChild(select.firstChild);
    }
    
    // Get units
    var units = Categories[defaultCatIndex].array;
    
    for (var i = 0; i < units.length; i++) {
        var element = document.createElement("option");
        element.innerText = getLocalizedString(units[i].name);
        element.setAttribute("name", units[i].name);
        select.appendChild(element);
    }
}

function updateResult()
{
    // Get result label
    var result = document.getElementById("result");
    
    // Get value
    var fromValue = document.getElementById("fromInput").value;
    var toValue = document.getElementById("toInput").value;
    if (fromValue.length == 0 || toValue.length == 0) {
        result.innerText = "";
        return;
    }
    
    // Get unit
    var fromUnit = Categories[defaultCatIndex].array[defaultFromIndex].name;
    var toUnit = Categories[defaultCatIndex].array[defaultToIndex].name;
    
    // Set resutl string
    result.innerText = fromValue + " " + getLocalizedString(fromUnit) + " は、" + toValue + " " + getLocalizedString(toUnit) + "です。";
}

function categoryChanged(select)
{
	// Get category name
	defaultCatIndex = select.selectedIndex;
	var categoryName = Categories[defaultCatIndex].name;
	
	// Update label
	document.getElementById("categoryLabel").innerText = getLocalizedString(categoryName);
	
	// Clear from and to index
	defaultFromIndex = 0;
    defaultToIndex = 0;

	// Update from
    var fromSelect = document.getElementById("fromPopUp");
    updateUnitSelect(fromSelect);
    fromSelect.options[defaultFromIndex].selected = true;
    fromChanged(fromSelect);
    
    // Update to
    var toSelect = document.getElementById("toPopUp");
    updateUnitSelect(toSelect);
    toSelect.options[defaultToIndex].selected = true;
    toChanged(toSelect);
    
	// Clear the input fields
    document.getElementById("fromInput").value = "";
    document.getElementById("toInput").value ="" ;
    
    // Clear result
    document.getElementById("result").innerText = "";
}

function fromChanged(select)
{
	// Get from name
	defaultFromIndex = select.selectedIndex;
	var fromName = Categories[defaultCatIndex].array[defaultFromIndex].name;
	
	// Update label
	document.getElementById("fromLabel").innerText = getLocalizedString(fromName);
	
    // Convert amount
	convert(document.getElementById("fromInput").value, "left");
	
	// Update result
	updateResult();
}

function fromKeyUp(input)
{
    // Convert amount
	convert(document.getElementById("fromInput").value, "left");
	
	// Update result
	updateResult();
}

function toChanged(select)
{
	// Get to name
	defaultToIndex = select.selectedIndex;
	var toName = Categories[defaultCatIndex].array[defaultToIndex].name;
	
	// Update label
	document.getElementById("toLabel").innerText = getLocalizedString(toName);
	
    // Convert amount
	convert(document.getElementById("fromInput").value, "left");
	
	// Update result
	updateResult();
}

function toKeyUp(input)
{
    // Convert amount
	convert(document.getElementById("toInput").value, "right");
	
	// Update result
	updateResult();
}

function convert(amount, from)
{
    var convertedValue = "";
    
    // Get unit array
    var unitArray = Categories[defaultCatIndex].array;
    var c = unitArray.length;
    
    // Get index
   	var fromIndex = (from == "left" ? defaultFromIndex : defaultToIndex);
   	var toIndex = (from == "left" ? defaultToIndex : defaultFromIndex);
    
	var floatAmount = parseFloat(amount);
    
    if (isNaN(floatAmount) == false) {
    	var baseValue ="";
    	
    	// Avoid conversion errors if from and to index are the same
    	if (fromIndex == toIndex) {
    		convertedValue = floatAmount;
    	}
    	else {
 			var baseValue = unitArray[fromIndex].toBase(floatAmount); 
			convertedValue = unitArray[toIndex].fromBase(baseValue);
			var precision = Categories[defaultCatIndex].precision;
			convertedValue = String(convertedValue);
    	}
  	}
  	
    var element = (from=="left" ? 
            document.getElementById("toInput") : 
            document.getElementById("fromInput"));
    element.value = convertedValue;
}

function getLocalizedString (key)
{
	try {
		var ret = localizedStrings[key];
		if (ret === undefined)
			ret = key;
		return ret;
	} catch (ex) {}
	
	return key;
}
