﻿
// data starts 

var allMetrics = new Array("Area", "Length", "Mass", "Power", "Pressure", "Temperature", "Velocity", "Volume", "Energy");

var strArrArea = new Array("4.04685642E-1?acres (ac) -> hectares (ha)",
                                "4.04685642E3?acres (ac) -> square metres (m^2)",
                                "2.471054E+0?hectares (ha) -> acres (ac)",
                                "1.0000E4?hectares (ha) -> square metres (m^2)",
                                "2.52928526E1?perches (p) -> square metres (m^2)",
                                "1.01171411E3?roods (rd) -> square metres (m^2)",
                                "9.2903?squares -> square metres (m^2)",
                                "1.550003E-1?square centimetres (cm^2) -> square inches (in^2)",
                                "9.29030400E-2?square feet (ft^2) -> square metres (m^2)",
                                "6.45160000E0?square inches (in^2) -> square centimetres (cm^2)",
                                "6.45160000E-4?square inches (in^2) -> square metres (m^2)",
                                "6.45160000E2?square inches (in^2) -> square millimetres (mm^2)",
                                "2.471054E-4?square metres (m^2) -> acres (ac)",
                                "1.000000E-4?square metres (m^2) -> hectares (ha)",
                                "3.953686E-2?square metres (m^2) -> perches (p)",
                                "9.884215E-4?square metres (m^2) -> roods (rd)",
                                "1.076391E+1?square metres (m^2) -> square feet (ft^2)",
                                "1.550003E+3?square metres (m^2) -> square inches (in^2)",
                                "1.195990E+0?square metres (m^2) -> square yards (yd^2)",
                                "0.10763915?square metres (m^2) -> squares",
                                "1.550003E-3?square millimetres (mm^2) -> square inches (in^2)",
                                "8.36127360E-1?square yards (yd^2) -> square metres (m^2)");

var strArrLength = new Array("3.937008E-1?centimetres (cm) -> inches (in)",
                                                        "2.01168E1?chains (ch) -> metres (m)",
                                                        "3.0480E-1?feet (ft) -> metres (m)",
                                                        "2.5400E0?inches (in) -> centimetres (cm)",
                                                        "2.5400E-2?inches (in) -> metres (m)",
                                                        "2.5400E1?inches (in) -> millimetres (mm)",
                                                        "9.46055E15?light years (l.y.) -> metres (m)",
                                                        "2.01168E-1?links (lk) -> metres (m)",
                                                        "4.970970E-2?metres (m) -> chains (ch)",
                                                        "3.280840E+0?metres (m) -> feet (ft)",
                                                        "3.937008E+1?metres (m) -> inches (in)",
                                                        "1.057021E-16?metres (m) -> light years (l.y.)",
                                                        "4.970970E+0?metres (m) -> links (lk)",
                                                        "6.213712E-4?metres (m) -> miles",
                                                        "5.3996E-4?metres (m) -> international nautical miles (n mile)",
                                                        "1.988388E-1?metres (m) -> perches (p)",
                                                        "1.093613E+0?metres (m) -> yards (yd)",
                                                        "1.609344E3?miles -> metres (m)",
                                                        "1.852E3?international nautical miles (n mile) -> metres (m)",
                                                        "3.937008E-2?millimetres (mm) -> inches (in)",
                                                        "5.0292E0?perches (p) -> metres (m)",
                                                        "9.144E-1?yards (yd) -> metres (m)");

var strArrMass = new Array("1.7718451953125E-3?drams (dr) -> kilograms (kg)",
                                                    "6.47989100E-5?grains (gr) -> kilograms (kg)",
                                                    "5.080234544E1?hundredweights (cwt) -> kilograms (kg)",
                                                    "5.643834E+2?kilograms (kg) -> drams (dr)",
                                                    "1.543236E+4?kilograms (kg) -> grains (gr)",
                                                    "1.968413E-2?kilograms (kg) -> hundredweights (cwt)",
                                                    "3.5273962E1?kilograms (kg) -> ounces (oz)",
                                                    "6.430149E+2?kilograms (kg) -> pennyweight (dwt)",
                                                    "2.204623E+0?kilograms (kg) -> pounds (lb) ",
                                                    "7.873652E-2?kilograms (kg) -> quarters (qr)",
                                                    "1.102311E-3?kilograms (kg) -> short tons (sh tn)",
                                                    "6.852177E-2?kilograms (kg) -> slugs",
                                                    "1.574730E-1?kilograms (kg) -> stones (st)",
                                                    "9.842065E-4?kilograms (kg) -> tons",
                                                    "1.000000E-3?kilograms (kg) -> tonnes (t)",
                                                    "3.215075E+1?kilograms (kg) -> troy ounces (oz tr)",
                                                    "2.835E-2?ounces (oz) -> kilograms (kg)",
                                                    "1.55517384E-3?pennyweight (dwt) -> kilograms (kg)",
                                                    "4.5359237E-1?pounds (lb)  -> kilograms (kg)",
                                                    "1.270058646E1?quarters (qr) -> kilograms (kg)",
                                                    "9.07184740E2?short tons (sh tn) -> kilograms (kg)",
                                                    "9.07184740E-1?short tons (sh tn) -> tonnes (t)",
                                                    "1.4593903E1?slugs -> kilograms (kg)",
                                                    "6.35029318E0?stones -> kilograms (kg)",
                                                    "1.0160469088E3?tons -> kilograms (kg)",
                                                    "1.0160469088E0?tons -> tonnes (t)",
                                                    "9.842065E-1?tonnes (t) -> tons",
                                                    "1.000E3?tonnes (t) -> kilograms (kg)",
                                                    "1.102311E+0?tonnes (t) -> short tons (sh tn)",
                                                    "3.11034768E-2?troy ounces (oz tr) -> kilograms (kg)");

var strArrPower = new Array("7.457E2?horsepower (hp) -> Watts (W)",
                                                      "1.341022E-3?Watts (W) -> horsepower (hp)");

var strArrPressure = new Array("1.0E2?bars (b) -> kilopascals (kPa)",
                                                        "1.0E-1?bars (b) -> megapascals (MPa)",
                                                        "1.0E5?bars (b) -> pascals (Pa)",
                                                        "0.145E2?bars (b) -> pounds-force per square inch (lbf/in^2)", 
                                                        "1.0E-2?kilopascals (kPa) -> bars (b)",
                                                        "0.14503774?kilopascals (kPa) -> pounds-force per square inch (lbf/in^2)",                                                        
                                                        "1.0E1?megapascals (MPa) -> bars (b)",
                                                        "1.00E2?millibars (mb) -> pascals (Pa)",
                                                        "9.8692E-4?millibars (mb) -> standard atmospheres (atm)", 
                                                        "1.3332219E2?millimetres of mercury (mm Hg) -> pascals (Pa)",
                                                        "1.0E-5?pascals (Pa) -> bars (b)",
                                                        "1.000000E-2?pascals (Pa) -> millibars (mb)",
                                                        "7.500627E-3?pascals (Pa) -> millimetres of mercury (mm Hg)",
                                                        "9.869233E-6?pascals (Pa) -> standard atmospheres (atm)", 
                                                        "0.06895?pounds-force per square inch (lbf/in^2) -> bar (b)",
                                                        "6.8947573?pounds-force per square inch (lbf/in^2) -> kilopascals (kPa)",  
                                                        "1013?standard atmospheres (atm) -> millibars (mb)",                                                     
                                                        "101325?standard atmospheres (atm) -> pascals (Pa)");                                                        

var strArrTemperature = new Array("9/5*C + 32?Celsius (degrees C) -> Fahrenheit (degrees F)",
                                                            "C + 273.15?Celsius (degrees C) -> Kelvin (K)",
                                                            "5/9*(F - 32)?Fahrenheit (degrees F) -> Celsius (degrees C)",
                                                            "5/9*(F + 459.67)?Fahrenheit (degrees F) -> Kelvin (K)",
                                                            "K - 273.15?Kelvin (K) -> Celsius (degrees C)",
                                                            "9/5*K - 459.67?Kelvin (K) -> Fahrenheit (degrees F)");

var strArrVelocity = new Array("5.0800000E-3?feet per minute (ft/min) -> metres per second (m/s)",
                                                        "6.213712E-1?kilometres per hour (km/h) -> miles per hour (mile/h)",
                                                        "5.1444444E-1?knotts, international -> metres per second (m/s)",
                                                        "1.943845E+0?metres per second (m/s) -> knotts, international",
                                                        "1.968504E+2?metres per second (m/s) -> feet per minute (ft/min)",
                                                        "2.236936E+0?metres per second (m/s) -> miles per hour (mile/h)",
                                                        "1.609344E0?miles per hour (mile/h) -> kilometres per hour (km/h)",
                                                        "4.470400E-1?miles per hour (mile/h) -> metres per second (m/s)");

var strArrVolume = new Array("6.102374E-2?cubic centimetres (cm^3) -> cubic inches (in^3)",
                                                        "2.83168466E-2?cubic feet (ft^3) -> cubic metres (m^3)",
                                                        "2.83168466E1?cubic feet (ft^3) -> litres (L)",
                                                        "1.63870640E1?cubic inches (in^3) -> cubic centimetres (cm^3)",
                                                        "1.63870640E-5?cubic inches (in^3) -> cubic metres (m^3)",
                                                        "1.63870640E4?cubic inches (in^3) -> cubic millimetres (mm^3)",
                                                        "2.641721E+2?cubic metres (m^3) -> US gallons (US gal)",
                                                        "3.531467E+1?cubic metres (m^3) -> cubic feet (ft^3)",
                                                        "6.102374E+4?cubic metres (m^3) -> cubic inches (in^3)",
                                                        "1.307951E+0?cubic metres (m^3) -> cubic yards (yd^3)",
                                                        "2.815606E+5?cubic metres (m^3) -> fluid drachm (fl dr)",
                                                        "3.519508E+4?cubic metres (m^3) -> fluid ounces (fl oz)",
                                                        "2.199692E+2?cubic metres (m^3) -> gallons (gal)",
                                                        "7.039016E+3?cubic metres (m^3) -> gills ",
                                                        "1.000000E+3?cubic metres (m^3) -> litres (L)",
                                                        "16893638.26937?cubic metres (m^3) -> minims (min)",
                                                        "1.759754E+3?cubic metres (m^3) -> pints (pt)",
                                                        "8.798770E+2?cubic metres (m^3) -> quarts (qt)",
                                                        "6.102374E-5?cubic millimetres (mm^3) -> cubic inches (in^3)",
                                                        "7.64554858E-1?cubic yards (yd^3) -> cubic metres (m^3)",
                                                        "3.5516328E-6?fluid drachm (fl dr) -> cubic metres (m^3)",
                                                        "2.84130625E-5?fluid ounces (fl oz) -> cubic metres (m^3)",
                                                        "2.84130625E1?fluid ounces (fl oz) -> millilitres  (mL)",
                                                        "4.54609E-3?gallons (gal) -> cubic metres (m^3)",
                                                        "4.54609?gallons (gal) -> litres (L)",
                                                        "1.42065313E-4?gills  -> cubic metres (m^3)",
                                                        "2.641721E-1?litres (L) -> US gallons (US gal)",
                                                        "3.531467E-2?litres (L) -> cubic feet (ft^3)",
                                                        "2.199692E-1?litres (L) -> gallons (gal)",
                                                        "16893.63826937?litres (L) -> minims (min)",
                                                        "1E-3?litres (L) -> cubic metres (m^3)",
                                                        "3.519508E-2?millilitres  (mL) -> fluid ounces (fl oz)",
                                                        "5.9193880E-8?minims (min) -> cubic metres (m^3)",
                                                        "5.9193880E-5?minims (min) -> litres (L)",
                                                        "5.6826125E-4?pints (pt) -> cubic metres (m^3)",
                                                        "1.13652250E-3?quarts (qt) -> cubic metres (m^3)",
                                                        "3.785411784E-3?US gallons (US gal) -> cubic metres (m^3)",
                                                        "3.785411784?US gallons (US gal) -> litres (L)");

var strArrEnergy = new Array("1.05505585262E3?British thermal units (Btu) -> joules (J)",
                                                        "4.1868E0?calories (cal) -> joules (J)",
                                                        "9.478171E-4?joules (J) -> British thermal units (Btu)",
                                                        "2.388459E-1?joules (J) -> calories (cal)",
                                                        "2.388459E-4?joules (J) -> kilocalories (kcal)",
                                                        "2.777778E-7?joules (J) -> kilowatt hours (kW.h)",
                                                        "4.1868E3?kilocalories (kcal) -> joules (J)",
                                                        "3.6E6?kilowatt hours (kW.h) -> joules (J)");


// data ends

var isNav = (navigator.appName.indexOf("Netscape") != -1);

function _clearResult() {
    var eResult = document.getElementById('_result');
    if (isNav == true) {
        eResult.textContent = "";
    }
    else {
        eResult.innerText = "";
    }
}

function populateDropDownList(aDropdownlistId, aArray, sel) {

    var ddl = document.getElementById(aDropdownlistId);

    // remove the current options from the dropdown list 
    while (ddl.options.length > 0) {
        ddl.remove(0);
    }

    for (var i = 0; i < aArray.length; ++i) {
        var sa = aArray[i].split("?");

        addOption(ddl, sa[1], sa[0]);
    }

    if (sel >= 0 && sel < aArray.length) {
        ddl.selectedIndex = sel;
    }
}

function addOption(selectbox, text, value) {

    var optn = document.createElement("OPTION");
    optn.text = text;
    optn.value = value;

    try {
        selectbox.options.add(optn); // this will fail in DOM browsers but is needed for IE 
    }
    catch (e) {
        selectbox.appendChild(optn);
    }
}


function _conv_Changed() {
    var ddl = document.getElementById("_select_conversion");

    var factor = document.getElementById("_factor");

    var f = ddl.options[ddl.selectedIndex].value;

    if (isMetricTemperature() != true) {
        f = processTrailingZeros(Number(ddl.options[ddl.selectedIndex].value).toPrecision(15));
    }

    (isNav == true) ? (factor.textContent = f) : (factor.innerText = f);

    if (!ValidateInput()) return;
    _clearResult();
}


function _metric_Changed() {
    var ddl = document.getElementById("_select_metric");

    populateDropDownList("_select_conversion", eval(ddl.options[ddl.selectedIndex].value), 0);

    var ddlConv = document.getElementById("_select_conversion");
    var factor = document.getElementById("_factor");

    var f = ddlConv.options[ddlConv.selectedIndex].value;

    if (isMetricTemperature() != true) {
        f = processTrailingZeros(Number(ddlConv.options[ddlConv.selectedIndex].value).toPrecision(15));
    }
    
    (isNav) ? (factor.textContent = f) : (factor.innerText = f);

    if (!ValidateInput()) return;

    _clearResult();
}

function ValidateInput() {
    var inputBox = document.getElementById("_input");
    var ddlMetric = document.getElementById('_select_metric');
    var inputResult = document.getElementById("_result");
    var v;

    (isNav == true) ? (v = ddlMetric.options[ddlMetric.selectedIndex].textContent) : (v = ddlMetric.options[ddlMetric.selectedIndex].innerText);

    if (MyIsNumeric(inputBox.value) == false) {
        alert("Input has got a non-numeric value");
        //inputResult.innerText = "";
        (isNav == true) ? (inputResult.textContent = ddl.options[ddl.selectedIndex].value) : (inputResult.innerText = ddl.options[ddl.selectedIndex].value);
        return false;
    }
    //else if (ddlMetric.options[ddlMetric.selectedIndex].innerText != "Temperature" && inputBox.value * 1 < 0)
    else if (v != "Temperature" && inputBox.value * 1 < 0) {
        alert("Input has got a negative value");
        //inputResult.innerText = "";
        (isNav == true) ? (inputResult.textContent = ddl.options[ddl.selectedIndex].value) : (inputResult.innerText = ddl.options[ddl.selectedIndex].value);
        return false;
    }
    else if (inputBox.value.length == 0) {
        inputBox.value = 0;
        return true;
    }

    return true;
}

function _input_Changed() {
    if (!ValidateInput()) return;

    _clearResult();
}


function InitPopulate() {
    var ddl = document.getElementById("_select_metric");

    // remove the current options from the metric category 
    while (ddl.options.length > 0) {
        ddl.remove(0);
    }

    for (var i = 0; i < allMetrics.length; ++i) {
        if (allMetrics[i] == "Velocity") {
            addOption(ddl, allMetrics[i] + " and speed", "strArr" + allMetrics[i]);
        }
        else {
            addOption(ddl, allMetrics[i], "strArr" + allMetrics[i]);
        }
    }

    ddl.selectedIndex = 0;

    populateDropDownList("_select_conversion", strArrArea, 0);

    var factor = document.getElementById("_factor");
    var ddlConv = document.getElementById("_select_conversion");

    var f = processTrailingZeros(Number(ddlConv.options[ddlConv.selectedIndex].value).toPrecision(15));

    (isNav == true) ? (factor.textContent = f) : (factor.innerText = f);

    _clearResult();
}


function round(number, X) {
    X = (!X ? 2 : X);
    return Math.round(number * Math.pow(10, X)) / Math.pow(10, X);
}




function tidy_display(display_value) {
    if (display_value != 0) {

        if ((Math.abs(display_value) < 0.01) || (Math.abs(display_value) > 100)) {
            return toScientific(display_value, 4);
        }
        else {
            return round(Number(display_value), 4);
        }
    }
    else {
        return 0;
    }
}


function toScientific(dec_number, s) {
    var DecNum = parseFloat(dec_number)
    var DecNumExponent
    var DecNumMantissa
    DecNumExponent = Math.floor(Math.log(DecNum) / Math.LN10)
    DecNumMantissa = DecNum / Math.pow(10, DecNumExponent)

    return round(DecNumMantissa, s) + "x10^" + DecNumExponent
}


function MyIsNumeric(n) {
    //if (n * 1 == NaN) 
    if (isNaN(n * 1)) {
        return false;
    }
    else {
        return true;
    }
}

function isMetricTemperature() {
    var ddlMetric = document.getElementById('_select_metric');
    var v;
    (isNav) ? (v = ddlMetric.options[ddlMetric.selectedIndex].textContent) : (v = ddlMetric.options[ddlMetric.selectedIndex].innerText);

    if (v != "Temperature") {
        return false;
    }
    else {
        return true;
    }
}

function _calculate() {
    if (ValidateInput() == false) return;

    var ddlMetric = document.getElementById('_select_metric');
    var v;
    (isNav) ? (v = ddlMetric.options[ddlMetric.selectedIndex].textContent) : (v = ddlMetric.options[ddlMetric.selectedIndex].innerText);


    //if (ddlMetric.options[ddlMetric.selectedIndex].innerText != "Temperature")
    if (v != "Temperature") {
        _conv_();
    }
    else {
        _conv_temperature();
    }
}


function _conv_() {
    var eInput = document.getElementById('_input');
    var eSelect = document.getElementById('_select_conversion');
    //var eFactor = document.getElementById('_factor');
    var eResult = document.getElementById('_result');


    //eFactor.value = tidy_display(eSelect.options[eSelect.selectedIndex].value);

    //_result_out = tidy_display(eSelect.options[eSelect.selectedIndex].value * eInput.value);

    var _result_out = (eSelect.options[eSelect.selectedIndex].value * eInput.value).toPrecision(15);
    _result_out = processTrailingZeros(_result_out);


    if (MyIsNumeric(_result_out) == false || eInput.value < 0) {
        //eResult.value = '';
        (isNav) ? (eResult.textContent = "") : (eResult.innerText = "");
        return;
    }

    // Select substring after "->" in the text of a option selection
    _m = eSelect.options[eSelect.selectedIndex].text.indexOf(">");
    _l = eSelect.options[eSelect.selectedIndex].text.length;
    _out_unit = eSelect.options[eSelect.selectedIndex].text.substr((_m + 2), _l);
    _in_unit = eSelect.options[eSelect.selectedIndex].text.substr(0, (_m - 2));

    (isNav) ? (eResult.textContent = _result_out + " " + _out_unit) : (eResult.innerText = _result_out + " " + _out_unit);
}

function _conv_temperature() {

    var eInput = document.getElementById('_input');
    var eSelect = document.getElementById('_select_conversion');
    //var eFactor = document.getElementById('_factor');
    var eResult = document.getElementById('_result');

    //eFactor.value = eSelect.options[eSelect.selectedIndex].value;

    var temperature_result_out;

    switch (eSelect.selectedIndex) {

        case 0: //Celcius to Fahrenheit
            temperature_result_out = (9.0 / 5) * Number(eInput.value) + 32;
            break;
        case 1: //Celcius to Kelvin
            temperature_result_out = Number(eInput.value) + 273.15;
            break;
        case 2: //Fahrenheit to Celcius
            temperature_result_out = (5.0 / 9) * (Number(eInput.value) - 32);
            break;
        case 3: //Fahrenheit to Kelvin
            temperature_result_out = (5.0 / 9) * (Number(eInput.value) + 459.67);
            break;
        case 4: //Kelvin to Celcius
            temperature_result_out = Number(eInput.value) - 273.15;
            break;
        case 5: //Kelvin to Fahrenheit
            temperature_result_out = (9.0 / 5) * Number(eInput.value) - 459.67;
            break;

    }

    temperature_result_out = temperature_result_out.toPrecision(15);
    temperature_result_out = processTrailingZeros(temperature_result_out);
    temperature_result_out = temperature_result_out + ' ';



    if (MyIsNumeric(temperature_result_out) == false) {
        //eResult.value = '';
        (isNav) ? (eResult.textContent = "") : (eResult.innerText = "");
        return;
    }

    // Select substring after "->" in the text of a option selection

    temperature_m = eSelect.options[eSelect.selectedIndex].text.indexOf(">");
    temperature_l = eSelect.options[eSelect.selectedIndex].text.length;
    temperature_out_unit = eSelect.options[eSelect.selectedIndex].text.substr(temperature_m + 2, temperature_l);
    temperature_in_unit = eSelect.options[eSelect.selectedIndex].text.substr(0, (temperature_m - 2));

    //(isNav) ? (eResult.textContent = temperature_result_out + " " + temperature_out_unit) : (eResult.innerText = temperature_result_out + " " + temperature_out_unit);
    (isNav) ? (eResult.textContent = temperature_result_out + temperature_out_unit) : (eResult.innerText = temperature_result_out + temperature_out_unit);
}

function removeTrailingZeros(x) {
    var decPos = x.indexOf(".")

    if (decPos > -1) {
        first = x.substring(0, decPos);
        second = x.substring(decPos, x.length);

        while (second.charAt(second.length - 1) == "0")
            second = second.substring(0, second.length - 1);

        if (second.length > 1)
            return first + second;
        else
            return first;
    }

    return x;
} //end of removeTrailingZeros(x)

function processTrailingZeros(x) {
    var ePos = x.indexOf("e");

    if (ePos < 0)
        return removeTrailingZeros(x);
    else {
        dec = x.substring(0, ePos);
        ex = x.substring(ePos, x.length);

        return removeTrailingZeros(dec) + ex;
    }
} // end of processTrailingZeros

_spBodyOnLoadFunctionNames.push("InitPopulate"); 

	
