﻿function txtWatermark(txtName) {

    $(txtName).val($(txtName).attr("title"));

    $(txtName).focus(function() {
        if ($(this).val() == $(this).attr("title")) {
            $(this).val("");
            $(txtName).toggleClass("water2");
        }
    });

    $(txtName).blur(function() {
        if ($.trim($(this).val()) == "") {
            $(this).val($(this).attr("title"));
            $(txtName).toggleClass("water2");
        }
    });
}


function keyup(control, func) {
    $(control).keyup(function(e) {
        if (e.keyCode == 13) {
            func();
        }
    });
}


function ifIsNotNullOrEmpty(data, text) {

    // Mamy jakieś dane
    if (data != null && data.length > 0) {
        return text;
    }

    return '';
}

function ustawInfoPoprawne(info) {
    wyczyscResult();
    $("#result").removeClass("none");
    $("#result").addClass("correct");
    $("#icon").removeClass("none");

    $("#info").html(info);
}

function ustawInfoNiePoprawne(info) {
    wyczyscResult();
    $("#result").removeClass("none");
    $("#result").addClass("incorrect");
    $("#icon").removeClass("none");

    $("#info").html(info);
}

function ustawMessage(msg) {
    $("#icon-message").removeClass("none");

    $("#message").html(msg);
}

function ustawMessageW(where, msg) {
    $("#icon-message").removeClass("none");

    $(where).html(msg);
}


function wyczyscResult() {
    $("#result").removeClass("correct");
    $("#result").removeClass("incorrect");
    
    $("#result").toggleClass("none", !$(this).hasClass("none"));
    $("#icon").toggleClass("none", !$(this).hasClass("none"));
    $("#icon-message").toggleClass("none", !$(this).hasClass("none"));

    $("#info").html('');
    $("#message").html('');
}

function wyczyscResult(i) {

    $("#result").removeClass("correct");
    $("#result").removeClass("incorrect");

    $("#result").toggleClass("none", !$(this).hasClass("none"));
    $("#icon").toggleClass("none", !$(this).hasClass("none"));
    $("#icon-message").toggleClass("none", !$(this).hasClass("none"));

    i = $("#message:has(div)").length;

    if (i == 0 || i == null) {
        $("#info").html('');
        $("#message").html('');
    }
    else if (i >=  1) {
        $("#info").html('');
        $("#msg-1").html('');
        $("#msg-2").html('');
    }
}

function callWebService(url,param,s,e) {
    $.ajax({
        type: "POST",
        url: url,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: param,

        success: function(msg) {
            s(msg);
        },

        error: function(xhr, msg) {
            e(msg);
        }
    })
}

/*---------------------------------------------------------*/
/* Funkcje sprawdzające poprawność */

function explodeString(value) {
///<summary></summary>
///<param name="value">Tekst który trzeba rozbic</param>
///<returns>Tablice rozlitych liczb</returns>

    var x = Array();

    var i = 0;
    for (i = 0; i < value.length; i++) {
        x[i] = parseInt(value.charAt(i), 10);
    }

    return x;
}

function removeSeparators(str) {
    str = str.replace(/ /g, '');
    str = str.replace(/-/g, '');

    return str;
}


function getCharCode(str, d) {
    var res = Array();

    for (i = 0; i < str.length; i++) {
        res[i] = str.charCodeAt(i) - d;
    }

    return res;
}

function intArrayToString(arr) {
    var str = '';
    
    for (i in arr) {
        str += arr[i] + '';
    }
    
    return str;
}

function isInteger(str) {
    ///<summary>Sprawdza czy dany ciąg znaków zawiera same cyfry</summary>
    ///<param name="str">Ciąg znaków do sprawdzenia</param>
    ///<returns>Czy to jest liczba</returns>
    return /^\d+$/.test(str);
}

function isAlpha(str) {
    return  /[A-Za-z]/.test(str);
}

function isValidLuhn(digits, weights, modValue) {
///<summary>Oblicza wartosc alg. luhn'a</summary>
///<param name="digits">Cyfry</param>
///<param name="weights">Wagi</param>
///<param name="modValue">Modulo ile podać wynik</param>
///<returns>Wynik alg. luhn'a</returns>

    var sum = 0;
    var i=0;
    
    for (i in weights)
    {
        sum += (digits[i] * weights[i])
    }
    
    var mod =0;
    mod = sum % modValue;

    return mod;
}

function validatePESELChecksum(pesel) {
    var weights = Array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3);

    var digits = explodeString(pesel);

    var mod = isValidLuhn(digits, weights, 10);

    mod = 10 - mod;

    if (digits[10] == mod) {
        return true;
    }

    return false;
}

function PESELDajPlec(pesel) {
    pesel = removeSeparators(pesel);
    var p = parseInt(pesel.charAt(9),10);

    if (p % 2 == 1) {
        return 'mężczyzna';
    }
    else {
        return 'kobieta';
    }
    
    return '';
}

function PESELDajDateUrodzenia(pesel) {
    pesel = removeSeparators(pesel);

    var rok = parseInt(pesel.substring(0,2), 10);
    var miesiac = parseInt(pesel.substring(2,4), 10);
    var dzien = parseInt(pesel.substring(4,6), 10);

    if (miesiac >= 1 && miesiac <= 12) {
        rok += 1900;
    }
    else if (miesiac >= 21 && miesiac <= 32) {
        rok += 2000;
        miesiac -= 20;
    }
    else if (miesiac >= 41 && miesiac <= 52) {
        rok += 2100;
        miesiac -= 40;
    }
    else if (miesiac >= 60 && miesiac <= 72) {
        rok += 2200;
        miesiac -= 60;
    }
    else if (miesiac >= 80 && miesiac <= 92) {
        rok += 1800;
        miesiac -= 80;
    }

    return '' + dzien + ' '+ dajMiesiacSlownie(miesiac) + ' ' + rok;
}

function dajMiesiacSlownie(m) {
    var miesiace = Array('', 'styczeń', 'luty', 'marzec', 'kwiecien', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzien');
    return miesiace[m];
}

function isValidPESEL(pesel) {
///<summary>Sprawdza poprawność numeru PESEL</summary>
///<param name="pesel">Numer PESEL który chcemy sprawdzić</param>
///<returns>Czy dany numer PESEL jest poprawny</returns>

    pesel = removeSeparators(pesel);

    if (!isInteger(pesel)) {
        return false;
    }

    if (pesel.length != 11) {
        return false;
    }

    return validatePESELChecksum(pesel);
}

function validateREGONChecksum(regon) {
    var digits = explodeString(regon);

    var mod = 0;

    // Jeżeli regon ma 7 cyfr
    if (regon.length == 7) {
        mod = isValidLuhn(digits, Array(2, 3, 4, 5, 6, 7), 11);

        if (mod == digits[6]) {
            return true;
        }
    }

    // Jeżeli regon ma 9 cyfr
    if (regon.length == 9) {
        mod = isValidLuhn(digits, Array(8, 9, 2, 3, 4, 5, 6, 7), 11);
        if (mod == 10) {
            mod = 0;
        }
        
        if (mod == digits[8]) {
            return true;
        }
    }

    // Jeżeli regon ma 14 cyfr
    if (regon.length == 14) {
        mod = isValidLuhn(digits, Array(2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8), 11);

        if (mod == digits[13]) {
            return true;
        }
    }

    return false;
}

function isValidREGON(regon) {
///<summary>Sprawdza poprawność numeru REGON</summary>
///<param name="regon">Numer REGON który chcemy sprawdzić</param>
///<returns>Czy dany numer REGON jest poprawny</returns>

    regon = removeSeparators(regon);

    if (!isInteger(regon)) {
        return false;
    }

    if (regon.length != 7 && regon.length != 9 && regon.length != 14) {
        return false;
    }

    return validateREGONChecksum(regon);
}

function validateNIPChecksum(nip) {
    var weights = Array(6, 5, 7, 2, 3, 4, 5, 6, 7);
    var digits = explodeString(nip);

    var mod = isValidLuhn(digits, weights, 11);

    if (mod == digits[9]) {
        return true;
    }
    
    return false;
}

function isValidNIP(nip) {
///<summary>Sprawdza poprawność numeru NIP</summary>
///<param name="nip">Numer NIP który chcemy sprawdzić</param>
///<returns>Czy dany numer NIP jest poprawny</returns>

    nip = removeSeparators(nip);

    if (!isInteger(nip)) {
        return false;
    }

    if (nip.length != 10) {
        return false;
    }

    return validateNIPChecksum(nip);
}


function validateNDOChecksum(ndo) {
///<summary>Sprawdza poprawność numeru dowodu osobistego</summary>
///<param name="ndo">Numer dowodu osobitego który chcemy sprawdzić</param>
///<returns>Czy dany numer dowodu osobistego jest poprawny</returns>
    
    var weights = Array(7, 3, 1, 0, 7, 3, 1, 7, 3);

    var letters = ndo.substring(0, 3);
    var digits = ndo.substring(3, 9);

    var a = getCharCode(letters, 55);
    var b = explodeString(digits);

    a = a.concat(b);

    var mod = isValidLuhn(a, weights, 10);
    
    if (mod == a[3]) {
        return true;
    }

    return false;
}


function isValidNDO(ndo){
    ndo = removeSeparators(ndo);

    if (ndo.length != 9) {
        return false;
    }

    if (!isAlpha(ndo.substring(0, 3))) {
        return false;
    }

    if (!isInteger(ndo.substring(3, 9))) {
        return false;
    }

    var val = ndo.substring(0,3).toUpperCase() + ndo.substring(3,9);
    
    return validateNDOChecksum(val);
}

function validateIBANChecksum(iban) {
    var prefix = iban.substring(0, 2);
    var numPrefix = intArrayToString(getCharCode(prefix,55));

    iban = iban.substring(4, 28) + numPrefix + iban.substring(2, 4);

    var val = parseInt(iban.substring(0, 10), 10);
    val = val % 97;

    val = parseInt(val + iban.substring(10, 20), 10);
    val = val % 97;

    val = parseInt(val + iban.substring(20, 30), 10);
    val = val % 97;

    if (val == 1) {
        return true;
    }

    return false;
}


function nrbToIBAN(nrb) {
    nrb = removeSeparators(nrb);

    if (nrb.length == 26) {
        if (isInteger(nrb)) {
            return 'PL' + nrb;
        }
    }
    
    return nrb;
}


function isValidIBANPL(iban) {
    iban = nrbToIBAN(iban);

    return isValidIBAN(iban);
}


function isValidIBAN(iban) {
    iban = removeSeparators(iban);
    
    if (iban.length != 28) {
        return false;
    }

    if (!isAlpha(iban.substring(0, 2))) {
        return false;
    }

    if (!isInteger(iban.substring(2, 28))) {
        return false;
    }

    var val = iban.substring(0, 2).toUpperCase() + iban.substring(2, 28);

    return validateIBANChecksum(iban);
}

