function initialize() {                                                         //>Initialize
fillLists();                                                                   // FillLists (base, target)
document.getElementById("value").value = "";                                   // Write into value-field
//document.getElementById("value").focus();                                      // Set focus to value-field
document.getElementById("value").select();                                     // Select 'popup' in value field
calculate();  }                                                                // Calculate -> '- - - - -' in result

function newType()   { clearLists();                 fillLists();               //>NewType
calculate();                  setFocus();  }             //
function newValue()  { calculate();                  setFocus();  }             //>NewValue
function newBase()   { calculate();                  setFocus();  }             //>NewBase
function newTarget() { calculate();                  setFocus();  }             //>NewTarget
function setFocus()  { document.getElementById("value").focus();  }             //>SetFocus

function clearLists() {                                                         //>ClearLists (base, target)
var base   = document.getElementById("base");                                  // Get Html-element of the base
var target = document.getElementById("target");                                // Get Html-element of the target
for (var i=base.length-1; i>=0; i--) {                                         // Loop: content of the lists
base.options[i]   = null;                                                    //   Void base-item
target.options[i] = null;  } }                                               //   Void target-item

function calculate() {                                                          //>Calculate
var type        = document.getElementById("type");                             // Html-Element of type (category)
var typeID      = type.options[type.selectedIndex].id;                         // ID of the choosen type
var input       = document.getElementById("value").value;                      // Content (text) of input-value
var white       = input.match(/\s*/);                                          // White spaces in input (for opera)
var value       = parseFloat(input.replace(/,/,'.'));                          // Parsed string with ','->'.' or NaN
var baseValue   = document.getElementById("base").value;                       // Base-value
var targetValue = document.getElementById("target").value;                     // Target-value
if (isNaN(value) || (white && input==white)) {                                 // No valid number or only whitespaces
document.getElementById("result").value=" - - - - - -";   return; }         //    -> Clear result value
if (typeID=="temperature") {                                                   // On Temperature:
calculateTemperature(value, baseValue, targetValue);     return; }         //    -> Calculate Temperature
var result = value * baseValue / targetValue;                                  // Else: Convert value to result
var result = (Math.round(result*1000))/1000
document.getElementById("result").value = result;  }                           //       Write result in text-field

function validateInput(input, base) {                                           //>ValidateInput (for number systems)
var decimal = parseInt(input, base);                                           // Convert input-value->decimal-integer
if (isNaN(decimal)) decimal = "";                                              // No decimal number  ->void input-field
var valid = decimal.toString(base);                                            // Convert decimal back to base-system
document.getElementById("value").value = valid;                                // Write validated value to input field
return valid; }                                                                // Return validated value

function calculateTemperature(value, base, target) {                            //>CalculateTemperature
var celsius = Number.NaN;                                                      // Convert base to celsius
if      (base=="[F]")    celsius = (value-32)*5/9;                             //     [F] -> [C]
else if (base=="[C]")    celsius =  value;                                     //     [C] -> [C]
else if (base=="[K]")    celsius =  value-273.15;                              //     [K] -> [C]                     //     [R] -> [C]
var result = Number.NaN;                                                       // Convert celsius to target
if      (target=="[F]")  result  = (celsius*9/5)+32                            //     [C] -> [F]
else if (target=="[C]")  result  =  celsius;                                   //     [C] -> [C]
else if (target=="[K]")  result  =  celsius+273.15;                            //     [C] -> [K]
document.getElementById("result").value = result;  }                           // Write result in text-field

function enlist(text, value) {                                                  //>Enlist given items to base & target
var base   = document.getElementById("base");                                  // Html-Element for Base-Unit
var target = document.getElementById("target");                                //                  Target-Unit
base.options[base.length]     = new Option(text, value);                       // Set Html-Properties to base
target.options[target.length] = new Option(text, value); }                     //                        target

function fillLists() {                                                          //>FillLists
var type   = document.getElementById("type");                                  // Get Html-Element of the 'type'
var typeID = type.options[type.selectedIndex].id;                              // Get the ID of the selected type
if      (typeID=="temperature") {                                              // Temperatures:
enlist("Celsius",                            "[C]");                         //   [C] is base
enlist("Fahrenheit",                         "[F]");                         //   [F] = [C]*9/5 + 32
enlist("Kelvin",                             "[K]");                         //   [K] = [C] + 273.15 
document.getElementById("base").options[1].selected   = true;                //   Preselect farenheit for base
document.getElementById("target").options[0].selected = true; }              //   Preselect celcius for target
else if (typeID=="length") {                                                   // Lengths:
enlist("Metres",                              1.0);                          //   1 [m]  is base
enlist("Kilometres",                         1000.0);                        //   1 [km]   = 1000             [m]
enlist("Centimetres",                         0.01);                        //   1 [cm]   = 0.01             [m]
enlist("Millimetres",                        0.001);                         //   1 [mm]   = 0.001            [m]
enlist("Microns",               0.000001);                                   //   1 [um]   = 0.000001         [m]
enlist("Nanometres",                         1e-9);                          //   1 [nm]   = 1e-9             [m]
enlist("Inches",                              0.0254);                       //   1 [in]   = 0.0254           [m]
enlist("Feet",                              0.3048);                         //   1 [ft]   = 0.3048           [m]
enlist("Yards",                              0.9144);                        //   1 [yd]   = 0.9144           [m]
enlist("Miles",                              1609.344);                      //   1 [mi]   = 1609.344         [m]
enlist("Nautical Miles",                     1852.0);                        //   1 [n mi] = 1852             [m]
enlist("Light Years",                        9460730472580800);              //   1 [LY]   = 9460730472580800 [m]
document.getElementById("base").options[8].selected   = true;                //   Preselect miles for base
document.getElementById("target").options[1].selected = true; }              //   Preselect kilometres for target
else if (typeID=="area") {                                                     // Areas:
enlist("Square Metres",                     1.0);                            //   1 [m^2] S is base
enlist("Square Kilometres",                1000000.0);                       //   1 [km^2]  = 1000000         [m^2]
enlist("Square Centimetres",               0.0001);                          //   1 [cm^2]  = 0.0001          [m^2]
enlist("Square Millimetres",               0.000001);                        //   1 [mm^2]  = 0.000001        [m^2]
enlist("Hectares",                           10000.0);                       //   1 [ha]    = 10000           [m^2]
enlist("Acres",                            4046.8564224);                    //   1 [acre]  = 4046.8564224    [m^2]
enlist("Square Inches",                     0.00064516);                     //   1 [in^2]  = 0.00064516      [m^2]
enlist("Square Feet",                     0.09290304);                       //   1 [ft^2]  = 0.09290304      [m^2]
enlist("Square Yards",                     0.83612736);                      //   1 [yd^2]  = 0.83612736      [m^2]
enlist("Square Miles",                     2589988.110336);                  //   1 [mi^2]  = 2589988.110336  [m^2]
document.getElementById("base").options[7].selected   = true;                //   Preselect sq feet for base
document.getElementById("target").options[0].selected = true; }              //   Preselect sq metres for target
else if (typeID=="volume") {                                                   // Volumes:
enlist("Cubic Metres",                      1.0);                            //   1 [m^3] is base
enlist("Cubic Kilometres",                 1000000000.0);                    //   1 [km^3]    = 1000000000      [m^3]
enlist("Litres",                           0.001);                           //   1 [dm^3]    = 0.001           [m^3]
enlist("Millilitres",                      0.000001);                        //   1 [cm^3]    = 0.000001        [m^3]
enlist("Microlitres",                      1e-9);                            //   1 [mm^3]    = 1e-9            [m^3]
enlist("Cubic Inches",                      0.000016387064);                 //   1 [in^3]    = 0.000016387064  [m^3]
enlist("Cubic Feet",                      0.028316846592);                   //   1 [ft^3]    = 0.028316846592  [m^3]
enlist("Cubic Yards",                      0.764554857984);                  //   1 [yd^3]    = 0.764554857984  [m^3]
enlist("Gallons (British)",              0.00454609);                        //   1 [gal-b]   = 0.00454609      [m^3]
enlist("Gallons (US)",                   0.003785411784);            //   1 [gal-u]   = 0.003785411784  [m^3]
enlist("Cups (US)",                        0.0002365882365);           //   1 [c-us]    = 0.0002365882365 [m^3]
enlist("Cups (metric)",                    0.000250);                  //   1 [c-me]    = 0.000250        [m^3]
enlist("Fluid Ounces (US)",            0.0000295735295625);        //   1 [fl.oz-us]= 0.00002957352956[m^3]
enlist("Pints (US)",                      0.000473176473);            //   1 [pt-us]   = 0.000473176473  [m^3]
enlist("Quarts (US)",                     0.000946352946);            //   1 [qt-us]   = 0.000946352946  [m^3]
enlist("Tablespoons (US)",             14.7867647825e-6);          //   1 [tbsp-us] = 14.7867647825e-6[m^3]
enlist("Tablespoons (metric)",         15e-6);                     //   1 [tbsp-me] = 15e-6);         [m^3]
enlist("Teaspoons (US)",                4.928921595e-6);            //   1 [tsp-us]  = 4.928921595e-6  [m^3]
enlist("Teaspoons (metric)",            5.0e-6);                   //   1 [tsp-me]  = 5.0e-6          [m^3]
document.getElementById("base").options[9].selected   = true;                //   Preselect gallons for base
document.getElementById("target").options[2].selected = true; }              //   Preselect sq litres for target
else if (typeID=="time") {                                                     // Time:
enlist("Seconds",                            1.0);                       //   1 [s] is base
enlist("Minutes",                          60.0);                      //   1 [min]  = 60          [s]
enlist("Hours",                              3600.0);                    //   1 [h]    = 3600        [s]
enlist("Days",                               86400.0);                   //   1 [d]    = 86400       [s]
enlist("Weeks",                             604800.0);                  //   1 [wk]   = 604800      [s]
enlist("Years",                            31536000.0);                //   1 [a-c]  = 31536000    [s]
enlist("Decades",             315360000.0);               //   1 [dec]  = 315360000   [s]
enlist("Centuries",                        3153600000.0);              //   1 [c-c]  = 3153600000  [s]
enlist("Millennia",                        31536000000.0);             //   1 [m-c]  = 31536000000 [s]
enlist("Milliseconds",                     0.001);                     //   1 [m-c]  = 31536000000 [s]
enlist("Microseconds",                     0.000001);                  //   1 [m-c]  = 31536000000 [s]
enlist("Nanoseconds",                      0.000000001);             //   1 [m-c]  = 31536000000 [s]
document.getElementById("base").options[0].selected   = true;                //   Preselect seconds for base
document.getElementById("target").options[1].selected = true; }              //   Preselect minutes for target
else if (typeID=="speed") {                                                    // Speed:
enlist("Metres per second",                 1.0);                       //   1 [m/s] is base
enlist("Metres per minute",               1.0/60.0);                  //   1 [m/min]  = 1/60          [m/s]
enlist("Metres per hour",                   1.0/3600.0);                //   1 [m/h]    = 1/3600        [m/s]
enlist("Kilometres per second",            1000.0);                    //   1 [km/s]   = 1000          [m/s]
enlist("Kilometres per minute",          1000.0/60.0);               //   1 [km/min] = 1000/60       [m/s]
enlist("Kilometres per hour",              1000.0/3600.0);             //   1 [km/h]   = 1000/3600     [m/s]
enlist("Miles per second",                 1609.344);                  //   1 [mps]    = 1609.344      [m/s]
enlist("Miles per minute",                 1609.344/60.0);             //   1 [mpm]    = 1609.344/60   [m/s]
enlist("Miles per hour",                   1609.344/3600.0);           //   1 [mph]    = 1609.344/3600 [m/s]
enlist("Feet per second",                  0.3048);                    //   1 [fps]    = 0.3048        [m/s]
enlist("Feet per minute",                  0.3048/60.0);               //   1 [fpm]    = 0.3048/60     [m/s]
enlist("Feet per hour",                    0.3048/3600.0);             //   1 [fph]    = 0.3048/3600   [m/s]
enlist("Inches per second",                  0.0254);                    //   1 [ips]    = 0.0254        [m/s]
enlist("Inches per minute",                  0.0254/60.0);               //   1 [ipm]    = 0.0254/60     [m/s]
enlist("Inches per hour",                    0.0254/3600.0);             //   1 [iph]    = 0.0254/3600   [m/s]
enlist("Knots",                               1852.0/3600.0);             //   1 [kn]     = 1852.0/3600   [m/s]
document.getElementById("base").options[8].selected   = true;                //   Preselect mph for base
document.getElementById("target").options[5].selected = true; }              //   Preselect kph for target
else if (typeID=="mass") {                                                     // Mass:
enlist("Kilograms",              1.0);                       //   1 [kg] is base
enlist("Grams",                       0.001);                     //   1 [g]     = 0.001          [kg]
enlist("Metric Tons",                        1000.0);                    //   1 [t]     = 1000           [kg]
enlist("Long Tons (UK)",                    1016.0469088);              //   1 [tn]    = 1016.0469088   [kg]
enlist("Short Tons (US)",                907.18474);                 //   1 [sh tn] = 907.18474      [kg]
enlist("Ounces",      0.028349523125);            //   1 [oz]    = 0.028349523125 [kg]
enlist("Pounds",        0.45359237);              //   1 [lb-t]  = 0.45359237   [kg]
enlist("Stone",                     6.35029318);               //   1 [st]    = 6.35029318     [kg]
document.getElementById("base").options[6].selected   = true;                //   Preselect pounds for base
document.getElementById("target").options[0].selected = true; }              //   Preselect kilograms for target
else if (typeID=="power") {                                                    // Power:
enlist("Joules per second",                 1.0);                       //   1 [J/s]   = 1.0              [Nm/s] is base
enlist("Kilojoules per hour",              1000.0/3600.0);             //   1 [kJ/h]  = 1000.0/3600.0    [Nm/s]
enlist("Watts",                               1.0);                       //   1 [W]     = 1.0              [Nm/s]
enlist("Kilowatts",                          1000.0);                    //   1 [kW]    = 1000.0           [Nm/s]
enlist("Megawatts",                          1000000.0);                 //   1 [MW]    = 1000000.0        [Nm/s]
enlist("Kilocalories per hour",          4186.8/3600.0);             //   1 [kcal/h]= 1.16263888888889 [Nm/s]
enlist("Horsepower",                 745.69987158227022);        //   1 [HP]    = 745.699871582270 [Nm/s]
enlist("Manpower",                74.569987158227022);        //   1 [MP]    = 74.5699871582270 [Nm/s]
enlist("Newtonmeter per second",          1.0);                       //   1 [Nm/s] 
document.getElementById("base").options[6].selected   = true;                //   Preselect horsepower for base
document.getElementById("target").options[3].selected = true; }              //   Preselect kilowatts for target
else if (typeID=="energy") {                                                   // Energy:
enlist("Joules",               1.0);                       //   1 [J]      = 1.0               [Nm] is base
enlist("Kilojoules",                         1000.0);                    //   1 [kJ]     = 1000.0            [Nm]
enlist("Watt seconds",                       1.0);                       //   1 [Ws]     = 1.0               [Nm]
enlist("Watt hours",                         3600.0);                    //   1 [Wh]     = 3600.0            [Nm]
enlist("Kilowatt hours",                    3600000.0);                 //   1 [kWh]    = 3600000.0         [Nm]
enlist("Calories",     4.1868);                    //   1 [cal]    = 4.1855            [Nm]
enlist("Kilogram Calories",        4186.8);                    //   1 [C, kcal]= 4185.5            [Nm]
enlist("Newton-Metres",                       1.0)                       //   1 [Nm] is base
document.getElementById("base").options[2].selected   = true;                //   Preselect watt seconds for base
document.getElementById("target").options[6].selected = true; }              //   Preselect kilogram calories for target
else if (typeID=="pressure") {
enlist("Kilograms/Square Meter",                 1.0);
enlist("Pounds/Square Foot",                     4.88242764);
enlist("Pounds/Square Inch",                     703.06957963916318);
enlist("Atmospheres",                            10332.2745);
enlist("Bars",                                   10197.1621);
enlist("Centimeters of Mercury",                 135.950981);
enlist("Inches of Mercury",                      345.31554);
enlist("Pascals",                                9.80665000000000); 
document.getElementById("base").options[2].selected   = true;                //   Preselect pounds per sq inch for base
document.getElementById("target").options[0].selected = true; }              //   Preselect kg per sq meter for target
}