Skip to content

Instantly share code, notes, and snippets.

@maximkott
Last active August 5, 2020 07:38
Show Gist options
  • Save maximkott/f41918e83c46e8e8a4066d4793eccd31 to your computer and use it in GitHub Desktop.
Save maximkott/f41918e83c46e8e8a4066d4793eccd31 to your computer and use it in GitHub Desktop.

Revisions

  1. maximkott renamed this gist Aug 5, 2020. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. maximkott created this gist Nov 28, 2019.
    163 changes: 163 additions & 0 deletions iban mask
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,163 @@
    var IBAN_MASKS = {
    'default': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS',
    'AD': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'AL': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS',
    'AT': 'SSSS SSSS SSSS SSSS SSSS',
    'BA': 'SSSS SSSS SSSS SSSS SSSS',
    'BE': 'SSSS SSSS SSSS SSSS',
    'BG': 'SSSS SSSS SSSS SSSS SSSS SS',
    'CH': 'SSSS SSSS SSSS SSSS SSSS S',
    'CY': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS',
    'CZ': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'DE': 'SSSS SSSS SSSS SSSS SSSS SS',
    'DK': 'SSSS SSSS SSSS SSSS SS',
    'EE': 'SSSS SSSS SSSS SSSS SSSS',
    'ES': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'FI': 'SSSS SSSS SSSS SSSS SS',
    'FO': 'SSSS SSSS SSSS SSSS SS',
    'FR': 'SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'GB': 'SSSS SSSS SSSS SSSS SSSS SS',
    'GE': 'SSSS SSSS SSSS SSSS SSSS SS',
    'GG': 'SSSS SSSS SSSS SSSS SSSS SS',
    'GI': 'SSSS SSSS SSSS SSSS SSSS SSS',
    'GL': 'SSSS SSSS SSSS SSSS SS',
    'GR': 'SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'HR': 'SSSS SSSS SSSS SSSS SSSS S',
    'HU': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS',
    'IE': 'SSSS SSSS SSSS SSSS SSSS SS',
    'IS': 'SSSS SSSS SSSS SSSS SSSS SSSS SS',
    'IT': 'SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'LI': 'SSSS SSSS SSSS SSSS SSSS S',
    'LT': 'SSSS SSSS SSSS SSSS SSSS',
    'LU': 'SSSS SSSS SSSS SSSS SSSS',
    'LV': 'SSSS SSSS SSSS SSSS SSSS S',
    'MC': 'SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'MD': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'ME': 'SSSS SSSS SSSS SSSS SSSS SS',
    'MK': 'SSSS SSSS SSSS SSSS SSS',
    'MT': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'NL': 'SSSS SSSS SSSS SSSS SS',
    'NO': 'SSSS SSSS SSSS SSS',
    'PL': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS',
    'PT': 'SSSS SSSS SSSS SSSS SSSS SSSS S',
    'RO': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'RS': 'SSSS SSSS SSSS SSSS SSSS SS',
    'SE': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'SI': 'SSSS SSSS SSSS SSSS SSS',
    'SK': 'SSSS SSSS SSSS SSSS SSSS SSSS',
    'SM': 'SSSS SSSS SSSS SSSS SSSS SSSS SSS',
    'UA': 'SSSS SSSS SSSS SSSS SSSS SSSS SSSS S',
    };

    var mask = IBAN_MASKS[country_code] || IBAN_MASKS['default'];
    var placeholder = ' ';

    var is_swiss_postfinance_number = country_code == 'CH' && (bic == 'POFICHBEXXX' || bic == '09000');

    if (is_swiss_postfinance_number) {
    mask = '00-0000-0';
    if (value.length == 10) {
    mask = '00-00000-0';
    } else if (value.length == 11) {
    mask = '00-000000-0';
    }
    placeholder = '-'
    }

    value = $dummyInput.mask(mask, {
    translation: {
    'S': {
    pattern: /[0-9A-Za-z]/
    }
    },
    placeholder: placeholder
    }).val();
    return maskString(value, mask, {
    'S': /[0-9A-Za-z]/,
    '0': /[0-9]/,
    });
    }

    return value;
    function maskString(value, mask, maskPatterns) {
    value = value || ''
    mask = mask || '';
    maskPatterns = maskPatterns || {};

    var maskedValue = '';
    // array representation of string under test
    var valueParts = value.split('');
    // array representation of the mask
    var maskParts = mask.split('');

    // as long as there are still characters left in
    // the original string, one must try to mask them
    while (valueParts.length > 0) {
    // take the first character and remove
    // it from the original string
    var unmaskedChar = valueParts.shift();

    // as long as the character has not been masked
    // one must try to find a masking character
    while (unmaskedChar !== null) {
    // take the first mask character from
    // the mask string
    var maskChar = maskParts.shift();

    // make sure the masking character exists
    // otherwise this means that the original string
    // exceeds the masking pattern length
    if (maskChar !== undefined) {
    // try to find a pattern for the particular
    // mask character
    var maskPattern = maskPatterns[maskChar.toUpperCase()];

    // if there is no pattern configured for
    // this particular mask character, assume
    // the mask character is a placeholder
    // that must be added to the string
    if (maskPattern !== undefined) {
    var check = false;

    // mask pattern can be either a function
    if (typeof maskPattern === 'function') {
    check = maskPattern(unmaskedChar);
    }
    // or a regex string
    else if (maskPattern instanceof RegExp) {
    check = maskPattern.test(unmaskedChar);
    }

    // if character has passed the mask check,
    // it can bee added to the final masked value
    if (check) {
    maskedValue += unmaskedChar;
    }
    // otherwise one must put the pattern back into
    // the array so the next character can try to
    // pass the mask check
    else {
    maskParts.unshift(maskChar);
    }

    unmaskedChar = null;
    }
    // mask character is a placeholder / formatting value
    // and must be added to the masked string
    else {
    maskedValue += maskChar;
    }
    }
    // no masking character has been found,
    // the original string is probably longer
    // then the mask pattern and therefore
    // the leftovers can be cut off
    else {
    // reset current character to continue the loop
    unmaskedChar = null;
    }
    }
    }

    return maskedValue;
    }