﻿/* empty function, do not remove */
function nop() { }

/* for console logging */
function clog(text) {
    if (typeof console != 'undefined' && console.log)
        console.log(text);
}

function onlyNumbers(sender) {
    replacer(sender, /[^0-9.]/g);
}

function onlyCharacters(sender) {
    replacer(sender, /[^a-zA-ZäöüÄÜÖ]/g);
}

function noSpecialCharacters(sender) {
    replacer(sender, /[^a-zA-ZäöüÄÜÖ0-9. ]/g);
}


// Replacing/removing the "<" character to avoid javascript injection!
function avoidJSInjection(sender) {
    replacer(sender, /[<]/g);
}

// Replacing/removing the "<" character to avoid javascript injection!
function avoidJSInjection2(sender) {
    value = $(sender).val().replace(/[<]/g, '');
    $(sender).val(value)
}

// Replaces any to the given regexp fitting character
// Method includes well cursor position handling.
function replacer(sender, regexp) {
    if ((sender == null) || (typeof (sender) == 'undefined'))
        return;

    if (!sender.value)
        return;

    var curPos = getCursorPosition(sender);

    var value = $(sender).val()
    if ((value == "") || (typeof (value) == "undefined"))
        return;

    var before = value.length;

    value = value.replace(regexp, '');

    var after = value.length;
    var delta = before - after;
    if (delta > 0) {
        $(sender).val(value);
        setCursorPosition(sender, curPos - delta);
    }
}

//  Used in UN for calculating the Payout and handling input errors & HR for formatting the InsuredAmount 
var oldInsuranceValue = "";

function CheckAndFormatValue(ID_AmountInsured, ID_Payout, ID_Progression, currencySymbol) {
    //optinal parameter CurrencySymbol, used to overwritte the standard euro sign
    if (typeof currencySymbol == "undefined"){
        currencySymbol = " €";
    }
    var f = document.getElementById(ID_AmountInsured.replace("#",""));
    var curPos = getCursorPosition(f);

    var valueInsured = $(ID_AmountInsured).val();
    valueInsured = RemoveCharacters(valueInsured);

    var s = "";
    for (var i = 0; i < valueInsured.length; i++) {
        var c = valueInsured.substr(i, 1);
        if ((c.charCodeAt(0) >= 48) && (c.charCodeAt(0) <= 57)) {
            s = s + c;
        }
    }

    var x = 0;
    var y = 0;
    if (s != "") {
        x = parseInt((oldInsuranceValue.length - 1) / 3);
        y = parseInt((s.length - 1) / 3);
        oldInsuranceValue = s;
        s = AddDelimiter(s);
        $(ID_AmountInsured).val(s + currencySymbol);

        if (ID_Progression != "")
            CalcPayout(ID_AmountInsured, ID_Payout, ID_Progression);
    }
    else {
        ClearField(ID_AmountInsured, ID_Payout);
    }

    var offset = 0;
    if (x < y)
        offset = y - x;

    try {   // field "f" can be "block: display;" while some surrounding fields/div make it "invisible"
            // and trying to set the cursor in an invisible field ends in a crash!
        setCursorPosition(f, curPos + offset);
    }
    catch(exception) {}
}

function CalcPayout(ID_AmountInsured, ID_Payout, ID_Progression) {
    var valueInsured = $(ID_AmountInsured).val();
    if (valueInsured != "") {
        valueInsured = RemoveCharacters(valueInsured);

        var v = parseInt(valueInsured);

        var valueProgression = $(ID_Progression).val().replace(",", ".");
        var payout = parseFloat(valueInsured) * parseFloat(valueProgression);

        var intPayout = parseInt(payout);
        var rest = payout - intPayout;

        var s = intPayout.toString();
        s = AddDelimiter(s);
        if (rest != 0)
            s = s + "," + rest.toFixed(2).toString().substr(2);

        $(ID_Payout).html(s + " €");
    }
    else {
        ClearField(ID_AmountInsured, ID_Payout);
    }
}

function ClearField(ID_AmountInsured, ID_Payout) {
    $(ID_AmountInsured).val("");
    $(ID_Payout).html("0,00 €");
}

function AddDelimiter(value) {
    value = RemoveCharacters(value);

    var i = value.length - 1;
    var j = 0;
    var result = "";
    var offset = 0;

    while (i >= 0) {
        c = value.substr(i, 1);
        result = c + result;
        if ((((++j) % 3) == 0) && (i != 0)) {
            result = "." + result;
        }
        i--;
    }
    return result;
}

function RemoveCharacters(value) {
    value = RemoveAll(value, ".");
    value = RemoveAll(value, " ");
    value = RemoveAll(value, "€");

    var i = 0;
    while (value.substr(i++, 1) == "0")
    { }
    i--;
    if (i > 0)
        value = value.substr(i);

    return value;
}

function RemoveAll(value, RemoveCharacter) {
    var l = value.length;
    if ((l > 0) && (RemoveCharacter != "")) {
        do {

            before = value.length;
            value = value.replace(RemoveCharacter, "");

        } while (before > value.length)
    }

    return value;
}

function getCursorPosition(field) {
    var caretPos = 0;

    if (document.selection) { // IE
        try {
            field.focus();
        }
        catch (err) { }
        var sel = document.selection.createRange();
        if (field.value)
            sel.moveStart("character", -field.value.length);
        caretPos = sel.text.length;
    }
    else if (field.selectionStart || field.selectionStart == "0") // Firefox
        caretPos = field.selectionStart;
    
    return caretPos;
}

function setCursorPosition(ctrl, pos) {
    if (ctrl.setSelectionRange) { // IE
        ctrl.focus();
        ctrl.setSelectionRange(pos, pos);
    }
    else if (ctrl.createTextRange) { // Firefox
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd("character", pos);
        range.moveStart("character", pos);
        range.select();
    }
}

function formatValueToGermanNotation(value, decimalPlaces, shouldBeRounded) {
    // 1234567.89947 (note the dot!) -> "1.234.567,90"
    // given: number; return value type: string

    var factor = Math.pow(10, decimalPlaces);               // deciamlPlaces = 2 -> factor = 100
    if (shouldBeRounded)
        value = parseInt(value * factor + 0.5) / factor;    // rounding, 2 numbers after the commata; 1234567.89947 -> 1234567.9
    else
        value = parseInt(value * factor) / factor;          // No rounding, 2 numbers after the commata; 1234567.89947 -> 1234567.9

    var part1 = value.toString();
    var part2 = "";
    var pos = part1.indexOf(".")
    if (pos != -1) {
        part2 = part1.substring(pos + 1);   // "9"
        part1 = part1.substr(0, pos);       // "1234567"
    }

    valueFormated = AddDelimiter(part1)
    if (valueFormated == "")
        valueFormated = "0";

    if (part2 != "") {
        var n = decimalPlaces - part2.length;
        for  (var a = 0; a < n; a++)
            part2 += "0";
    
        valueFormated += "," + part2;
    }

    return valueFormated;
}

function endsWith(str, suffix, lowerCaseComparison) {
    if (str == '')
        return false;
    if (str.length == 0)
        return false;
    if (suffix == '')
        return false;
    if (suffix.length == 0)
        return false;

    if (lowerCaseComparison) {
        str = str.toLowerCase();
        suffix = suffix.toLowerCase();
    }

    return (str.indexOf(suffix, str.length - suffix.length) != -1);
}

function startsWith(str, prefix, lowerCaseComparison) {
    if (str == '')
        return false;
    if (str.length == 0)
        return false;
    if (prefix == '')
        return false;
    if (prefix.length == 0)
        return false;

    if (prefix.length > str.length)
        return false;

    if (lowerCaseComparison) {
        str = str.toLowerCase();
        prefix = prefix.toLowerCase();
    }

    var comparePart = str.substr(0, prefix.length);  // str="123456", prefix="abc" -> comparePart = "123"
    
    return (comparePart == prefix);
}

//  Used in MOT dialog to handle the slider
var slider_err;
var sbvk_hidden;
var sbtk_hidden;
var slider_panel;

var sbvk_class = ".slider_sbvk";
var sbtk_class = ".slider_sbtk";

function initializeKaskoSlider(sbvk_hidden_ID, sbtk_hidden_ID, error_ID, slider_panel_ID) {
    sbvk_hidden = $(sbvk_hidden_ID);
    sbtk_hidden = $(sbtk_hidden_ID);
    slider_err = $(error_ID);
    slider_panel = $(slider_panel_ID);

    slider_err.hide();
    $(sbvk_class).slider({
        value: KaskoToStep(sbvk_hidden.val()),
        min: 0,
        max: 3,
        step: 1,
        slide: function(event, ui) {
            setVK(ui.value);
        }
    });

    $(sbtk_class).slider({
        value: KaskoToStep(sbtk_hidden.val()),
        min: 0,
        max: 3,
        step: 1,
        slide: function(event, ui) {
            changeTK(ui.value);
        },
        stop: function(event, ui) {
            setTK(ui.value);
        }
    });

    $('input[name=L_MOT_KaskoType_ID]').click(function () { checkCoverage(); });
    checkCoverage();
}

function isVisible() {
    var ret = slider_panel.css("display") != "none";
    return ret;
}

function stepToKasko(step) {
    if (step == 0) return 0;
    if (step == 1) return 150;
    if (step == 2) return 300;
    if (step == 3) return 500;
    return false;
}

function KaskoToStep(kasko) {
    if (kasko == 0) return 0;
    if (kasko == 150) return 1;
    if (kasko == 300) return 2;
    if (kasko == 500) return 3;
    return false;
}

function setMaxTK(step) {
    for(var i=0; i<=3; i++) {
        if (i <= step) {
          $(sbtk_class + i).removeClass('inactive');
        } else {
            $(sbtk_class + i).addClass('inactive');
        }
    };

    if ($(sbtk_class).slider('value') > step) {
        $(sbtk_class).slider('value', step);
        setTK(step);
    }
}

function setVK(step) {
    sbvk_hidden.val(stepToKasko(step));
    $(sbvk_class).slider('value', step);
    if (isVisible()) {
        setMaxTK(step);
    }

    $("#Data_SB_VK_validationMessage").html("");  
    if (typeof fieldList != "undefined")
        clearSummary(fieldList);
}

function setTK(step) {
    if (isVisible()) {
        var step_vk = $(sbvk_class).slider('value');
        if(step > step_vk) {
            step = step_vk;
        }
    }
 
    slider_err.hide();
    $("#Data_SB_TK_validationMessage").html("");  
    if (typeof fieldList != "undefined")
        clearSummary(fieldList);

    sbtk_hidden.val(stepToKasko(step));
    $(sbtk_class).slider('value', step);
}

function changeTK(step) {
    if (isVisible()) {
        var step_vk = $(sbvk_class).slider('value');
        if(step > step_vk) {
            slider_err.show();
        } else {
            slider_err.hide();
        }
    }
}

function checkCoverage() {
    if (isVisible()) {
        var step_vk = $(sbvk_class).slider('value');
        var step_tk = $(sbtk_class).slider('value');

        if (step_tk > step_vk) {
            setTK(step_vk);
        }
      
        setMaxTK($(sbvk_class).slider('value'));
    } else {
        setMaxTK(stepToKasko(3));
    };
}


function forceTopFocus(id) {
    $("#forceFocus").focus();
    $(id).focus();
}

function computeAbsoluteAjaxURL(controllerFunctionName) {
    // This method is called from "ResultScript.js", "PostalScript.js" and "Action.aspx" site.

    if (!startsWith(controllerFunctionName, "/", true))
        controllerFunctionName = "/" + controllerFunctionName;      // "/GetResult" (also for ZZV!), "/CheckPostalCode", "/GetStreetList"

    var currURL = document.URL;                             // https://.../b2bpartner/HRa/?param1=whatever          note the "/?"
    var parts = document.URL.split('?');
    if (parts.length > 1)
        currURL = parts[0];                                 // https://.../b2bpartner/HRa/                          note the last "/"

    if (endsWith(currURL, '/', true))
        currURL = currURL.substr(0, currURL.length - 1);    // https://.../b2bpartner/HRa                           cutting the last "/"

    var products = ['HHV',  //  1
                    'HRa',  //  2
                    'MOT',  //  3
                    'PHVa', //  4
                    'RHV',  //  5
                    'RLV',  //  6
                    'RSa',  //  7
                    'UN',   //  8
                    'WHG',  //  9
                    'ZZV'   // 10
                    ];

    for (a = 0; a < products.length; a++) {
        if (endsWith(currURL, products[a], true)) {
            // Example: 
            // current URL: "https://.../HRa"
            // given URL  : "HRa/CheckPostalCode"
            // -> Note that a complete URL will be asigned!
            URL = currURL + controllerFunctionName;             // https://.../b2bpartner/HRa/CheckPostalCode       fine!
            break;
        } else if (currURL.toLowerCase().indexOf("/" + products[a].toLowerCase() + "/") != -1) {    // https://.../b2bpartner/HRa/Input1...             the last "/" is needed to find "HRa" and not "HR"
            var pos = currURL.toLowerCase().indexOf(products[a].toLowerCase());
            var prodlen = products[a].length;
            URL = currURL.substr(0, pos + prodlen) + controllerFunctionName;
            break;
        }
    }

    return URL;
}

function getAjaxBaseAddress() {
    return document.location.href.substring(0, document.location.href.lastIndexOf('/')) + '/Ajax/';
}

function getNavText(dataArray, boldIndex, errorURL, navElement) {
    if (typeof boldIndex == 'undefined')
        boldIndex = 1;

    if (typeof navElement == 'undefined')
        navElement = "#navSelected";


    var data = { args: dataArray, boldIndex: boldIndex };
    var ret = "Datenabfrage";
    $.ajax({
        type: "POST",
        async: false,       // !
        url:  getAjaxBaseAddress() + "generateNavText",
        data: data,
        success: function (result) {
            $(navElement).html(result.toString());
        },
        error: function () {
            window.location = errorURL;
        },
        dataType: "json"
    });
    
}

