﻿function FireOnchangeEvent(target) {
    FireEvent(target, "change");
}

function FireEvent(target,eventname) {
    if (document.all) {
        target.fireEvent("on"+eventname);
    }
    else {
        var myEvent = window.document.createEvent("HTMLEvents");
        myEvent.initEvent(eventname, true, true);
        target.dispatchEvent(myEvent);
    }
}

function SetValue(target, value, decimalPlaceSeperator) {
    target.value = value.toString().replace(decimalPlaceSeperator, ".");
}

function SetValue2(target, value, decimalPlaceSeperator, decimalPlaces) {
    var roundedValue = RoundJSNumber(Number(value), decimalPlaces);
    target.value = roundedValue.toString().replace(".", decimalPlaceSeperator);
    FireOnchangeEvent(target);
}

function RoundJSNumber(number, decimalPlaces) {
    if (isNaN(decimalPlaces)) return number;
    decimalPlaces = Number(decimalPlaces);
    number = number.toFixed(decimalPlaces);
    
    //Remove tailing zeros and tailing dot
    var numberString = number.toString();
    numberString.replace(/(\.[1-9]*)0+$/, "$1");
    numberString.replace(/\.$/, "");

    return Number(numberString);
}

function TryParseDoubleValue(field, decimalPlaceSeperator, defaultValue) {
    try {
        if (field.value == "" || isNaN(field.value.replace(decimalPlaceSeperator, "."))) {
            field.value = defaultValue;
        }
    } catch (e) {
    } 
} 


function CalcaulateRealSliderValue(min_value, max_value, sliderTextBox, valueBox, decimalPlaceSeperator, decimalPlaces) {
    var result = "NaN";
    var currentValueString = sliderTextBox.value.replace(decimalPlaceSeperator, ".");

    if (!isNaN(currentValueString)) {
        var value = Number(currentValueString);
        result = ((max_value - min_value) * value) + min_value;
    }
    SetValue2(valueBox, result, decimalPlaceSeperator, decimalPlaces);
}

function CalculateRealSliderValue_logten(min_value, max_value, sliderTextBox, valueBox, decimalPlaceSeperator,decimalPlaces) {
    var result = "NaN";
    var currentValueString = sliderTextBox.value.replace(decimalPlaceSeperator, ".");
    var min_valueCeiledLog10 = min_value <= 0 ? 0 : Math.ceil(Math.log(min_value) / Math.log(10));
    var max_valueCeiledLog10 = max_value <= 0 ? 0 : Math.ceil(Math.log(max_value) / Math.log(10));

    if (!isNaN(currentValueString)) {
        var minimumPiece = min_valueCeiledLog10;
        var logarithmicPieces = max_valueCeiledLog10 - minimumPiece;

        if (logarithmicPieces == 1) {
            //If there is only one piece it is calculated like a linear slider
            CalcaulateRealSliderValue(min_value, max_value, sliderTextBox, valueBox, decimalPlaceSeperator, decimalPlaces);
            return;
        } 
        
        var logarithmicPieceLength = 1 / logarithmicPieces;

        var value = Number(currentValueString);

        var pieceNumber = Math.ceil(value / logarithmicPieceLength);
        var pieceMaxValue = Math.pow(10, min_valueCeiledLog10 + pieceNumber);
        if (pieceMaxValue > max_value) {
            pieceMaxValue = max_value;
        }
        var pieceMinValue = (pieceNumber <= 1) ? min_value : Math.pow(10, min_valueCeiledLog10 + pieceNumber - 1);        
        
        if (value  === 0) {
            result = pieceMinValue;
        }
        else {

            var ownPieceDistance = value - ((pieceNumber - 1) * logarithmicPieceLength);

            var displayedValue = pieceMinValue + ((ownPieceDistance / logarithmicPieceLength) * (pieceMaxValue - pieceMinValue));
            if (displayedValue  === 0) {
                displayedValue = pieceMinValue;
            }
            result = displayedValue.toString(); 
        }
    }

    SetValue2(valueBox, result, decimalPlaceSeperator, decimalPlaces);
}


function CalculateRealSliderValues(min_value, max_value, sliderTextBox, valueBox, sliderTextBox2, valueBox2, decimalPlaceSeperator, decimalPlaces) {
    CalcaulateRealSliderValue(min_value, max_value, sliderTextBox, valueBox, decimalPlaceSeperator, decimalPlaces);
    if (sliderTextBox2 !== null && valueBox2 !== null) {
        CalcaulateRealSliderValue(min_value, max_value, sliderTextBox2, valueBox2, decimalPlaceSeperator, decimalPlaces);
    }  
}
    
function CalculateRealSliderValues_logten(min_value, max_value, sliderTextBox, valueBox, sliderTextBox2, valueBox2, decimalPlaceSeperator, decimalPlaces) {
    CalculateRealSliderValue_logten(min_value, max_value, sliderTextBox, valueBox, decimalPlaceSeperator, decimalPlaces);
    if (sliderTextBox2 !== null && valueBox2 !== null) {
        CalculateRealSliderValue_logten(min_value, max_value, sliderTextBox2, valueBox2, decimalPlaceSeperator, decimalPlaces);
    }
}

function ChangeSliderPosLog(sender, target, min_value, max_value, decimalPlaceSeperator,defaultValue) {
    TryParseDoubleValue(sender,decimalPlaceSeperator, defaultValue);
    var currentValueString = sender.value.replace(decimalPlaceSeperator, ".");
    var min_valueCeiledLog10 = min_value <= 0 ? 0 : Math.ceil(Math.log(min_value) / Math.log(10));
    var max_valueCeiledLog10 = max_value <= 0 ? 0 : Math.ceil(Math.log(max_value) / Math.log(10));
    if (!isNaN(currentValueString)) {
        var minimumPiece = min_valueCeiledLog10;
        var logarithmicPieces = max_valueCeiledLog10 - minimumPiece;
        if (logarithmicPieces == 1) {
            //If there is only one piece it is calculated like a linear slider
            ChangeSliderPos(sender, target, min_value, max_value, decimalPlaceSeperator, defaultValue);
            return;
        }
        var logarithmicPieceLength = 1 / logarithmicPieces;

        var value = Number(currentValueString);
        var pieceNumber = value <= 0 ? 0 : Math.ceil(Math.log(value) / Math.log(10));
        var actualPieceNumber = pieceNumber < 1 ? pieceNumber : pieceNumber - min_valueCeiledLog10;
        var pieceMaxValue = Math.pow(10, min_valueCeiledLog10 + actualPieceNumber);
        if (pieceMaxValue > max_value) {
            pieceMaxValue = max_value;
        }
        var pieceMinValue = (actualPieceNumber <= 1) ? min_value : Math.pow(10, min_valueCeiledLog10 + actualPieceNumber - 1);
        var ownPieceDistance = value - pieceMinValue;

        var sliderValue = (actualPieceNumber - 1) * logarithmicPieceLength;
        sliderValue += (ownPieceDistance / (pieceMaxValue - pieceMinValue)) * logarithmicPieceLength;

        SetValue(target, sliderValue, decimalPlaceSeperator);
        FireOnchangeEvent(target);
    }
}

function ChangeSliderPos(sender, target, min_value, max_value, decimalPlaceSeperator, defaultValue) {
    TryParseDoubleValue(sender, decimalPlaceSeperator, defaultValue);
    var result = "NaN";
    var currentValueString = sender.value.replace(decimalPlaceSeperator, ".");

    if (!isNaN(currentValueString)) {
        var value = Number(currentValueString);
        result = (value - min_value) / (max_value - min_value);
    }

    SetValue(target, result, decimalPlaceSeperator);
    FireOnchangeEvent(target);
}


