Files
2026-06-24 14:12:44 -07:00

73 lines
2.0 KiB
JavaScript

/**
* EAN-13 normalization helpers for the Codes tool.
*/
(function(global) {
'use strict';
function checksum(base12) {
var sum = 0;
for (var i = 0; i < 12; i++) {
var digit = parseInt(base12.charAt(i), 10);
sum += (i % 2 === 0) ? digit : digit * 3;
}
return String((10 - (sum % 10)) % 10);
}
function upcChecksum(upc12) {
var sum = 0;
for (var i = 0; i < 11; i++) {
var digit = parseInt(upc12.charAt(i), 10);
sum += (i % 2 === 0) ? digit * 3 : digit;
}
return String((10 - (sum % 10)) % 10);
}
function isValidUpcA(digits) {
return digits.length === 12
&& digits.charAt(0) === '0'
&& upcChecksum(digits) === digits.charAt(11);
}
function fromUpcA(upc12) {
var ean12 = '0' + upc12.slice(0, 11);
return ean12 + checksum(ean12);
}
function normalize(input) {
var digits = String(input || '').replace(/\D/g, '');
if (digits.length < 12) {
return {
ok: false,
error: 'EAN-13 requires 12 or 13 digits.'
};
}
if (digits.length > 13) {
return {
ok: false,
error: 'EAN-13 accepts at most 13 digits.'
};
}
if (digits.length === 12 && isValidUpcA(digits)) {
return { ok: true, value: fromUpcA(digits) };
}
var base12 = digits.length === 12 ? digits : digits.slice(0, 12);
return { ok: true, value: base12 + checksum(base12) };
}
var api = {
checksum: checksum,
upcChecksum: upcChecksum,
isValidUpcA: isValidUpcA,
fromUpcA: fromUpcA,
normalize: normalize
};
if (typeof module !== 'undefined' && module.exports) {
module.exports = api;
} else {
global.Ean13Utils = api;
}
})(typeof window !== 'undefined' ? window : globalThis);