102 lines
2.5 KiB
HTML
102 lines
2.5 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>CPR-nummer</title>
|
||
|
<style>
|
||
|
body {
|
||
|
text-align: center;
|
||
|
font-family: sans-serif;
|
||
|
}
|
||
|
label {
|
||
|
font-size: 1.4em;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
#input {
|
||
|
font-family: monospace;
|
||
|
width: 11ch;
|
||
|
font-size: 1.4em;
|
||
|
padding: 4px 6px;
|
||
|
margin-top: 4px;
|
||
|
}
|
||
|
#result {
|
||
|
font-size: 1.2em;
|
||
|
}
|
||
|
#result.valid {
|
||
|
color: green;
|
||
|
}
|
||
|
#result.invalid {
|
||
|
color: red;
|
||
|
}
|
||
|
</style>
|
||
|
<script>
|
||
|
window.onload = function() {
|
||
|
var input = document.getElementById("input");
|
||
|
var result = document.getElementById("result");
|
||
|
var description = document.getElementById("description");
|
||
|
|
||
|
input.onkeyup = function() {
|
||
|
// Reset
|
||
|
result.className = "";
|
||
|
result.innerText = "";
|
||
|
description.innerText = "";
|
||
|
|
||
|
// Validate
|
||
|
if (input.value.length != 11 || !input.reportValidity()) return;
|
||
|
|
||
|
// Calculate date
|
||
|
var day = parseInt(input.value.slice(0, 2));
|
||
|
var month = parseInt(input.value.slice(2, 4));
|
||
|
var year = parseInt(input.value.slice(4, 6));
|
||
|
|
||
|
// Calculate full year
|
||
|
var seventhDigit = parseInt(input.value.charAt(7));
|
||
|
if (seventhDigit < 4) year += 1900;
|
||
|
else if (seventhDigit === 4 || seventhDigit === 9) year += (year > 36 ? 1900 : 2000);
|
||
|
else if (seventhDigit < 8) year += (year > 57 ? 1900 : 2000);
|
||
|
|
||
|
// Get strings for result
|
||
|
var date = new Date(year, month - 1, day);
|
||
|
var dateString = date.toLocaleDateString("da-DK", {
|
||
|
year: "numeric",
|
||
|
month: "long",
|
||
|
day: "numeric",
|
||
|
});
|
||
|
|
||
|
var gender = parseInt(input.value.charAt(10)) % 2 === 0 ? "Kvinde" : "Mand";
|
||
|
|
||
|
// Calculate checksum
|
||
|
var factors = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1];
|
||
|
|
||
|
var sum = input.value
|
||
|
.replace("-", "")
|
||
|
.split("")
|
||
|
.map(function(digit, index) {
|
||
|
return parseInt(digit) * factors[index];
|
||
|
})
|
||
|
.reduce(function(acc, val) {
|
||
|
return acc + val;
|
||
|
}, 0);
|
||
|
|
||
|
if (sum % 11 === 0) {
|
||
|
result.className = "valid";
|
||
|
result.innerText = "Gyldigt CPR-nummer";
|
||
|
description.innerHTML = "<b>Fødselsdato:</b> " + dateString + "<br><b>Køn:</b> " + gender;
|
||
|
|
||
|
} else {
|
||
|
result.className = "invalid";
|
||
|
result.innerText = "Ugyldigt CPR-nummer";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
</head>
|
||
|
<body>
|
||
|
<label for="input">Indtast CPR-nummer:</label>
|
||
|
<br>
|
||
|
<input id="input" type="text" placeholder="XXXXXX-XXXX" maxlength="11" pattern="\d{6}-\d{4}" autofocus>
|
||
|
<p id="result"></p>
|
||
|
<p id="description"></p>
|
||
|
</body>
|
||
|
</html>
|
||
|
|