function EgnChecker() {
    this.digits = [];
    this.coeffs = [2, 4, 8, 5, 10, 9, 7, 3, 6];
    this.days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
}

EgnChecker.prototype._isLeapYear = function(yyyy) {
    if (yyyy % 400 == 0) {
        return true;
    }
    if (yyyy % 100 == 0) {
        return false;
    }
    if (yyyy % 4 == 0) {
        return true;
    }

    return false;
}

EgnChecker.prototype._fillInDigits = function(text) {
    for (var i = 0; i < text.length; i++) {
        var digit = parseInt(text.charAt(i), 10);

        if (isNaN(digit)) {
            break;
        }
        
        this.digits[i] = digit;
    }
    
    if (10 != this.digits.length) {
        return false;
    } else {
        return true;
    }
}

EgnChecker.prototype.check = function(text) {
    if (this._fillInDigits(new String(text))) {
        var dd = this.digits[4] * 10 + this.digits[5];
        var mm = this.digits[2] * 10 + this.digits[3];
        var yy = this.digits[0] * 10 + this.digits[1];
        var yyyy = null;

        if (mm >= 1 && mm <= 12) {
            yyyy = 1900 + yy;
        } else if (mm >= 21 && mm <= 32) {
            mm -= 20;
            yyyy = 1800 + yy;
        } else if (mm >= 41 && mm <= 52) {
            mm -= 40;
            yyyy = 2000 + yy;
        } else {
            return -2;
        }

        this.days[1] += this._isLeapYear(yyyy) ? 1 : 0;

        if (!(dd >= 1 && dd <= this.days[mm - 1])) {
            return -3;
        }

        var checksum = 0;

        for (var j = 0; j < this.coeffs.length; j++) {
            checksum += this.digits[j] * this.coeffs[j];
        }
        checksum %= 11;
        if (10 == checksum) {
            checksum = 0;
        }

        if (this.digits[9] != checksum) {
            return -4;
        }

        return 0;
    } else {
        return -1;
    }
}
