Skip to content

Instantly share code, notes, and snippets.

@felipe-pita
Created March 17, 2020 01:39
Show Gist options
  • Save felipe-pita/b04c3d7647106e84b0a6ad892856b666 to your computer and use it in GitHub Desktop.
Save felipe-pita/b04c3d7647106e84b0a6ad892856b666 to your computer and use it in GitHub Desktop.
Código de barras
jQuery(function($) {
console.log(window.location.href);
if (window.location.href == 'https://erp.tiny.com.br/expedicao' || window.location.href == 'https://erp.tiny.com.br/expedicao#add') {
console.log('gerando plp');
var position = $('.form-group-section-simple');
var wrapper = $('<div class="form-group-section"> <div class="row"> <div class="col-md-4 form-group"> <div class="input-group search-sale-slip-wrapper"> <span class="input-group-btn"><button class="btn btn-default search-slip-note-indicator" type="button"><i class="fas fa-search"></i></button> </span> </div> </div> </div> </div>');
var input = $('<input class="form-control" placeholder="Pesquisar nota" />');
position.before(wrapper);
$('.search-sale-slip-wrapper').prepend(input);
var indicator = $('.search-slip-note-indicator');
input.keyup(function(e){
indicator.html('<i class="fas fa-search"></i>').css('background', '#fff');
if (e.keyCode == 13){
var value = input.val();
if (value.length > 0) {
var selectItem = $('tr[identificacao="NF ' + value + '"]');
if (selectItem.length === 1) {
indicator.html('<i class="fas fa-check" style="color: #fff"></i>').css('background', '#4de889');
if (!selectItem.find('.js-check-label input').is(':checked')) {
selectItem.find('.js-check-label').trigger('click');
} else {
indicator.html('<i class="fas fa-times" style="color: #fff"></i>').css('background', '#ff5c75');
setTimeout(() => {
alert('Pacote já foi bipado');
}, 200);
}
} else {
indicator.html('<i class="fas fa-times" style="color: #fff"></i>').css('background', '#ff5c75');
setTimeout(() => {
alert('Nota não encontrada. Reservar e verificar pacote');
}, 200);
}
} else {
alert('Vazio');
}
input.val('');
}
});
}
if (window.location.href == 'https://erp.tiny.com.br/notas_fiscais#list') {
console.log('página de notas');
$("body").keydown(function(e){
var keyCode = e.keyCode || e.which;
console.log(keyCode);
if (keyCode == 119) {
console.log('apertou f8');
var isFlashCourrier = $('#iframe-documento-impressao').contents().find('div:contains("CORELLI EXPRESS LOGISTICA E TRANSPORTES LTDA")').last().length == 1;
var isModico = $('#iframe-documento-impressao').contents().find('div:contains("Correios Módico")').last().length == 1;
var isPac = $('#iframe-documento-impressao').contents().find('div:contains("PAC CONTRATO AGENCIA (04669)")').last().length == 1;
var isSedex = $('#iframe-documento-impressao').contents().find('div:contains("SEDEX CONTRATO AGENCIA (04162)")').last().length == 1;
var container = $('#iframe-documento-impressao').contents().find('#content-area > div > div');
console.log(container);
if (isFlashCourrier || isModico) {
// adiciona o numero da nota na etiqueta
var saleSlipNumber = $('#iframe-documento-impressao').contents().find('div:contains("NF")').last('').find('b').text();
console.log(saleSlipNumber);
var svgString = pureSvgCode(saleSlipNumber, "codabar", {width: 200, barWidth: 2, barHeight: 40});
container.prepend(svgString);
$('svg', container).css({'width': '180px', 'margin-bottom': '10px'});
}
if (isModico) {
container.append('<div>Fechamento autorizado. <br> Pode ser aberto pela E.C.T</div>');
}
if (isPac || isSedex) {
// adiciona o numero da nota na etiqueta
var saleSlipNumber = $('#iframe-documento-impressao').contents().find('td:contains("NF:")').last('').find('b').text();
console.log(saleSlipNumber);
var svgString = pureSvgCode(saleSlipNumber, "codabar", {width: 200, barWidth: 2, barHeight: 40});
container.prepend(svgString);
$('svg', container).css({'width': '180px', 'margin-bottom': '10px'});
}
}
});
var barcode = {
settings: {
width: 100,
barWidth: 1,
barHeight: 50,
moduleSize: 1,
showHRI: false,
addQuietZone: false,
marginHRI: 0,
bgColor: "transparent",
color: "#000000",
fontSize: 12,
output: "svg",
posX: 0,
posY: 0
},
intval: function(val) {
var type = typeof(val);
if (type == 'string') {
val = val.replace(/[^0-9-.]/g, "");
val = parseInt(val * 1, 10);
return isNaN(val) || !isFinite(val) ? 0 : val;
}
return type == 'number' && isFinite(val) ? Math.floor(val) : 0;
},
i25: { // std25 int25
encoding: ["NNWWN", "WNNNW", "NWNNW", "WWNNN", "NNWNW", "WNWNN", "NWWNN", "NNNWW", "WNNWN", "NWNWN"],
compute: function(code, crc, type) {
if (!crc) {
if (code.length % 2 != 0) code = '0' + code;
} else {
if ((type == "int25") && (code.length % 2 == 0)) code = '0' + code;
var odd = true,
v, sum = 0;
for (var i = code.length - 1; i > -1; i--) {
v = barcode.intval(code.charAt(i));
if (isNaN(v)) return ("");
sum += odd ? 3 * v : v;
odd = !odd;
}
code += ((10 - sum % 10) % 10).toString();
}
return (code);
},
getDigit: function(code, crc, type) {
code = this.compute(code, crc, type);
if (code == "") return ("");
result = "";
var i, j;
if (type == "int25") {
// Interleaved 2 of 5
// start
result += "1010";
// digits + CRC
var c1, c2;
for (i = 0; i < code.length / 2; i++) {
c1 = code.charAt(2 * i);
c2 = code.charAt(2 * i + 1);
for (j = 0; j < 5; j++) {
result += '1';
if (this.encoding[c1].charAt(j) == 'W') result += '1';
result += '0';
if (this.encoding[c2].charAt(j) == 'W') result += '0';
}
}
// stop
result += "1101";
} else if (type == "std25") {
// Standard 2 of 5 is a numeric-only barcode that has been in use a long time.
// Unlike Interleaved 2 of 5, all of the information is encoded in the bars; the spaces are fixed width and are used only to separate the bars.
// The code is self-checking and does not include a checksum.
// start
result += "11011010";
// digits + CRC
var c;
for (var i = 0; i < code.length; i++) {
c = code.charAt(i);
for (j = 0; j < 5; j++) {
result += '1';
if (this.encoding[c].charAt(j) == 'W') result += "11";
result += '0';
}
}
// stop
result += "11010110";
}
return (result);
}
},
ean: {
encoding: [
["0001101", "0100111", "1110010"],
["0011001", "0110011", "1100110"],
["0010011", "0011011", "1101100"],
["0111101", "0100001", "1000010"],
["0100011", "0011101", "1011100"],
["0110001", "0111001", "1001110"],
["0101111", "0000101", "1010000"],
["0111011", "0010001", "1000100"],
["0110111", "0001001", "1001000"],
["0001011", "0010111", "1110100"]
],
first: ["000000", "001011", "001101", "001110", "010011", "011001", "011100", "010101", "010110", "011010"],
getDigit: function(code, type) {
// Check len (12 for ean13, 7 for ean8)
var len = type == "ean8" ? 7 : 12;
code = code.substring(0, len);
if (code.length != len) return ("");
// Check each digit is numeric
var c;
for (var i = 0; i < code.length; i++) {
c = code.charAt(i);
if ((c < '0') || (c > '9')) return ("");
}
// get checksum
code = this.compute(code, type);
// process analyse
var result = "101"; // start
if (type == "ean8") {
// process left part
for (var i = 0; i < 4; i++) {
result += this.encoding[barcode.intval(code.charAt(i))][0];
}
// center guard bars
result += "01010";
// process right part
for (var i = 4; i < 8; i++) {
result += this.encoding[barcode.intval(code.charAt(i))][2];
}
} else { // ean13
// extract first digit and get sequence
var seq = this.first[barcode.intval(code.charAt(0))];
// process left part
for (var i = 1; i < 7; i++) {
result += this.encoding[barcode.intval(code.charAt(i))][barcode.intval(seq.charAt(i - 1))];
}
// center guard bars
result += "01010";
// process right part
for (var i = 7; i < 13; i++) {
result += this.encoding[barcode.intval(code.charAt(i))][2];
}
} // ean13
result += "101"; // stop
return (result);
},
compute: function(code, type) {
var len = type == "ean13" ? 12 : 7;
code = code.substring(0, len);
var sum = 0,
odd = true;
for (var i = code.length - 1; i > -1; i--) {
sum += (odd ? 3 : 1) * barcode.intval(code.charAt(i));
odd = !odd;
}
return (code + ((10 - sum % 10) % 10).toString());
}
},
upc: {
getDigit: function(code) {
if (code.length < 12) {
code = '0' + code;
}
return barcode.ean.getDigit(code, 'ean13');
},
compute: function(code) {
if (code.length < 12) {
code = '0' + code;
}
return barcode.ean.compute(code, 'ean13').substr(1);
}
},
msi: {
encoding: ["100100100100", "100100100110", "100100110100", "100100110110",
"100110100100", "100110100110", "100110110100", "100110110110",
"110100100100", "110100100110"
],
compute: function(code, crc) {
if (typeof(crc) == "object") {
if (crc.crc1 == "mod10") {
code = this.computeMod10(code);
} else if (crc.crc1 == "mod11") {
code = this.computeMod11(code);
}
if (crc.crc2 == "mod10") {
code = this.computeMod10(code);
} else if (crc.crc2 == "mod11") {
code = this.computeMod11(code);
}
} else if (typeof(crc) == "boolean") {
if (crc) code = this.computeMod10(code);
}
return (code);
},
computeMod10: function(code) {
var i,
toPart1 = code.length % 2;
var n1 = 0,
sum = 0;
for (i = 0; i < code.length; i++) {
if (toPart1) {
n1 = 10 * n1 + barcode.intval(code.charAt(i));
} else {
sum += barcode.intval(code.charAt(i));
}
toPart1 = !toPart1;
}
var s1 = (2 * n1).toString();
for (i = 0; i < s1.length; i++) {
sum += barcode.intval(s1.charAt(i));
}
return (code + ((10 - sum % 10) % 10).toString());
},
computeMod11: function(code) {
var sum = 0,
weight = 2;
for (var i = code.length - 1; i >= 0; i--) {
sum += weight * barcode.intval(code.charAt(i));
weight = weight == 7 ? 2 : weight + 1;
}
return (code + ((11 - sum % 11) % 11).toString());
},
getDigit: function(code, crc) {
var table = "0123456789";
var index = 0;
var result = "";
code = this.compute(code, false);
// start
result = "110";
// digits
for (i = 0; i < code.length; i++) {
index = table.indexOf(code.charAt(i));
if (index < 0) return ("");
result += this.encoding[index];
}
// stop
result += "1001";
return (result);
}
},
code11: {
encoding: ["101011", "1101011", "1001011", "1100101",
"1011011", "1101101", "1001101", "1010011",
"1101001", "110101", "101101"
],
getDigit: function(code) {
var table = "0123456789-";
var i, index, result = "",
intercharacter = '0'
// start
result = "1011001" + intercharacter;
// digits
for (i = 0; i < code.length; i++) {
index = table.indexOf(code.charAt(i));
if (index < 0) return ("");
result += this.encoding[index] + intercharacter;
}
// checksum
var weightC = 0,
weightSumC = 0,
weightK = 1, // start at 1 because the right-most character is "C" checksum
weightSumK = 0;
for (i = code.length - 1; i >= 0; i--) {
weightC = weightC == 10 ? 1 : weightC + 1;
weightK = weightK == 10 ? 1 : weightK + 1;
index = table.indexOf(code.charAt(i));
weightSumC += weightC * index;
weightSumK += weightK * index;
}
var c = weightSumC % 11;
weightSumK += c;
var k = weightSumK % 11;
result += this.encoding[c] + intercharacter;
if (code.length >= 10) {
result += this.encoding[k] + intercharacter;
}
// stop
result += "1011001";
return (result);
}
},
code39: {
encoding: ["101001101101", "110100101011", "101100101011", "110110010101",
"101001101011", "110100110101", "101100110101", "101001011011",
"110100101101", "101100101101", "110101001011", "101101001011",
"110110100101", "101011001011", "110101100101", "101101100101",
"101010011011", "110101001101", "101101001101", "101011001101",
"110101010011", "101101010011", "110110101001", "101011010011",
"110101101001", "101101101001", "101010110011", "110101011001",
"101101011001", "101011011001", "110010101011", "100110101011",
"110011010101", "100101101011", "110010110101", "100110110101",
"100101011011", "110010101101", "100110101101", "100100100101",
"100100101001", "100101001001", "101001001001", "100101101101"
],
getDigit: function(code) {
var table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";
var i, index, result = "",
intercharacter = '0';
if (code.indexOf('*') >= 0) return ("");
// Add Start and Stop charactere : *
code = ("*" + code + "*").toUpperCase();
for (i = 0; i < code.length; i++) {
index = table.indexOf(code.charAt(i));
if (index < 0) return ("");
if (i > 0) result += intercharacter;
result += this.encoding[index];
}
return (result);
}
},
code93: {
encoding: ["100010100", "101001000", "101000100", "101000010",
"100101000", "100100100", "100100010", "101010000",
"100010010", "100001010", "110101000", "110100100",
"110100010", "110010100", "110010010", "110001010",
"101101000", "101100100", "101100010", "100110100",
"100011010", "101011000", "101001100", "101000110",
"100101100", "100010110", "110110100", "110110010",
"110101100", "110100110", "110010110", "110011010",
"101101100", "101100110", "100110110", "100111010",
"100101110", "111010100", "111010010", "111001010",
"101101110", "101110110", "110101110", "100100110",
"111011010", "111010110", "100110010", "101011110"
],
getDigit: function(code, crc) {
var table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%____*", // _ => ($), (%), (/) et (+)
c, result = "";
if (code.indexOf('*') >= 0) return ("");
code = code.toUpperCase();
// start : *
result += this.encoding[47];
// digits
for (i = 0; i < code.length; i++) {
c = code.charAt(i);
index = table.indexOf(c);
if ((c == '_') || (index < 0)) return ("");
result += this.encoding[index];
}
// checksum
if (crc) {
var weightC = 0,
weightSumC = 0,
weightK = 1, // start at 1 because the right-most character is "C" checksum
weightSumK = 0;
for (i = code.length - 1; i >= 0; i--) {
weightC = weightC == 20 ? 1 : weightC + 1;
weightK = weightK == 15 ? 1 : weightK + 1;
index = table.indexOf(code.charAt(i));
weightSumC += weightC * index;
weightSumK += weightK * index;
}
var c = weightSumC % 47;
weightSumK += c;
var k = weightSumK % 47;
result += this.encoding[c];
result += this.encoding[k];
}
// stop : *
result += this.encoding[47];
// Terminaison bar
result += '1';
return (result);
}
},
code128: {
encoding: ["11011001100", "11001101100", "11001100110", "10010011000",
"10010001100", "10001001100", "10011001000", "10011000100",
"10001100100", "11001001000", "11001000100", "11000100100",
"10110011100", "10011011100", "10011001110", "10111001100",
"10011101100", "10011100110", "11001110010", "11001011100",
"11001001110", "11011100100", "11001110100", "11101101110",
"11101001100", "11100101100", "11100100110", "11101100100",
"11100110100", "11100110010", "11011011000", "11011000110",
"11000110110", "10100011000", "10001011000", "10001000110",
"10110001000", "10001101000", "10001100010", "11010001000",
"11000101000", "11000100010", "10110111000", "10110001110",
"10001101110", "10111011000", "10111000110", "10001110110",
"11101110110", "11010001110", "11000101110", "11011101000",
"11011100010", "11011101110", "11101011000", "11101000110",
"11100010110", "11101101000", "11101100010", "11100011010",
"11101111010", "11001000010", "11110001010", "10100110000",
"10100001100", "10010110000", "10010000110", "10000101100",
"10000100110", "10110010000", "10110000100", "10011010000",
"10011000010", "10000110100", "10000110010", "11000010010",
"11001010000", "11110111010", "11000010100", "10001111010",
"10100111100", "10010111100", "10010011110", "10111100100",
"10011110100", "10011110010", "11110100100", "11110010100",
"11110010010", "11011011110", "11011110110", "11110110110",
"10101111000", "10100011110", "10001011110", "10111101000",
"10111100010", "11110101000", "11110100010", "10111011110",
"10111101110", "11101011110", "11110101110", "11010000100",
"11010010000", "11010011100", "11000111010"
],
getDigit: function(code) {
var tableB = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
var result = "";
var sum = 0;
var isum = 0;
var i = 0;
var j = 0;
var value = 0;
// check each characters
for (i = 0; i < code.length; i++) {
if (tableB.indexOf(code.charAt(i)) == -1) return ("");
}
// check firsts characters : start with C table only if enought numeric
var tableCActivated = code.length > 1;
var c = '';
for (i = 0; i < 3 && i < code.length; i++) {
c = code.charAt(i);
tableCActivated &= c >= '0' && c <= '9';
}
sum = tableCActivated ? 105 : 104;
// start : [105] : C table or [104] : B table
result = this.encoding[sum];
i = 0;
while (i < code.length) {
if (!tableCActivated) {
j = 0;
// check next character to activate C table if interresting
while ((i + j < code.length) && (code.charAt(i + j) >= '0') && (code.charAt(i + j) <= '9')) j++;
// 6 min everywhere or 4 mini at the end
tableCActivated = (j > 5) || ((i + j - 1 == code.length) && (j > 3));
if (tableCActivated) {
result += this.encoding[99]; // C table
sum += ++isum * 99;
}
// 2 min for table C so need table B
} else if ((i == code.length) || (code.charAt(i) < '0') || (code.charAt(i) > '9') || (code.charAt(i + 1) < '0') || (code.charAt(i + 1) > '9')) {
tableCActivated = false;
result += this.encoding[100]; // B table
sum += ++isum * 100;
}
if (tableCActivated) {
value = barcode.intval(code.charAt(i) + code.charAt(i + 1)); // Add two characters (numeric)
i += 2;
} else {
value = tableB.indexOf(code.charAt(i)); // Add one character
i += 1;
}
result += this.encoding[value];
sum += ++isum * value;
}
// Add CRC
result += this.encoding[sum % 103];
// Stop
result += this.encoding[106];
// Termination bar
result += "11";
return (result);
}
},
codabar: {
encoding: ["101010011", "101011001", "101001011", "110010101",
"101101001", "110101001", "100101011", "100101101",
"100110101", "110100101", "101001101", "101100101",
"1101011011", "1101101011", "1101101101", "1011011011",
"1011001001", "1010010011", "1001001011", "1010011001"
],
getDigit: function(code) {
var table = "0123456789-$:/.+";
var i, index, result = "",
intercharacter = '0';
// add start : A->D : arbitrary choose A
result += this.encoding[16] + intercharacter;
for (i = 0; i < code.length; i++) {
index = table.indexOf(code.charAt(i));
if (index < 0) return ("");
result += this.encoding[index] + intercharacter;
}
// add stop : A->D : arbitrary choose A
result += this.encoding[16];
return (result);
}
},
datamatrix: {
lengthRows: [10, 12, 14, 16, 18, 20, 22, 24, 26, // 24 squares et 6 rectangular
32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144,
8, 8, 12, 12, 16, 16
],
lengthCols: [10, 12, 14, 16, 18, 20, 22, 24, 26, // Number of columns for the entire datamatrix
32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144,
18, 32, 26, 36, 36, 48
],
dataCWCount: [3, 5, 8, 12, 18, 22, 30, 36, // Number of data codewords for the datamatrix
44, 62, 86, 114, 144, 174, 204, 280, 368, 456, 576, 696, 816, 1050,
1304, 1558, 5, 10, 16, 22, 32, 49
],
solomonCWCount: [5, 7, 10, 12, 14, 18, 20, 24, 28, // Number of Reed-Solomon codewords for the datamatrix
36, 42, 48, 56, 68, 84, 112, 144, 192, 224, 272, 336, 408, 496, 620,
7, 11, 14, 18, 24, 28
],
dataRegionRows: [8, 10, 12, 14, 16, 18, 20, 22, // Number of rows per region
24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22,
6, 6, 10, 10, 14, 14
],
dataRegionCols: [8, 10, 12, 14, 16, 18, 20, 22, // Number of columns per region
24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22,
16, 14, 24, 16, 16, 22
],
regionRows: [1, 1, 1, 1, 1, 1, 1, 1, // Number of regions per row
1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6,
1, 1, 1, 1, 1, 1
],
regionCols: [1, 1, 1, 1, 1, 1, 1, 1, // Number of regions per column
1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6,
1, 2, 1, 2, 2, 2
],
interleavedBlocks: [1, 1, 1, 1, 1, 1, 1, 1, // Number of blocks
1, 1, 1, 1, 1, 1, 2, 2, 4, 4, 4, 4, 6, 6, 8, 8,
1, 1, 1, 1, 1, 1
],
logTab: [-255, 255, 1, 240, 2, 225, 241, 53, 3, // Table of log for the Galois field
38, 226, 133, 242, 43, 54, 210, 4, 195, 39, 114, 227, 106, 134, 28,
243, 140, 44, 23, 55, 118, 211, 234, 5, 219, 196, 96, 40, 222, 115,
103, 228, 78, 107, 125, 135, 8, 29, 162, 244, 186, 141, 180, 45, 99,
24, 49, 56, 13, 119, 153, 212, 199, 235, 91, 6, 76, 220, 217, 197,
11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193, 229, 86, 79, 171,
108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84, 245, 173, 187,
204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207, 57, 147,
14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176, 7,
161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179,
42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194,
113, 230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127,
247, 146, 66, 137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73,
164, 144, 85, 170, 246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82,
72, 182, 215, 191, 251, 47, 178, 89, 151, 101, 94, 160, 123, 26, 112,
232, 21, 51, 238, 208, 131, 58, 69, 148, 18, 15, 16, 68, 17, 121, 149,
129, 19, 155, 59, 249, 70, 214, 250, 168, 71, 201, 156, 64, 60, 237,
130, 111, 20, 93, 122, 177, 150
],
aLogTab: [1, 2, 4, 8, 16, 32, 64, 128, 45, 90, // Table of aLog for the Galois field
180, 69, 138, 57, 114, 228, 229, 231, 227, 235, 251, 219, 155, 27, 54,
108, 216, 157, 23, 46, 92, 184, 93, 186, 89, 178, 73, 146, 9, 18, 36,
72, 144, 13, 26, 52, 104, 208, 141, 55, 110, 220, 149, 7, 14, 28, 56,
112, 224, 237, 247, 195, 171, 123, 246, 193, 175, 115, 230, 225, 239,
243, 203, 187, 91, 182, 65, 130, 41, 82, 164, 101, 202, 185, 95, 190,
81, 162, 105, 210, 137, 63, 126, 252, 213, 135, 35, 70, 140, 53, 106,
212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250, 217, 159, 19, 38, 76,
152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172, 117, 234, 249, 223,
147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200, 189, 87, 174, 113,
226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107, 214, 129,
47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169, 127,
254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206,
177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161,
111, 222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132,
37, 74, 148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248,
221, 151, 3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75,
150, 1
],
champGaloisMult: function(a, b) { // MULTIPLICATION IN GALOIS FIELD GF(2^8)
if (!a || !b) return 0;
return this.aLogTab[(this.logTab[a] + this.logTab[b]) % 255];
},
champGaloisDoub: function(a, b) { // THE OPERATION a * 2^b IN GALOIS FIELD GF(2^8)
if (!a) return 0;
if (!b) return a;
return this.aLogTab[(this.logTab[a] + b) % 255];
},
champGaloisSum: function(a, b) { // SUM IN GALOIS FIELD GF(2^8)
return a ^ b;
},
selectIndex: function(dataCodeWordsCount, rectangular) { // CHOOSE THE GOOD INDEX FOR TABLES
if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 1558) && !rectangular) return -1;
if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 49) && rectangular) return -1;
var n = 0;
if (rectangular) n = 24;
while (this.dataCWCount[n] < dataCodeWordsCount) n++;
return n;
},
encodeDataCodeWordsASCII: function(text) {
var dataCodeWords = new Array();
var n = 0,
i, c;
for (i = 0; i < text.length; i++) {
c = text.charCodeAt(i);
if (c > 127) {
dataCodeWords[n] = 235;
c = c - 127;
n++;
} else if ((c >= 48 && c <= 57) && (i + 1 < text.length) && (text.charCodeAt(i + 1) >= 48 && text.charCodeAt(i + 1) <= 57)) {
c = ((c - 48) * 10) + ((text.charCodeAt(i + 1)) - 48);
c += 130;
i++;
} else c++;
dataCodeWords[n] = c;
n++;
}
return dataCodeWords;
},
addPadCW: function(tab, from, to) {
if (from >= to) return;
tab[from] = 129;
var r, i;
for (i = from + 1; i < to; i++) {
r = ((149 * (i + 1)) % 253) + 1;
tab[i] = (129 + r) % 254;
}
},
calculSolFactorTable: function(solomonCWCount) { // CALCULATE THE REED SOLOMON FACTORS
var g = new Array();
var i, j;
for (i = 0; i <= solomonCWCount; i++) g[i] = 1;
for (i = 1; i <= solomonCWCount; i++) {
for (j = i - 1; j >= 0; j--) {
g[j] = this.champGaloisDoub(g[j], i);
if (j > 0) g[j] = this.champGaloisSum(g[j], g[j - 1]);
}
}
return g;
},
addReedSolomonCW: function(nSolomonCW, coeffTab, nDataCW, dataTab, blocks) { // Add the Reed Solomon codewords
var temp = 0;
var errorBlocks = nSolomonCW / blocks;
var correctionCW = new Array();
var i, j, k;
for (k = 0; k < blocks; k++) {
for (i = 0; i < errorBlocks; i++) correctionCW[i] = 0;
for (i = k; i < nDataCW; i = i + blocks) {
temp = this.champGaloisSum(dataTab[i], correctionCW[errorBlocks - 1]);
for (j = errorBlocks - 1; j >= 0; j--) {
if (!temp) {
correctionCW[j] = 0;
} else {
correctionCW[j] = this.champGaloisMult(temp, coeffTab[j]);
}
if (j > 0) correctionCW[j] = this.champGaloisSum(correctionCW[j - 1], correctionCW[j]);
}
}
// Renversement des blocs calcules
j = nDataCW + k;
for (i = errorBlocks - 1; i >= 0; i--) {
dataTab[j] = correctionCW[i];
j = j + blocks;
}
}
return dataTab;
},
getBits: function(entier) { // Transform integer to tab of bits
var bits = new Array();
for (var i = 0; i < 8; i++) {
bits[i] = entier & (128 >> i) ? 1 : 0;
}
return bits;
},
next: function(etape, totalRows, totalCols, codeWordsBits, datamatrix, assigned) { // Place codewords into the matrix
var chr = 0; // Place of the 8st bit from the first character to [4][0]
var row = 4;
var col = 0;
do {
// Check for a special case of corner
if ((row == totalRows) && (col == 0)) {
this.patternShapeSpecial1(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
chr++;
} else if ((etape < 3) && (row == totalRows - 2) && (col == 0) && (totalCols % 4 != 0)) {
this.patternShapeSpecial2(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
chr++;
} else if ((row == totalRows - 2) && (col == 0) && (totalCols % 8 == 4)) {
this.patternShapeSpecial3(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
chr++;
} else if ((row == totalRows + 4) && (col == 2) && (totalCols % 8 == 0)) {
this.patternShapeSpecial4(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
chr++;
}
// Go up and right in the datamatrix
do {
if ((row < totalRows) && (col >= 0) && (assigned[row][col] != 1)) {
this.patternShapeStandard(datamatrix, assigned, codeWordsBits[chr], row, col, totalRows, totalCols);
chr++;
}
row -= 2;
col += 2;
} while ((row >= 0) && (col < totalCols));
row += 1;
col += 3;
// Go down and left in the datamatrix
do {
if ((row >= 0) && (col < totalCols) && (assigned[row][col] != 1)) {
this.patternShapeStandard(datamatrix, assigned, codeWordsBits[chr], row, col, totalRows, totalCols);
chr++;
}
row += 2;
col -= 2;
} while ((row < totalRows) && (col >= 0));
row += 3;
col += 1;
} while ((row < totalRows) || (col < totalCols));
},
patternShapeStandard: function(datamatrix, assigned, bits, row, col, totalRows, totalCols) { // Place bits in the matrix (standard or special case)
this.placeBitInDatamatrix(datamatrix, assigned, bits[0], row - 2, col - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[1], row - 2, col - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[2], row - 1, col - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[3], row - 1, col - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[4], row - 1, col, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[5], row, col - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[6], row, col - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[7], row, col, totalRows, totalCols);
},
patternShapeSpecial1: function(datamatrix, assigned, bits, totalRows, totalCols) {
this.placeBitInDatamatrix(datamatrix, assigned, bits[0], totalRows - 1, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[1], totalRows - 1, 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[2], totalRows - 1, 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols);
},
patternShapeSpecial2: function(datamatrix, assigned, bits, totalRows, totalCols) {
this.placeBitInDatamatrix(datamatrix, assigned, bits[0], totalRows - 3, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[1], totalRows - 2, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[2], totalRows - 1, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[3], 0, totalCols - 4, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[4], 0, totalCols - 3, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[5], 0, totalCols - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[6], 0, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols);
},
patternShapeSpecial3: function(datamatrix, assigned, bits, totalRows, totalCols) {
this.placeBitInDatamatrix(datamatrix, assigned, bits[0], totalRows - 3, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[1], totalRows - 2, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[2], totalRows - 1, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols);
},
patternShapeSpecial4: function(datamatrix, assigned, bits, totalRows, totalCols) {
this.placeBitInDatamatrix(datamatrix, assigned, bits[0], totalRows - 1, 0, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[1], totalRows - 1, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[2], 0, totalCols - 3, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[5], 1, totalCols - 3, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[6], 1, totalCols - 2, totalRows, totalCols);
this.placeBitInDatamatrix(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols);
},
placeBitInDatamatrix: function(datamatrix, assigned, bit, row, col, totalRows, totalCols) { // Put a bit into the matrix
if (row < 0) {
row += totalRows;
col += 4 - ((totalRows + 4) % 8);
}
if (col < 0) {
col += totalCols;
row += 4 - ((totalCols + 4) % 8);
}
if (assigned[row][col] != 1) {
datamatrix[row][col] = bit;
assigned[row][col] = 1;
}
},
addFinderPattern: function(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW) { // Add the finder pattern
var totalRowsCW = (rowsRegionCW + 2) * rowsRegion;
var totalColsCW = (colsRegionCW + 2) * colsRegion;
var datamatrixTemp = new Array();
datamatrixTemp[0] = new Array();
for (var j = 0; j < totalColsCW + 2; j++) {
datamatrixTemp[0][j] = 0;
}
for (var i = 0; i < totalRowsCW; i++) {
datamatrixTemp[i + 1] = new Array();
datamatrixTemp[i + 1][0] = 0;
datamatrixTemp[i + 1][totalColsCW + 1] = 0;
for (var j = 0; j < totalColsCW; j++) {
if (i % (rowsRegionCW + 2) == 0) {
if (j % 2 == 0) {
datamatrixTemp[i + 1][j + 1] = 1;
} else {
datamatrixTemp[i + 1][j + 1] = 0;
}
} else if (i % (rowsRegionCW + 2) == rowsRegionCW + 1) {
datamatrixTemp[i + 1][j + 1] = 1;
} else if (j % (colsRegionCW + 2) == colsRegionCW + 1) {
if (i % 2 == 0) {
datamatrixTemp[i + 1][j + 1] = 0;
} else {
datamatrixTemp[i + 1][j + 1] = 1;
}
} else if (j % (colsRegionCW + 2) == 0) {
datamatrixTemp[i + 1][j + 1] = 1;
} else {
datamatrixTemp[i + 1][j + 1] = 0;
datamatrixTemp[i + 1][j + 1] = datamatrix[i - 1 - (2 * (parseInt(i / (rowsRegionCW + 2))))][j - 1 - (2 * (parseInt(j / (colsRegionCW + 2))))];
}
}
}
datamatrixTemp[totalRowsCW + 1] = new Array();
for (var j = 0; j < totalColsCW + 2; j++) {
datamatrixTemp[totalRowsCW + 1][j] = 0;
}
return datamatrixTemp;
},
getDigit: function(text, rectangular) {
var dataCodeWords = this.encodeDataCodeWordsASCII(text); // Code the text in the ASCII mode
var dataCWCount = dataCodeWords.length;
var index = this.selectIndex(dataCWCount, rectangular); // Select the index for the data tables
var totalDataCWCount = this.dataCWCount[index]; // Number of data CW
var solomonCWCount = this.solomonCWCount[index]; // Number of Reed Solomon CW
var totalCWCount = totalDataCWCount + solomonCWCount; // Number of CW
var rowsTotal = this.lengthRows[index]; // Size of symbol
var colsTotal = this.lengthCols[index];
var rowsRegion = this.regionRows[index]; // Number of region
var colsRegion = this.regionCols[index];
var rowsRegionCW = this.dataRegionRows[index];
var colsRegionCW = this.dataRegionCols[index];
var rowsLengthMatrice = rowsTotal - 2 * rowsRegion; // Size of matrice data
var colsLengthMatrice = colsTotal - 2 * colsRegion;
var blocks = this.interleavedBlocks[index]; // Number of Reed Solomon blocks
var errorBlocks = (solomonCWCount / blocks);
this.addPadCW(dataCodeWords, dataCWCount, totalDataCWCount); // Add codewords pads
var g = this.calculSolFactorTable(errorBlocks); // Calculate correction coefficients
this.addReedSolomonCW(solomonCWCount, g, totalDataCWCount, dataCodeWords, blocks); // Add Reed Solomon codewords
var codeWordsBits = new Array(); // Calculte bits from codewords
for (var i = 0; i < totalCWCount; i++) {
codeWordsBits[i] = this.getBits(dataCodeWords[i]);
}
var datamatrix = new Array(); // Put data in the matrix
var assigned = new Array();
for (var i = 0; i < colsLengthMatrice; i++) {
datamatrix[i] = new Array();
assigned[i] = new Array();
}
// Add the bottom-right corner if needed
if (((rowsLengthMatrice * colsLengthMatrice) % 8) == 4) {
datamatrix[rowsLengthMatrice - 2][colsLengthMatrice - 2] = 1;
datamatrix[rowsLengthMatrice - 1][colsLengthMatrice - 1] = 1;
datamatrix[rowsLengthMatrice - 1][colsLengthMatrice - 2] = 0;
datamatrix[rowsLengthMatrice - 2][colsLengthMatrice - 1] = 0;
assigned[rowsLengthMatrice - 2][colsLengthMatrice - 2] = 1;
assigned[rowsLengthMatrice - 1][colsLengthMatrice - 1] = 1;
assigned[rowsLengthMatrice - 1][colsLengthMatrice - 2] = 1;
assigned[rowsLengthMatrice - 2][colsLengthMatrice - 1] = 1;
}
// Put the codewords into the matrix
this.next(0, rowsLengthMatrice, colsLengthMatrice, codeWordsBits, datamatrix, assigned);
// Add the finder pattern
datamatrix = this.addFinderPattern(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW);
return datamatrix;
}
},
// little endian convertor
lec: {
// convert an int
cInt: function(value, byteCount) {
var le = '';
for (var i = 0; i < byteCount; i++) {
le += String.fromCharCode(value & 0xFF);
value = value >> 8;
}
return le;
},
// return a byte string from rgb values
cRgb: function(r, g, b) {
return String.fromCharCode(b) + String.fromCharCode(g) + String.fromCharCode(r);
},
// return a byte string from a hex string color
cHexColor: function(hex) {
var v = parseInt('0x' + hex.substr(1));
var b = v & 0xFF;
v = v >> 8;
var g = v & 0xFF;
var r = v >> 8;
return (this.cRgb(r, g, b));
}
},
// convert a bit string to an array of array of bit char
bitStringTo2DArray: function(digit) {
var d = [];
d[0] = [];
for (var i = 0; i < digit.length; i++) d[0][i] = digit.charAt(i);
return (d);
},
// svg barcode renderer
digitToSvgRenderer: function(settings, digit, hri, callback, mwi, mhi) {
var lines = digit.length;
var columns = digit[0].length;
var width = settings.width;
var mw = width / columns;
var mh = mhi;
var height = mh * lines;
if (settings.showHRI) {
var fontSize = barcode.intval(settings.fontSize);
height += barcode.intval(settings.marginHRI) + fontSize;
}
// svg header
var svg = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 ' + width + ' ' + height + '">';
if (settings.bgColor !== 'transparent') {
// background
svg += '<rect width="' + width + '" height="' + height + '" x="0" y="0" fill="' + settings.bgColor + '"/>';
}
var bar1 = '<rect width="&W" height="' + mh + '" x="&X" y="&Y" fill="' + settings.color + '"/>';
if (settings.color === "#000000") {
bar1 = '<rect width="&W" height="' + mh + '" x="&X" y="&Y"/>';
}
var len, current;
for (var y = 0; y < lines; y++) {
len = 0;
current = digit[y][0];
for (var x = 0; x < columns; x++) {
if (current == digit[y][x]) {
len++;
} else {
if (current == '1') {
svg += bar1.replace("&W", (len * mw).toFixed(1))
.replace("&X", ((x - len) * mw).toFixed(1))
.replace("&Y", y * mh);
}
current = digit[y][x];
len = 1;
}
}
if ((len > 0) && (current == '1')) {
svg += bar1.replace("&W", (len * mw).toFixed(1))
.replace("&X", ((columns - len) * mw).toFixed(1))
.replace("&Y", (y * mh).toFixed(1));
}
}
if (settings.showHRI) {
svg += '<text transform="translate(50 0)" y="60" text-anchor="middle">' + hri + '</text>';
}
// svg footer
svg += '</svg>';
return svg;
},
// svg 1D barcode renderer
digitToSvg: function(settings, digit, hri, callback) {
var w = barcode.intval(settings.barWidth);
var h = barcode.intval(settings.barHeight);
return this.digitToSvgRenderer(settings, this.bitStringTo2DArray(digit), hri, callback, w, h);
},
// svg 2D barcode renderer
digitToSvg2D: function(settings, digit, hri, callback) {
var s = barcode.intval(settings.moduleSize);
return this.digitToSvgRenderer(settings, digit, hri, callback, s, s);
},
};
var pureSvgCode = function(datas, type, settings, callback) {
var digit = "",
hri = "",
code = "",
crc = true,
rect = false,
b2d = false;
if (typeof(datas) == "string") {
code = datas;
} else if (typeof(datas) == "object") {
code = typeof(datas.code) == "string" ? datas.code : "";
crc = typeof(datas.crc) != "undefined" ? datas.crc : true;
rect = typeof(datas.rect) != "undefined" ? datas.rect : false;
}
if (code == "") return (false);
if (typeof(settings) == "undefined") settings = [];
for (var name in barcode.settings) {
if (settings[name] == undefined) settings[name] = barcode.settings[name];
}
switch (type) {
case "std25":
case "int25":
digit = barcode.i25.getDigit(code, crc, type);
hri = barcode.i25.compute(code, crc, type);
break;
case "ean8":
case "ean13":
digit = barcode.ean.getDigit(code, type);
hri = barcode.ean.compute(code, type);
break;
case "upc":
digit = barcode.upc.getDigit(code);
hri = barcode.upc.compute(code);
break;
case "code11":
digit = barcode.code11.getDigit(code);
hri = code;
break;
case "code39":
digit = barcode.code39.getDigit(code);
hri = code;
break;
case "code93":
digit = barcode.code93.getDigit(code, crc);
hri = code;
break;
case "code128":
digit = barcode.code128.getDigit(code);
hri = code;
break;
case "codabar":
digit = barcode.codabar.getDigit(code);
hri = code;
break;
case "msi":
digit = barcode.msi.getDigit(code, crc);
hri = barcode.msi.compute(code, crc);
break;
case "datamatrix":
digit = barcode.datamatrix.getDigit(code, rect);
hri = code;
b2d = true;
break;
}
if (digit.length == 0) return false;
// Quiet Zone
if (!b2d && settings.addQuietZone) digit = "0000000000" + digit + "0000000000";
var fname = 'digitTo' + settings.output.charAt(0).toUpperCase() + settings.output.substr(1) + (b2d ? '2D' : '');
//if (typeof(barcode[fname]) == 'function' && settings.toFile === false) {
// return barcode[fname](settings, digit, hri, callback);
//}else
if (typeof(barcode[fname]) == 'function') {
return barcode[fname](settings, digit, hri, callback);
}
};
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment