function d(message) {
    $('debug').innerHTML += message + "<br>";
}

/**
 * Berechnung verschiedener Kugelvolumen.
 *
 * Web  : http://www.servicehome.net
 * eMail: info@servicehome.net
 *
 * Created: 04.03.2009
 */
 
 
 
 /**
 Erweiterung durch Fa. SkySystems (http://www.skysystems.it) Nov09.
 */
 

/** Allgemein */

var rundung = 3;

function round(value, prec) {
  var f = Math.pow(10, prec);
  return (Math.round(value * f) / f);
}


/** Teil 1 */

function kugel_vo_dm(durchmesser)
{
	return round((Math.PI*Math.pow(durchmesser, 3) / 6), rundung);
}

function kugel_ob_dm(durchmesser)
{
	
	return round(((Math.PI*Math.pow(durchmesser, 2))), rundung);
}

function kugel_dm_vo(volumen)
{
	
	return round(Math.pow(((6*volumen)/Math.PI), 1/3), rundung);
}

function kugel_dm_ob(oberflaeche)
{
	
	return round(Math.pow((oberflaeche/Math.PI), 1/2), rundung);
}


/** Teil 2 */

function abschnitt_vo(dm, ho)
{
	return round((Math.PI*Math.pow(ho, 2)*(dm/2-ho/3)), rundung);
}

function abschnitt_ma(dm, ho)
{
	return round((Math.PI*dm*ho), rundung);
}

function abschnitt_ob(dm, ho)
{
	return round((Math.PI*ho*(2*dm-ho)), rundung);
}

function abschnitt_dm(ma, ho)
{
	return round((ma/(Math.PI*ho)), rundung);
}

function abschnitt_ho(ma, dm)
{
	return round((ma/(Math.PI*dm)), rundung);
}


/** Teil 3 */

function schicht_vo(d1, d2, ho)
{
	return round(	(Math.PI*ho)/6*(((3*Math.pow(d1, 2)) / 4)+((3*Math.pow(d2, 2)) / 4)+Math.pow(ho, 2)   ) 	, rundung);
}

function schicht_ma(dm, ho)
{
	return round((Math.PI*dm*ho), rundung);
}

function schicht_ob(d1, d2, ho)
{
	return round(	Math.PI*(d*h+((3*Math.pow(d1, 2)) / 4)+((3*Math.pow(d2, 2)) / 4)) 	, rundung);
}

function schicht_dm(ma, ho)
{
	return round((ma/(Math.PI*ho)), rundung);
}

function schicht_ho(ma, dm)
{
	return round((ma/(Math.PI*dm)), rundung);
}

function schicht_d1(ho, vo, d2)
{
	return round(	Math.pow(((4*(((6*vo)/(Math.PI*ho))-((3*Math.pow(d2, 2))/4)-Math.pow(ho, 2)))/3),1/2)	, rundung);
}

function schicht_d2(ho, vo, d1)
{
	return round(	Math.pow(((4*(((6*vo)/(Math.PI*ho))-((3*Math.pow(d1, 2))/4)-Math.pow(ho, 2)))/3),1/2)	, rundung);
}



/** Teil 4 */

function ausschnitt_vo(ho, dm)
{
	return round(((Math.PI*Math.pow(dm, 2)*ho) / 6) , rundung);
}

function ausschnitt_ob(ho, dm, da)
{
	return round((((Math.PI*dm)/4)*(4*ho+da)), rundung);
}

function ausschnitt_dm(vo, ho)
{
	return round(Math.pow(((6 * vo)/(Math.PI * ho)) ,1/2) , rundung);
}

function ausschnitt_da(ob, ho, dm)
{
	return round((((4*ob)/(Math.PI*dm)) - (4*ho)) , rundung);
}

function ausschnitt_h1(vo, dm)
{
	return round( ((6*vo) / (Math.PI*Math.pow(dm, 2))) , rundung);
}

function ausschnitt_h2(ob, dm, da)
{
	return round( ((ob/(Math.PI*dm))-da) , rundung);
}












/**
 * A)
 */
function gewicht_zu_durchmesser(gewicht, materialwert) {
    var durchmesser = -1.0;
    
    durchmesser = Math.pow((6.0*gewicht) / (materialwert * Math.PI), 1/3);

    return(durchmesser);
}

/**
 * B)
 */
function stueck_zu_gewicht(durchmesser_mm, anzahl, materialwert) {
    var GewichtG = (anzahl*durchmesser_mm*durchmesser_mm*durchmesser_mm*Math.PI*materialwert) / (6*10*10*10*10*10*10);

    return(GewichtG);
}

/**
 * C)
 */
function gewicht_zu_stueck(gewicht, material, durchmesser) {
    
    var Stueck = ((6*gewicht*10*10*10) / (material*durchmesser*durchmesser*durchmesser*Math.PI));

    return(Stueck);
}

/**
 * D)
 */
function n_stueck_preis_zu_KG_Preis(preis, stueck, durchmesser, materialwert) {
    var KG_Preis = 0;

    // material = X KG / dm³
    KG_Preis = (preis * 6.0 * Math.pow(10, 6) ) / (Math.pow(durchmesser, 3) * Math.PI * materialwert * stueck);

    return(KG_Preis);
}

/**
 * E)
 */
function KG_preis_1000_stueck_preis(preis, gewicht, durchmesser, materialwert, stueckzahl) {
    var stueckpreis_1000 = 0;

    stueckpreis_1000 = preis * stueckzahl * Math.pow(durchmesser, 3) * Math.PI * materialwert / (6 * gewicht * 1000);

    return(stueckpreis_1000);
}

/**
 * F)
 */
function anzahl_kugeln_je_volumen(durchmesser, volumen) {
    var anzahl = 0;

    anzahl = 4/3 * Math.pow(volumen / durchmesser, 3);

    return(anzahl);
}

/**
 * G)
 * http://de.wikipedia.org/wiki/Sch%C3%BCttdichte
 *
 * volumen bereits angepasst durch __S_L bei Litern..... s.u.
 */
function schnittgewicht(durchmesser, materialwert, volumen) {
    var numerator = Math.pow(durchmesser, 3) * Math.PI * materialwert * 4;
    var denominator = 6*3 * Math.pow(10, 6);
    
    var multipl = Math.pow(volumen / durchmesser, 3);

    var result = numerator / denominator * multipl;

    return(result);
}

/**
 * Hilfsfunktion.
 */
function __S_m3(volumen_a) {
    return(Math.pow(volumen_a * Math.pow(10, 9), 1/3));
}

function __S_L(volumen_a) {
    return(Math.pow(volumen_a * Math.pow(10, 6), 1/3));
}

////////////////////////////////////////////////////////////////////////////////
var material_table = new Hash();

material_table.set("--Keine Auswahl--", ""); // kein Eintrag

material_table.set("C15", 7.86);
material_table.set("C85", 7.68);
material_table.set("Chrome", 7.85); // DEFAULT INDEX=3
material_table.set("AISI 302", 7.93);
material_table.set("AISI 304", 7.93);
material_table.set("AISI 316", 7.97);
material_table.set("AISI 420", 7.75);
material_table.set("AISI 420c", 7.68);
material_table.set("AISI 430", 7.68);
material_table.set("AISI 440c", 7.68);

material_table.set("Circonoxide", 5.8);
material_table.set("Tungsten Carbide", 14.9);
material_table.set("Al Bronze", 7.61);
material_table.set("Aluminium A2017", 2.79);
material_table.set("Aluminium Al 203", 3.86);
material_table.set("Brass", 8.53);
material_table.set("Bronze", 8.6);
material_table.set("Copper", 8.89);
material_table.set("K-Monel", 8.5);
material_table.set("Monel", 8.86);
material_table.set("Rubber (Urethane)", 1.2);
material_table.set("Silicon Nitride", 3.2);
material_table.set("S-Monel", 8.32);
material_table.set("Acrylic", 1.18);
material_table.set("Delrin", 1.43);
material_table.set("Nylon", 1.13);
material_table.set("Polyamide (PA)", 1.14);
material_table.set("Polyethylen (PE)", 0.94);
material_table.set("Polypropylene", 0.9);
material_table.set("Polyurethane (PUR)", 1.2);
material_table.set("POM", 1.41);
material_table.set("Teflon (PTFE)", 2.15);
material_table.set("Black glas", 2.64);
material_table.set("Borosilcate (PYREX)", 2.23);
material_table.set("Ruby", 3.99);
material_table.set("Soda lime glas", 2.5);

// default diamters
var diameter_info = function (label, value) {
    this.label = label;
    this.value = value;
};
var diameter_table = new Array();
diameter_table.push(new diameter_info('0,3mm',        0.3));
diameter_table.push(new diameter_info('1/64"= 0,4mm',        0.4));
diameter_table.push(new diameter_info('0,5mm',        0.5));
diameter_table.push(new diameter_info('0,020"= 0,51mm',        0.51));
diameter_table.push(new diameter_info('0,6mm',        0.6));
diameter_table.push(new diameter_info('0,03"= 0,64mm',        0.64));
diameter_table.push(new diameter_info('0,7mm',        0.7));
diameter_table.push(new diameter_info('1/32"= 0,79mm',        0.79));
diameter_table.push(new diameter_info('0,8mm',        0.8));
diameter_table.push(new diameter_info('1mm',        1.00));
diameter_table.push(new diameter_info('3/64"= 1,19mm',        1.19));
diameter_table.push(new diameter_info('1,2mm',        1.2));
diameter_table.push(new diameter_info('1,5mm',        1.5));
diameter_table.push(new diameter_info('1/16"= 1,59mm',        1.59));
diameter_table.push(new diameter_info('5/64"= 1,98mm',        1.98));
diameter_table.push(new diameter_info('2mm',        2.0));
diameter_table.push(new diameter_info('3/32"= 2,38mm',        2.38));
diameter_table.push(new diameter_info('2,5mm',        2.5));
diameter_table.push(new diameter_info('7/64"= 2,78mm',        2.78));
diameter_table.push(new diameter_info('3mm',        3.00));
diameter_table.push(new diameter_info('1/8"= 3,18mm',        3.18));
diameter_table.push(new diameter_info('3,5mm',        3.50));
diameter_table.push(new diameter_info('9/64"= 3,57mm',        3.57));
diameter_table.push(new diameter_info('5/32"= 3,97mm',        3.97));
diameter_table.push(new diameter_info('4mm',        4.00));
diameter_table.push(new diameter_info('11/64"= 4,37mm',        4.37));
diameter_table.push(new diameter_info('4,5mm',        4.50));
diameter_table.push(new diameter_info('3/16"= 4,762mm',   4.7620));
diameter_table.push(new diameter_info('5mm',         5.0000));
diameter_table.push(new diameter_info('5,5mm',         5.5));
diameter_table.push(new diameter_info('7/32"= 5,56mm',       5.56));
diameter_table.push(new diameter_info('15/64"= 5,95mm',        5.95));
diameter_table.push(new diameter_info('6mm',        6.00));
diameter_table.push(new diameter_info('1/4"= 6,35mm',        6.35));
diameter_table.push(new diameter_info('6,5mm',        6.5));
diameter_table.push(new diameter_info('17/64"= 6,75mm',        6.75));
diameter_table.push(new diameter_info('7mm',  7.0));
diameter_table.push(new diameter_info('9/32"= 7,14mm',        7.14));
diameter_table.push(new diameter_info('7,5mm',        7.5));
diameter_table.push(new diameter_info('19/74"= 7,54mm',        7.54));
diameter_table.push(new diameter_info('5/16"=  7,94mm',        7.94));
diameter_table.push(new diameter_info('8mm',        8.0));
diameter_table.push(new diameter_info('8,5mm',        8.5));
diameter_table.push(new diameter_info('11/32"= 8,73mm',        8.73));
diameter_table.push(new diameter_info('9mm',        9.00));
diameter_table.push(new diameter_info('23/64"= 9,13mm',        9.13));
diameter_table.push(new diameter_info('3/8"= 9,53mm',        9.53));
diameter_table.push(new diameter_info('25/64"= 9,92mm',        9.92));
diameter_table.push(new diameter_info('10mm',        10.00));
diameter_table.push(new diameter_info('13/32"= 10,32mm',        10.32));
diameter_table.push(new diameter_info('10,5mm',        10.5));
diameter_table.push(new diameter_info('11mm',        11.00));
diameter_table.push(new diameter_info('7/16"= 11,11mm',        11.11));
diameter_table.push(new diameter_info('11,5mm',        11.50));
diameter_table.push(new diameter_info('29/64"= 11,51mm',        11.51));
diameter_table.push(new diameter_info('15/32"= 11,91mm',        11.91));
diameter_table.push(new diameter_info('12mm',        12.00));
diameter_table.push(new diameter_info('31/64"= 12,3mm',        12.3));
diameter_table.push(new diameter_info('1/2"= 12,7mm',        12.7));
diameter_table.push(new diameter_info('13mm',        13.00));
diameter_table.push(new diameter_info('17/32"= 13,49mm',        13.49));
diameter_table.push(new diameter_info('14mm',        14.0));
diameter_table.push(new diameter_info('9/16"= 14,29mm',        14.29));
diameter_table.push(new diameter_info('15mm',        15.00));
diameter_table.push(new diameter_info('19/32"= 15,08mm',        15.08));
diameter_table.push(new diameter_info('5/8"= 15,88mm',        15.88));
diameter_table.push(new diameter_info('16mm',        16.00));
diameter_table.push(new diameter_info('21/32"= 16,67mm',        16.67));
diameter_table.push(new diameter_info('17mm',        17.00));
diameter_table.push(new diameter_info('11/16"= 17,46mm',        17.46));
diameter_table.push(new diameter_info('18mm',        18.00));
diameter_table.push(new diameter_info('23/32"= 18,26mm',        18.26));
diameter_table.push(new diameter_info('19mm',        19.00));
diameter_table.push(new diameter_info('3/4"= 19,05mm',        19.05));
diameter_table.push(new diameter_info('25/32"= 19,84mm',       19.84));
diameter_table.push(new diameter_info('20mm',        20.00));
diameter_table.push(new diameter_info('13/16"= 20,64mm',        20.64));
diameter_table.push(new diameter_info('21mm',        21.00));
diameter_table.push(new diameter_info('27/32"= 21,43mm',        21.43));
diameter_table.push(new diameter_info('22mm',        22.00));
diameter_table.push(new diameter_info('7/8"= 22,23mm',        22.23));
diameter_table.push(new diameter_info('23mm',        23.00));
diameter_table.push(new diameter_info('29/32"= 23,02mm',        23.02));
diameter_table.push(new diameter_info('15/16"= 23,81mm',        23.81));
diameter_table.push(new diameter_info('24mm',        24.00));
diameter_table.push(new diameter_info('31/32"= 24,61mm',        24.61));
diameter_table.push(new diameter_info('25mm',        25.00));
diameter_table.push(new diameter_info('1"= 25,4mm',        25.4));
diameter_table.push(new diameter_info('26mm',        26.00));
diameter_table.push(new diameter_info('26,99mm',        26.99));
diameter_table.push(new diameter_info('28mm',        28.00));
diameter_table.push(new diameter_info('1 1/8"= 28,58mm',        28.58));
diameter_table.push(new diameter_info('30mm',        30.00));
diameter_table.push(new diameter_info('1 3/16"= 30,16mm',        30.16));
diameter_table.push(new diameter_info('1 1/4"= 31,75mm',        31.75));
diameter_table.push(new diameter_info('32mm',        32.00));
diameter_table.push(new diameter_info('1 5/16"= 33,34mm',        33.34));
diameter_table.push(new diameter_info('34mm',        34.00));
diameter_table.push(new diameter_info('13/8"= 34,93mm',        34.93));
diameter_table.push(new diameter_info('35mm',        35.00));
diameter_table.push(new diameter_info('36mm',        36.00));
diameter_table.push(new diameter_info('1 7/16"= 36,51mm',        36.51));
diameter_table.push(new diameter_info('38mm',        38.00));
diameter_table.push(new diameter_info('1 1/2"= 38,1mm',        38.10));
diameter_table.push(new diameter_info('1 9/16"= 39,69mm',        39,69));
diameter_table.push(new diameter_info('40mm',        40.00));
diameter_table.push(new diameter_info('1 5/8"= 41,28mm',        41.28));
diameter_table.push(new diameter_info('1 11/16"= 42,86mm',        42.86));
diameter_table.push(new diameter_info('1 3/4"= 44,45mm',        44.45));
diameter_table.push(new diameter_info('45mm',        45.00));
diameter_table.push(new diameter_info('1 13/16"= 46,04mm',       46.04));
diameter_table.push(new diameter_info('1 7/8"= 47,63mm',        47.63));
diameter_table.push(new diameter_info('1 15/16"= 49,21mm',        49.21));
diameter_table.push(new diameter_info('50mm',        50.00));
diameter_table.push(new diameter_info('2"= 50,8mm',        50.8));
diameter_table.push(new diameter_info('2 1/8"= 53,98mm',        53.98));
diameter_table.push(new diameter_info('55mm',        55.00));
diameter_table.push(new diameter_info('2 1/4"= 57,15mm',        57.15));
diameter_table.push(new diameter_info('60mm',        60.00));
diameter_table.push(new diameter_info('2 3/8"= 60,33mm',        60.33));
diameter_table.push(new diameter_info('2 1/2"= 63,5mm',        63.50));
diameter_table.push(new diameter_info('65mm',        65.00));
diameter_table.push(new diameter_info('2,63"= 66,68mm',        66.68));
diameter_table.push(new diameter_info('2,750"= 69,85mm',        69.85));
diameter_table.push(new diameter_info('70mm',        70.00));
diameter_table.push(new diameter_info('2,88"= 73,03mm',        73.03));
diameter_table.push(new diameter_info('75mm',        75.00));
diameter_table.push(new diameter_info('3"= 76,2mm',        76.2));
diameter_table.push(new diameter_info('80mm',        80.00));
diameter_table.push(new diameter_info('3,250"= 82,55mm',        82.55));
diameter_table.push(new diameter_info('85mm',        85.00));
diameter_table.push(new diameter_info('3,5"= 88,9mm',        88.9));
diameter_table.push(new diameter_info('90mm',        90.00));
diameter_table.push(new diameter_info('95mm',        95.00));
diameter_table.push(new diameter_info('3,75"= 95,25mm',        95.25));
diameter_table.push(new diameter_info('100mm',        100.00));
diameter_table.push(new diameter_info('110mm',        110.00));
diameter_table.push(new diameter_info('4,5"= 114,3mm',        114.3));
diameter_table.push(new diameter_info('120mm',        120.00));
diameter_table.push(new diameter_info('150mm',        150.00));
function createMaterialOptions() {
    var form_options_code = "";
    material_table.each(function (pair) {
        form_options_code += '<option value="'+pair.value+'">'+pair.key+'</option>';
    });
    return(form_options_code);
}

function resetMaterialField(selection_id) {
    var selection_element = $(selection_id);
    if (selection_element != null) selection_element.selectedIndex = 0;
}

function sortDefaultDiamterTable() {
    diameter_table = diameter_table.sortBy(function (s) {
        return(s.value);
    });

// test
/*var max = diameter_table.length;
    for (i=0; i<max; i++) {
        alert("value=" + diameter_table[i].label + "["+diameter_table[i].value+"]");
    }*/
}

function formatNumber(number) {
    var output = number;

    return(output);
}

////////////////////////////////////////////////////////////////////////////////


function JSCalcGewicht ()
{
    var KugDurch,KugMat;

    KugDurch = document.CalcGewicht.KugelDurchmesser.value;
    KugMat = document.CalcGewicht.KugelMaterial.value;
    KugAnz = document.CalcGewicht.KugelAnzahl.value;
    KugDurchEH = document.CalcGewicht.KugelDurchmesserEinheit.value;

    KugDurch = KugDurch * KugDurchEH;

    GewichtG = (KugAnz*KugDurch*KugDurch*KugDurch*Math.PI*KugMat) / (6*10*10*10*10*10*10);

    if (GewichtG <= 0.010)
        GewichtG = (Math.floor(GewichtG*1000*100000000) / 100000000) + "&nbsp;g"
    else
        GewichtG = Math.floor(GewichtG*100000000) / 100000000 + "&nbsp;kg"

    /*if(document.all)
        {
            document.all.ErgGewicht.innerHTML = GewichtG;
        }
        else if(document.layers)
        {
            document.ErgGewicht.document.open();
            document.ErgGewicht.document.write(GewichtG);
            document.ErgGewicht.document.close();
        }*/
    $('ErgGewicht').innerHTML = GewichtG;
}

function JSCalcStueck ()
{
    var KugDurch,KugGew,KugMat,KugDurchEH;

    KugDurch = document.CalcStueck.KugelDurchmesser.value;
    KugGew = document.CalcStueck.KugelGewicht.value;
    KugGewEH = document.CalcStueck.KugelGewichtEinheit.value;
    KugDurchEH = document.CalcStueck.KugelDurchmesserEinheit.value;
    KugMat = document.CalcStueck.KugelMaterial.value;

    KugDurch = KugDurch * KugDurchEH;

    if (KugDurch+0==0)
        Stueck = 0;
    else
        Stueck = ((6*KugGew*KugGewEH*10*10*10) / (KugMat*KugDurch*KugDurch*KugDurch*Math.PI));

    Stueck = Math.floor (Stueck);
    StueckFormat = Tausenderpunkte (Stueck+"");

    /*if(document.all)
            document.all.ErgStueck.innerHTML = StueckFormat;
        else if(document.layers)
        {
            document.ErgStueck.document.open();
            document.ErgStueck.document.write(StueckFormat);
            document.ErgStueck.document.close();
        }*/
    $('ErgStueck').innerHTML = StueckFormat;
}

/**
 * Format a number.
 *
 * @param number
 * @param decimal_places
 *
 * @return the formated number
 */
function sh_number_format(number, decimal_places) { //, min_precision) {
    var result = 1.0 * number;
    try {
        var exp = Math.pow(10, decimal_places);
        result *= exp;
        result = Math.floor(result);
        result /= exp;
    } catch (exc) {
        alert("Fehler beim Formatieren von Zahl: " + number + " mit " + decimal_places + " Nachkommastellen! EXC:" + exc);
    }
    return(result);
}

function sh_german_number_notation(number) {
    // cast to string
    result = "" + Math.floor(number);
    var decimal_places = sh_get_decimal_places(number);
    
    // format e.g. 50000 as "50.000"
    var digitCount = result.length;
    var c = digitCount;
    formatedNumberStr = "";
    for (var i=0; i < digitCount; i++) {
        formatedNumberStr += result.charAt(i);
        c--;
        if (c % 3 == 0 && c!=0) {
            formatedNumberStr += ".";
        }
    }

    return(formatedNumberStr + (decimal_places.length > 0 ? "," + decimal_places : ""));
}

/**
 *
 */
function sh_get_decimal_places(number) {
    var decimal_places_str = "" + number;
    try {
        var pos = decimal_places_str.indexOf(".");
        if (pos != -1) {
            decimal_places_str = decimal_places_str.substr(pos+1);
        } else {
            decimal_places_str = "";
        }
    } catch(exception) {
        
    }

    return(decimal_places_str);
}

function sh_exp_notation_to_decimal(number, decimal_places) {
    // is exp notation?    example 3.288200310757317e-11  or 3e-8
    var exp_notation_regex = /([0-9]*[.]*[0-9]*)e([-]*[0-9]+)/;
    //d("number=" + number);
    exp_notation_regex.exec(number);

    var left = RegExp.$1;
    var exp = 1.0 * RegExp.$2;
    var result = left * Math.pow(10, exp + decimal_places);

    return("number=" + RegExp.$1 + "   exp=" + RegExp.$2 +     "IST=" + result);
//return(result);
}
