function initialize() {                                                         //>Initialize
 fillLists();                                                                   // FillLists (base, target)
 document.getElementById("value").value = "popup";                              // Write 'popup' 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 enter() {                                                              //>Enter pressed
 var input = document.getElementById("value").value;                            // Value of the input-field
 if (input=="popup")                                                            // On 'popup'
   var pop = window.open("units.html","",                                       // -> Open converter in a popup
       "resizable=yes,scrollbars=no,width=365,height=180,left=50,top=8"); }     //    with several window options

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 (typeID=="numbersystem") {                                                  // On Numbersystem:
     calculateNumbersystem(input, baseValue, targetValue);    return; }         //    -> Calculate Numbersystem
 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
 document.getElementById("result").value = result;  }                           //       Write result in text-field

function calculateNumbersystem(input, base, target) {                           //>CalculateNumbersystem
 var valid   = validateInput(input, base);                                      // Validate the input-field (value)
 var decimal = parseInt(valid, base);                                           // Convert input-value to decimal
 var result  = decimal.toString(target);                                        // Convert decimal-value to target syst.
 document.getElementById("result").value = result;  }                           // Write target-value to result 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]
 else if (base=="[R]")    celsius = (value*5/9)-273.15;                         //     [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]
 else if (target=="[R]")  result  = (celsius+273.15)*9/5;                       //     [C] -> [R]
 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=="length") {                                                   // Lengths:
   enlist("[m] Meter",                              1.0);                       //   1 [m]  is base
   enlist("[km] Kilometer",                         1000.0);                    //   1 [km]   = 1000             [m]
   enlist("[dm] Decimeter",                         0.1);                       //   1 [dm]   = 0.1              [m]
   enlist("[cm] Centimeter",                        0.01);                      //   1 [cm]   = 0.01             [m]
   enlist("[in] Inch = 1/36 yd",             0.0254);                    //   1 [in]   = 0.0254           [m]
   enlist("[ft] Feet",                        0.3048);                    //   1 [ft]   = 0.3048           [m]
   enlist("[yd] Yard",                    0.9144);                    //   1 [yd]   = 0.9144           [m]
   enlist("[ha] Hands (Br.)",           0.1016);                    //   1 [ha]   = 0.1016           [m]
   enlist("[sp] Span (Br.)",               0.2286);                    //   1 [sp]   = 0.2286           [m]
   enlist("[mi] Mile (Br.)",                1609.344);                  //   1 [mi]   = 1609.344         [m]
   enlist("[mi-u] Mile (U.S. Survey)",              1609.347219);               //   1 [mi-u] = 1609.347219      [m]
   enlist("[NM, n mi] Nautical mile | Seemeile",    1852.0);                    //   1 [n mi] = 1852             [m]
   enlist("[ch] Chain (Br.)",              20.1168);                   //   1 [ch]   = 20.1168          [m]
   enlist("[li] Links (Br.)",       0.201168);                  //   1 [li]   = 0.201168         [m]
   enlist("[BC] Barleycorn (Br.)",                  0.008467);                  //   1 [BC]   = 0.008467         [m]
   enlist("[fur] Furlong (Br.)",      201.168);                   //   1 [fur]  = 201.168          [m]
   enlist("[fth] Fathom (Br.)",             1.8288);                    //   1 [fth]  = 1.8288           [m]
   enlist("[ftu] Fathom (Hungary)",        1.8964838); }                //   1 [ftu]  = 1.8964838        [m]
 else if (typeID=="area") {                                                     // Areas:
   enlist("[m^2] Square meter",                     1.0);                       //   1 [m^2] S is base
   enlist("[km^2] Square kilometer",                1000000.0);                 //   1 [km^2]  = 1000000         [m^2]
   enlist("[dm^2] Square decimeter",                0.01);                      //   1 [dm^2]  = 0.01            [m^2]
   enlist("[cm^2] Square centimeter",               0.0001);                    //   1 [cm^2]  = 0.0001          [m^2]
   enlist("[a] Are",                           100.0);                     //   1 [a]     = 100             [m^2]
   enlist("[ha] Hectare",                  10000.0);                   //   1 [ha]    = 10000           [m^2]
   enlist("[acre] Acre (Br.)",             4046.8564224);              //   1 [acre]  = 4046.8564224    [m^2]
   enlist("[Mg-Wü] Morgen (Württemberg)",           3152.0);                    //   1 [Mg-Wü] = 3152            [m^2]
   enlist("[Mg-Pr] Morgen (Preussen)",              2553.22);                   //   1 [Mg-Pr] = 2553.22         [m^2]
   enlist("[Mg-Ba] Morgen (Baden)",                 3600.0);                    //   1 [Mg-Ba] = 3600            [m^2]
   enlist("[Mg-Ha] Morgen (Hannover)",              2621.0);                    //   1 [Mg-Ha] = 2621            [m^2]
   enlist("[Mg-He] Morgen (Hessen) [vha]",          2500.0);                    //   1 [Mg-He] = 2500            [m^2]
   enlist("[Mg-Fr] Morgen (Franken)",               2000.0);                    //   1 [Mg-Fr] = 2000            [m^2]
   enlist("[Mg-Ol] Morgen (Oldenburg)",             2256.0);                    //   1 [Mg-Ol] = 2256            [m^2]
   enlist("[Mg-OJ] Morgen (Oldenburg-Jück)",        4538.0);                    //   1 [Mg-OJ] = 4538            [m^2]
   enlist("[Mg-Ka] Morgen (Kassel)",                2386.0);                    //   1 [Mg-Ka] = 2386            [m^2]
   enlist("[Mg-Ka] Morgen (Bremen)",                2572.0);                    //   1 [Mg-Ka] = 2572            [m^2]
   enlist("[Mg-Kn] Morgen (Köln)",                  3176.0);                    //   1 [Mg-Kn] = 3176            [m^2]
   enlist("[Mg-By] Morgen (Bayern)",                3407.0);                    //   1 [Mg-By] = 3407            [m^2]
   enlist("[Mg-HH] Morgen (Hamburg)",               9658.0);                    //   1 [Mg-HH] = 9658            [m^2]
   enlist("[Mg-HH] Morgen (HH: Geest-Scheffel)",    4205.0);                    //   1 [Mg-HH] = 4205            [m^2]
   enlist("[Mg-KM] Morgen (Kehdinger Marschmorgen)",10477.0);                   //   1 [Mg-KM] = 10477           [m^2]
   enlist("[Mg-Hd] Morgen (Hadeln)",                11780.0);                   //   1 [Mg-Hd] = 11780           [m^2]
   enlist("[Mg-Ho] Morgen (Holstein)",              5046.0);                    //   1 [Mg-Ho] = 5046            [m^2]
   enlist("[Mg-SH] Morgen (Schleswig-Holstein)",    5466.0);                    //   1 [Mg-SH] = 5466            [m^2]
   enlist("[Mg-Ku] Morgen (Kulmischer Morgen)",     5601.17);                   //   1 [Mg-Ku] = 5601.17         [m^2]
   enlist("[Mg-Of] Morgen (Ostfriesland)",          5674.0);                    //   1 [Mg-Of] = 5674            [m^2]
   enlist("[Mg-Me] Morgen (Mecklenburg)",           6500.0);                    //   1 [Mg-Me] = 6500            [m^2]
   enlist("[Mg-Me] Morgen (Harburg & Stade)",       8185.0);                    //   1 [Mg-Me] = 8185            [m^2]
   enlist("[Mg-Br] Morgen (Brasil)",                4046.8564224);              //   1 [Mg-Br] = 4046.8564224    [m^2]
   enlist("[Mg-Fr] Morgen (France)",                5200.0);                    //   1 [Mg-Fr] = 5200            [m^2]
   enlist("[Mg-Un] Morgen (Hungary)",               5754.6412858599);           //   1 [Mg-Un] = 5754.6412858599 [m^2]
   enlist("[in^2] Square Inch",       0.00064516);                //   1 [in^2]  = 0.00064516      [m^2]
   enlist("[ft^2] Square feet",        0.09290304);                //   1 [ft^2]  = 0.09290304      [m^2]
   enlist("[yd^2] Square yard ",    0.83612736);                //   1 [yd^2]  = 0.83612736      [m^2]
   enlist("[mi^2] Square mile (Br.)",               2589988.110336);            //   1 [mi^2]  = 2589988.110336  [m^2]
   enlist("[NM^2] Square naut. mile",               3429904);                   //   1 [nm^2]  = 3429904         [m^2]
   enlist("[sq rd] Square rod (Br. & Am.)",         25.29285264);               //   1 [sq rd] = 25.29285264     [m^2]
   enlist("[ro] Rood (Br. & Am.)",                  1011.7141056);              //   1 [ro]    = 1011.7141056    [m^2]
   enlist("[se] Section = square mile",             2589988.110336);            //   1 [se]    = 2589988.110336  [m^2]
   enlist("[sq-ch] Square chain (Br.)",             404.68564224);              //   1 [sq-ch] = 404.68564224    [m^2]
   enlist("[sFtu] Square Fathom (Hungary)",         3.5966508036624396);}        //   1 [sFtu]  = 3.59665080366244[m^2]
 else if (typeID=="volume") {                                                   // Volumes:
   enlist("[m^3] Cubic meter",                      1.0);                       //   1 [m^3] is base
   enlist("[km^3] Cubic kilometer",                 1000000000.0);              //   1 [km^3]    = 1000000000      [m^3]
   enlist("[dm^3] Liter",                           0.001);                     //   1 [dm^3]    = 0.001           [m^3]
   enlist("[cm^3] Milliliter",                      0.000001);                  //   1 [cm^3]    = 0.000001        [m^3]
   enlist("[mm^3] Microliter",                      1e-9);                      //   1 [mm^3]    = 1e-9            [m^3]
   enlist("[in^3] Cubic inch",          0.000016387064);            //   1 [in^3]    = 0.000016387064  [m^3]
   enlist("[ft^3] Cubic foot",           0.028316846592);            //   1 [ft^3]    = 0.028316846592  [m^3]
   enlist("[yd^3] Cubic yard",       0.764554857984);            //   1 [yd^3]    = 0.764554857984  [m^3]
   enlist("[gal-b] Gallons (Br.)",  0.00454609);                //   1 [gal-b]   = 0.00454609      [m^3]
   enlist("[gal-u] Gallons (Am.)",    0.003785411784);            //   1 [gal-u]   = 0.003785411784  [m^3]
   enlist("[gal-r] Gallons (beer)",  0.004621152048);            //   1 [gal-r]   = 0.004621152048  [m^3]
   enlist("[gal-d] US dry gallons",                 0.00440488377086);          //   1 [gal-d]   = 0.00440488377086[m^3]
   enlist("[bl-br] Barrel (Br.)",            0.16365924);                //   1 [bl-br]   = 0.16365924      [m^3]
   enlist("[bl-fl] Barrel (Br., petrol)", 0.159113);                  //   1 [bl-fl]   = 0.159113        [m^3]
   enlist("[bl-us] Barrel (Am. petrol)",            0.158987294928);            //   1 [bl-us]   = 0.158987294928  [m^3]
   enlist("[fl-bl] Barrel (Am. fluid)",             0.119240471196);            //   1 [fl-bl]   = 0.119240471196  [m^3]
   enlist("[dr-bl] Barrel (Am. dry)",               0.115628198985075);}         //   1 [dr-bl]   = 0.11562819898508[m^3]
 else if (typeID=="mass") {                                                     // Mass:
   enlist("[kg] Kilogram",              1.0);                       //   1 [kg] is base
   enlist("[g] Gram",                       0.001);                     //   1 [g]     = 0.001          [kg]
   enlist("[t] Ton",                        1000.0);                    //   1 [t]     = 1000           [kg]
   enlist("[tn] Long ton (Br.)",                    1016.0469088);              //   1 [tn]    = 1016.0469088   [kg]
   enlist("[sh tn] Short ton (Am.)",                907.18474);                 //   1 [sh tn] = 907.18474      [kg]
   enlist("[oz] Ounce = [lb]/16 (Br.)",      0.028349523125);            //   1 [oz]    = 0.028349523125 [kg]
   enlist("[oz t] Ounce (troy)",         0.0311034768);              //   1 [oz t]  = 0.0311034768   [kg]
   enlist("[lb] Pound (Br.) = 7000 [gr]",           0.45359237);                //   1 [lb]    = 0.45359237     [kg]
   enlist("[lb-m] Pound (metric)",                  0.500);                     //   1 [lb-m]  = 0.500          [kg]
   enlist("[st] Stone",                     6.35029318);                //   1 [st]    = 6.35029318     [kg]
   enlist("[qt] Quarter = 2 stone",                 12.70058636);               //   1 [qt]    = 12.70058636    [kg]
   enlist("[gr] Grain (Br.)",                0.00006479891);             //   1 [gr]    = 0.00006479891  [kg]
   enlist("[sl] Slug, geepound",                    14.593903);                 //   1 [sl]    = 14.593903      [kg]
   enlist("[q] Quintal (metric)",                   100.0);                     //   1 [q]     = 100            [kg]
   enlist("[kt] Carat (metric) | Karat",            0.0002);}}                    //   1 [kt]    = 0.0002         [kg]