function generate() {
    var banknummer = '';

    // generate a number, only take care that the 1st 3 digits are 0..2
    for (var i = 0; i < 9; i++) {
        banknummer += rand_num(9);
    }

    // validate the number, and if not ok try again
    if(!(is_valid(banknummer))) {
        banknummer = generate();
    }

    return banknummer;
}

function banknummer_elfproef(str) {
    var sum = 0;
    
    for (var i = 0; i < 9; i++) {
        sum += str.charAt(i) * (9 - i);
    }
    
    return sum % 11 === 0;
}


// is_valid only works on strings
function is_valid(str) {
    if (str === undefined) {
        return false;
    }
    
    // remove . characters and spaces
    str = str.replace(/[. ]/g, '');
    
    if ( !(/^\d{9}$/.test(str)) || // 9 decimals large
         !(/^(?:[1-9][0-8]|[1-8][0-9])/.test(str)) ||
         !(banknummer_elfproef(str)) ) {      // valid according to elfproef
             
         return false;
    } else {
        return true;        
    }
}

function rand_num(min, max) {
    return rand_func(min, max)();
}

function rand_func(min, max) {
    if (max === undefined) {
        max = min;
        min = 0;
    }
    
    var diff = max - min;  
    
    return function() { 
        return Math.floor( min + Math.random() * (diff + 1) );
    };
}                   


