| /*! | 
|  *  BarCode Coder Library (BCC Library) | 
|  *  BCCL Version 2.0 | 
|  * | 
|  *  Porting : jQuery barcode plugin | 
|  *  Version : 2.2 | 
|  * | 
|  *  Date    : 2019-02-21 | 
|  *  Author  : DEMONTE Jean-Baptiste <jbdemonte@gmail.com> | 
|  *            HOUREZ Jonathan | 
|  * | 
|  *  Web site: http://barcode-coder.com/ | 
|  *  dual licence :  http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html | 
|  *                  http://www.gnu.org/licenses/gpl.html | 
|  */ | 
|   | 
| (function ($) { | 
|   | 
|   var defaultSettings = { | 
|       barWidth: 1, | 
|       barHeight: 50, | 
|       moduleSize: 5, | 
|       showHRI: true, | 
|       addQuietZone: true, | 
|       marginHRI: 5, | 
|       bgColor: "#FFFFFF", | 
|       color: "#000000", | 
|       fontSize: 10, | 
|       output: "css", | 
|       posX: 0, | 
|       posY: 0 | 
|     }; | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // std25 int25 | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingI25 = ["NNWWN", "WNNNW", "NWNNW", "WWNNN", "NNWNW", "WNWNN", "NWWNN", "NNNWW", "WNNWN", "NWNWN"]; | 
|   | 
|   function computeI25(code, crc, type) { | 
|     var i, v, | 
|       odd = true, | 
|       sum = 0; | 
|     if (!crc) { | 
|       if (code.length % 2 !== 0) { | 
|         code = "0" + code; | 
|       } | 
|     } else { | 
|       if (type === "int25" && code.length % 2 === 0) { | 
|         code = "0" + code; | 
|       } | 
|       for (i = code.length - 1; i > -1; i--) { | 
|         v = intval(code.charAt(i)); | 
|         if (isNaN(v)) { | 
|           return ""; | 
|         } | 
|         sum += odd ? 3 * v : v; | 
|         odd = !odd; | 
|       } | 
|       code += ((10 - sum % 10) % 10).toString(); | 
|     } | 
|     return code; | 
|   } | 
|   | 
|   function getDigitI25(code, crc, type) { | 
|     var i, j, c1, c2, c, result = ""; | 
|     code = computeI25(code, crc, type); | 
|     if (type === "int25") { | 
|       // Interleaved 2 of 5 | 
|   | 
|       // start | 
|       result += "1010"; | 
|   | 
|       // digits + CRC | 
|       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 (encodingI25[c1].charAt(j) === 'W') { | 
|             result += "1"; | 
|           } | 
|           result += "0"; | 
|           if (encodingI25[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 | 
|       for (i = 0; i < code.length; i++) { | 
|         c = code.charAt(i); | 
|         for (j = 0; j < 5; j++) { | 
|           result += "1"; | 
|           if (encodingI25[c].charAt(j) === 'W') { | 
|             result += "11"; | 
|           } | 
|           result += "0"; | 
|         } | 
|       } | 
|       // stop | 
|       result += "11010110"; | 
|     } | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // ean | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingEAN = [ ["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"] ], | 
|     firstEAN =  ["000000", "001011", "001101", "001110", "010011", "011001", "011100", "010101", "010110", "011010"], | 
|     encodingEAN_addon2 = ["00", "01", "10", "11"], | 
|     encodingEAN_addon5 = ["11000", "10100", "10010", "10001", "01100", "00110", "00011", "01010", "01001", "00101"]; | 
|   | 
|   function getDigitEAN(code, type) { | 
|     // Check len (12 for ean13, 7 for ean8) | 
|     var i, x, y, addon, checksum, result, seq, part_of_addon, a_or_b, partialencoding, odd, | 
|       len = type === "ean8" ? 7 : 12, | 
|       fullcode = code; | 
|     code = code.substring(0, len); | 
|   | 
|     if (!code.match(new RegExp("^[0-9]{" + len + "}$"))) { | 
|       return ""; | 
|     } | 
|     // get checksum | 
|     code = computeEAN(code, type); | 
|   | 
|     // process analyse | 
|     result = "101"; // start | 
|   | 
|     if (type === "ean8") { | 
|   | 
|       // process left part | 
|       for (i = 0; i < 4; i++) { | 
|         result += encodingEAN[intval(code.charAt(i))][0]; | 
|       } | 
|   | 
|       // center guard bars | 
|       result += "01010"; | 
|   | 
|       // process right part | 
|       for (i = 4; i < 8; i++) { | 
|         result += encodingEAN[intval(code.charAt(i))][2]; | 
|       } | 
|   | 
|     } else { // ean13 | 
|       // extract first digit and get sequence | 
|       seq = firstEAN[intval(code.charAt(0))]; | 
|   | 
|       // process left part | 
|       for (i = 1; i < 7; i++) { | 
|         result += encodingEAN[intval(code.charAt(i))][intval(seq.charAt(i - 1))]; | 
|       } | 
|   | 
|       // center guard bars | 
|       result += "01010"; | 
|   | 
|       // process right part | 
|       for (i = 7; i < 13; i++) { | 
|         result += encodingEAN[intval(code.charAt(i))][2]; | 
|       } | 
|     } // ean13 | 
|   | 
|     result += "101"; // stop | 
|   | 
|     // addon 13+2 / 13+5 | 
|     if (type === "ean13") { | 
|       addon = fullcode.substring(13, fullcode.length); | 
|   | 
|       if (addon.length === 2) { | 
|         result += "0000000000"; | 
|         // checksum addon | 
|         checksum = parseInt(addon, 10) % 4; | 
|         // binary encoding | 
|         for (i = 0; i < 2; i++) { | 
|           part_of_addon = intval(addon.charAt(i)); | 
|           a_or_b = intval(encodingEAN_addon2[intval(checksum)][i]); | 
|           partialencoding = encodingEAN[part_of_addon][a_or_b]; | 
|           result += partialencoding; | 
|         } | 
|       } else if (addon.length === 5) { | 
|         result += "0000000000"; | 
|         // checksum addon | 
|         odd = true; | 
|         x = y = 0; | 
|         for (i = 0; i < 5; i++) { | 
|           if (!odd) { | 
|             x += intval(addon.charAt(i)); | 
|           } else { | 
|             y += intval(addon.charAt(i)); | 
|           } | 
|           odd = !odd; | 
|         } | 
|         checksum = ((9 * x) + (3 * y)) % 10; | 
|         // binary encoding | 
|         result += "1011"; // special delimiter | 
|   | 
|         for (i = 0; i < 5; i++) { | 
|           part_of_addon = intval(addon.charAt(i)); | 
|           a_or_b = intval(encodingEAN_addon5[intval(checksum)][i]); | 
|           partialencoding = encodingEAN[part_of_addon][a_or_b]; | 
|           result += partialencoding; | 
|   | 
|           // 01 separator | 
|           if (i < 4) { | 
|             result += "01"; | 
|           } | 
|         } | 
|       } | 
|     } | 
|     return result; | 
|   } | 
|   function computeEAN(code, type) { | 
|     var i, | 
|       len = type === "ean13" ? 12 : 7, | 
|       addon = code.substring(13, code.length), | 
|       sum = 0, | 
|       odd = true; | 
|     code = code.substring(0, len); | 
|     for (i = code.length - 1; i > -1; i--) { | 
|       sum += (odd ? 3 : 1) * intval(code.charAt(i)); | 
|       odd = !odd; | 
|     } | 
|     return code + ((10 - sum % 10) % 10).toString() + (addon ? " " + addon : ""); | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // upc | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   function getDigitUPC(code) { | 
|     if (code.length < 12) { | 
|       code = "0" + code; | 
|     } | 
|     return getDigitEAN(code, "ean13"); | 
|   } | 
|   | 
|   function computeUPC(code) { | 
|     if (code.length < 12) { | 
|       code = "0" + code; | 
|     } | 
|     return computeEAN(code, "ean13").substr(1); | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // code 11 | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingCode11 = [ "101011", "1101011", "1001011", "1100101", | 
|     "1011011", "1101101", "1001101", "1010011", | 
|     "1101001", "110101", "101101"]; | 
|   | 
|   function getDigitCode11(code) { | 
|     var c, k, i, index, weightC, weightSumC, weightK, weightSumK, | 
|       table = "0123456789-", | 
|       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 += encodingCode11[index] + intercharacter; | 
|     } | 
|   | 
|     // checksum | 
|     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; | 
|     } | 
|   | 
|     c = weightSumC % 11; | 
|     weightSumK += c; | 
|     k = weightSumK % 11; | 
|   | 
|     result += encodingCode11[c] + intercharacter; | 
|   | 
|     if (code.length >= 10) { | 
|       result += encodingCode11[k] + intercharacter; | 
|     } | 
|   | 
|     // stop | 
|     result  += "1011001"; | 
|   | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // code 39 | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingCode39 = ["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"]; | 
|   | 
|   function getDigitCode39(code) { | 
|     var i, index, | 
|       result = "", | 
|       table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*", | 
|       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 += encodingCode39[index]; | 
|     } | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // code 93 | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingCode93 = ["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"]; | 
|   | 
|   function getDigitCode93(code, crc) { | 
|     var c, k, i, index, weightC, weightSumC, weightK, weightSumK, | 
|       table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%____*", // _ => ($), (%), (/) et (+) | 
|       result = ""; | 
|   | 
|     if (code.indexOf('*') >= 0) { | 
|       return ""; | 
|     } | 
|   | 
|     code = code.toUpperCase(); | 
|   | 
|     // start :  * | 
|     result  += encodingCode93[47]; | 
|   | 
|     // digits | 
|     for (i = 0; i < code.length; i++) { | 
|       c = code.charAt(i); | 
|       index = table.indexOf(c); | 
|       if ((c === '_') || (index < 0)) { | 
|         return ""; | 
|       } | 
|       result += encodingCode93[index]; | 
|     } | 
|   | 
|     // checksum | 
|     if (crc) { | 
|       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; | 
|       } | 
|   | 
|       c = weightSumC % 47; | 
|       weightSumK += c; | 
|       k = weightSumK % 47; | 
|   | 
|       result += encodingCode93[c]; | 
|       result += encodingCode93[k]; | 
|     } | 
|   | 
|     // stop : * | 
|     result  += encodingCode93[47]; | 
|   | 
|     // Terminaison bar | 
|     result  += "1"; | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // code 128 | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingCode128 = ["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"]; | 
|   | 
|     function getDigitCode128(code) { | 
|       var i, c, tableCActivated, result, sum, | 
|         tableB = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", | 
|         isum = 0, | 
|         j = 0, | 
|         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 enough numeric | 
|       tableCActivated = code.length > 1; | 
|       for (i = 0; i < 3 && i < code.length; i++) { | 
|         c = code.charAt(i); | 
|         tableCActivated = tableCActivated && c >= '0' && c <= '9'; | 
|       } | 
|   | 
|   | 
|       sum = tableCActivated ? 105 : 104; | 
|   | 
|       // start : [105] : C table or [104] : B table | 
|       result = encodingCode128[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 += encodingCode128[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 += encodingCode128[100]; // B table | 
|           sum += ++isum * 100; | 
|         } | 
|   | 
|         if (tableCActivated) { | 
|           value = 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  += encodingCode128[value]; | 
|         sum += ++isum * value; | 
|       } | 
|   | 
|       // Add CRC | 
|       result  += encodingCode128[sum % 103]; | 
|   | 
|       // Stop | 
|       result += encodingCode128[106]; | 
|   | 
|       // Termination bar | 
|       result += "11"; | 
|   | 
|       return result; | 
|     } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // codabar | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingCodabar = ["101010011", "101011001", "101001011", "110010101", | 
|     "101101001", "110101001", "100101011", "100101101", | 
|     "100110101", "110100101", "101001101", "101100101", | 
|     "1101011011", "1101101011", "1101101101", "1011011011", | 
|     "1011001001", "1010010011", "1001001011", "1010011001"]; | 
|   | 
|   function getDigitCodabar(code) { | 
|     var i, index, result, | 
|       intercharacter = "0", | 
|       table = "0123456789-$:/.+"; | 
|   | 
|     // add start : A->D : arbitrary choose A | 
|     result = encodingCodabar[16] + intercharacter; | 
|   | 
|     for (i = 0; i < code.length; i++) { | 
|       index = table.indexOf(code.charAt(i)); | 
|       if (index < 0) { | 
|         return ""; | 
|       } | 
|       result += encodingCodabar[index] + intercharacter; | 
|     } | 
|   | 
|     // add stop : A->D : arbitrary choose A | 
|     result += encodingCodabar[16]; | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // msi | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var encodingMsi = ["100100100100", "100100100110", "100100110100", "100100110110", | 
|     "100110100100", "100110100110", "100110110100", "100110110110", | 
|     "110100100100", "110100100110"]; | 
|   | 
|   function computeMsi(code, crc) { | 
|     if (typeof crc === "object") { | 
|       if (crc.crc1 === "mod10") { | 
|         code = computeMod10Msi(code); | 
|       } else if (crc.crc1 === "mod11") { | 
|         code = computeMod11Msi(code); | 
|       } | 
|       if (crc.crc2 === "mod10") { | 
|         code = computeMod10Msi(code); | 
|       } else if (crc.crc2 === "mod11") { | 
|         code = computeMod11Msi(code); | 
|       } | 
|     } else if (typeof crc === "boolean" && crc) { | 
|       code = computeMod10Msi(code); | 
|     } | 
|     return code; | 
|   } | 
|   | 
|   function computeMod10Msi(code) { | 
|     var i, s1, | 
|       toPart1 = code.length % 2, | 
|       n1 = 0, | 
|       sum = 0; | 
|     for (i = 0; i < code.length; i++) { | 
|       if (toPart1) { | 
|         n1 = 10 * n1 + intval(code.charAt(i)); | 
|       } else { | 
|         sum += intval(code.charAt(i)); | 
|       } | 
|       toPart1 = !toPart1; | 
|     } | 
|     s1 = (2 * n1).toString(); | 
|     for (i = 0; i < s1.length; i++) { | 
|       sum += intval(s1.charAt(i)); | 
|     } | 
|     return code + ((10 - sum % 10) % 10).toString(); | 
|   } | 
|   | 
|   function computeMod11Msi(code) { | 
|     var i, sum = 0, weight = 2; | 
|     for (i = code.length - 1; i >= 0; i--) { | 
|       sum += weight * intval(code.charAt(i)); | 
|       weight = weight === 7 ? 2 : weight + 1; | 
|     } | 
|     return code + ((11 - sum % 11) % 11).toString(); | 
|   } | 
|   | 
|   function getDigitMsi(code) { | 
|     var i, | 
|       table = "0123456789", | 
|       index = 0, | 
|       result = "110"; // start | 
|   | 
|     code = computeMsi(code, false); | 
|   | 
|     // digits | 
|     for (i = 0; i < code.length; i++) { | 
|       index = table.indexOf(code.charAt(i)); | 
|       if (index < 0) { | 
|         return ""; | 
|       } | 
|       result += encodingMsi[index]; | 
|     } | 
|   | 
|     // stop | 
|     result += "1001"; | 
|   | 
|     return result; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // datamatrix | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var getDigitDatamatrix = (function () { | 
|     var 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]; | 
|   | 
|     function champGaloisMult(a, b) {  // MULTIPLICATION IN GALOIS FIELD GF(2^8) | 
|       if (!a || !b) { | 
|         return 0; | 
|       } | 
|       return aLogTab[(logTab[a] + logTab[b]) % 255]; | 
|     } | 
|   | 
|     function champGaloisDoub(a, b) {  // THE OPERATION a * 2^b IN GALOIS FIELD GF(2^8) | 
|       if (!a) { | 
|         return 0; | 
|       } | 
|       if (!b) { | 
|         return a; | 
|       } | 
|       return aLogTab[(logTab[a] + b) % 255]; | 
|     } | 
|   | 
|     function champGaloisSum(a, b) { // SUM IN GALOIS FIELD GF(2^8) | 
|       return a ^ b; | 
|     } | 
|   | 
|     function selectIndex(dataCodeWordsCount, rectangular) { // CHOOSE THE GOOD INDEX FOR TABLES | 
|       var n = 0; | 
|       if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 1558) && !rectangular) { | 
|         return -1; | 
|       } | 
|       if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 49) && rectangular) { | 
|         return -1; | 
|       } | 
|       if (rectangular) { | 
|         n = 24; | 
|       } | 
|   | 
|       while (dataCWCount[n] < dataCodeWordsCount) { | 
|         n++; | 
|       } | 
|       return n; | 
|     } | 
|   | 
|     function encodeDataCodeWordsASCII(text) { | 
|       var i, c, | 
|         dataCodeWords = [], | 
|         n = 0; | 
|       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; | 
|     } | 
|   | 
|     function addPadCW(tab, from, to) { | 
|       var r, i; | 
|       if (from >= to) { | 
|         return; | 
|       } | 
|       tab[from] = 129; | 
|       for (i = from + 1; i < to; i++) { | 
|         r = ((149 * (i + 1)) % 253) + 1; | 
|         tab[i] = (129 + r) % 254; | 
|       } | 
|     } | 
|   | 
|     function calculSolFactorTable(aSolomonCWCount) { // CALCULATE THE REED SOLOMON FACTORS | 
|       var i, j, | 
|         g = []; | 
|   | 
|       for (i = 0; i <= aSolomonCWCount; i++) { | 
|         g[i] = 1; | 
|       } | 
|   | 
|       for (i = 1; i <= aSolomonCWCount; i++) { | 
|         for (j = i - 1; j >= 0; j--) { | 
|           g[j] = champGaloisDoub(g[j], i); | 
|           if (j > 0) { | 
|             g[j] = champGaloisSum(g[j], g[j - 1]); | 
|           } | 
|         } | 
|       } | 
|       return g; | 
|     } | 
|   | 
|     function addReedSolomonCW(nSolomonCW, coeffTab, nDataCW, dataTab, blocks) { // Add the Reed Solomon codewords | 
|       var i, j, k, | 
|         temp = 0, | 
|         errorBlocks = nSolomonCW / blocks, | 
|         correctionCW = []; | 
|       for (k = 0; k < blocks; k++) { | 
|         for (i = 0; i < errorBlocks; i++) { | 
|           correctionCW[i] = 0; | 
|         } | 
|   | 
|         for (i = k; i < nDataCW; i += blocks) { | 
|           temp = champGaloisSum(dataTab[i], correctionCW[errorBlocks - 1]); | 
|           for (j = errorBlocks - 1; j >= 0; j--) { | 
|   | 
|             correctionCW[j] = temp ? champGaloisMult(temp, coeffTab[j]) : 0; | 
|             if (j > 0) { | 
|               correctionCW[j] = 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 += blocks; | 
|         } | 
|       } | 
|       return dataTab; | 
|     } | 
|   | 
|     function getBits(entier) { // Transform integer to tab of bits | 
|       var i, | 
|         bits = []; | 
|       for (i = 0; i < 8; i++) { | 
|         bits[i] = entier & (128 >> i) ? 1 : 0; | 
|       } | 
|       return bits; | 
|     } | 
|   | 
|     function next(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] | 
|         row = 4, | 
|         col = 0; | 
|   | 
|       do { | 
|         // Check for a special case of corner | 
|         if ((row === totalRows) && !col) { | 
|           patternShapeSpecial1(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols); | 
|           chr++; | 
|         } else if ((etape < 3) && (row === totalRows - 2) && !col && (totalCols % 4)) { | 
|           patternShapeSpecial2(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols); | 
|           chr++; | 
|         } else if ((row === totalRows - 2) && !col && (totalCols % 8 === 4)) { | 
|           patternShapeSpecial3(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols); | 
|           chr++; | 
|         } else if ((row === totalRows + 4) && (col === 2) && (totalCols % 8 === 0)) { | 
|           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)) { | 
|             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)) { | 
|             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)); | 
|     } | 
|   | 
|     function patternShapeStandard(datamatrix, assigned, bits, row, col, totalRows, totalCols) { // Place bits in the matrix (standard or special case) | 
|       var f = placeBitInDatamatrix; | 
|       f(datamatrix, assigned, bits[0], row - 2, col - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[1], row - 2, col - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[2], row - 1, col - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[3], row - 1, col - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[4], row - 1, col, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[5], row, col - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[6], row, col - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[7], row,  col, totalRows, totalCols); | 
|     } | 
|   | 
|     function patternShapeSpecial1(datamatrix, assigned, bits, totalRows, totalCols) { | 
|       var f = placeBitInDatamatrix; | 
|       f(datamatrix, assigned, bits[0], totalRows - 1,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[1], totalRows - 1,  1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[2], totalRows - 1,  2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols); | 
|     } | 
|   | 
|     function patternShapeSpecial2(datamatrix, assigned, bits, totalRows, totalCols) { | 
|       var f = placeBitInDatamatrix; | 
|       f(datamatrix, assigned, bits[0], totalRows - 3,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[1], totalRows - 2,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[2], totalRows - 1,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[3], 0, totalCols - 4, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[4], 0, totalCols - 3, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[5], 0, totalCols - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[6], 0, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols); | 
|     } | 
|   | 
|     function patternShapeSpecial3(datamatrix, assigned, bits, totalRows, totalCols) { | 
|       var f = placeBitInDatamatrix; | 
|       f(datamatrix, assigned, bits[0], totalRows - 3,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[1], totalRows - 2,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[2], totalRows - 1,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols); | 
|     } | 
|   | 
|     function patternShapeSpecial4(datamatrix, assigned, bits, totalRows, totalCols) { | 
|       var f = placeBitInDatamatrix; | 
|       f(datamatrix, assigned, bits[0], totalRows - 1,  0, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[1], totalRows - 1, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[2], 0, totalCols - 3, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[5], 1, totalCols - 3, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[6], 1, totalCols - 2, totalRows, totalCols); | 
|       f(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols); | 
|     } | 
|   | 
|     function placeBitInDatamatrix(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; | 
|       } | 
|     } | 
|   | 
|     function addFinderPattern(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW) { // Add the finder pattern | 
|       var i, j, | 
|         totalRowsCW = (rowsRegionCW + 2) * rowsRegion, | 
|         totalColsCW = (colsRegionCW + 2) * colsRegion, | 
|         datamatrixTemp = []; | 
|       datamatrixTemp[0] = []; | 
|       for (j = 0; j < totalColsCW + 2; j++) { | 
|         datamatrixTemp[0][j] = 0; | 
|       } | 
|       for (i = 0; i < totalRowsCW; i++) { | 
|         datamatrixTemp[i + 1] = []; | 
|         datamatrixTemp[i + 1][0] = 0; | 
|         datamatrixTemp[i + 1][totalColsCW + 1] = 0; | 
|         for (j = 0; j < totalColsCW; j++) { | 
|           if (i % (rowsRegionCW + 2) === 0) { | 
|             if (j % 2) { | 
|               datamatrixTemp[i + 1][j + 1] = 0; | 
|             } else { | 
|               datamatrixTemp[i + 1][j + 1] = 1; | 
|             } | 
|           } else if (i % (rowsRegionCW + 2) === rowsRegionCW + 1) { | 
|             datamatrixTemp[i + 1][j + 1] = 1; | 
|           } else if (j % (colsRegionCW + 2) === colsRegionCW + 1) { | 
|             if (i % 2) { | 
|               datamatrixTemp[i + 1][j + 1] = 1; | 
|             } else { | 
|               datamatrixTemp[i + 1][j + 1] = 0; | 
|             } | 
|           } 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), 10)))][j - 1 - (2 * (parseInt(j / (colsRegionCW + 2), 10)))]; | 
|           } | 
|         } | 
|       } | 
|       datamatrixTemp[totalRowsCW + 1] = []; | 
|       for (j = 0; j < totalColsCW + 2; j++) { | 
|         datamatrixTemp[totalRowsCW + 1][j] = 0; | 
|       } | 
|       return datamatrixTemp; | 
|     } | 
|   | 
|     return function (text, rectangular) { | 
|       var i, g, | 
|         dataCodeWords = encodeDataCodeWordsASCII(text), // Code the text in the ASCII mode | 
|         aDataCWCount = dataCodeWords.length, | 
|         index = selectIndex(aDataCWCount, rectangular), // Select the index for the data tables | 
|         totalDataCWCount = dataCWCount[index], // Number of data CW | 
|         aSolomonCWCount = solomonCWCount[index], // Number of Reed Solomon CW | 
|         totalCWCount = totalDataCWCount + aSolomonCWCount, // Number of CW | 
|         rowsTotal = lengthRows[index], // Size of symbol | 
|         colsTotal = lengthCols[index], | 
|         rowsRegion = regionRows[index], // Number of region | 
|         colsRegion = regionCols[index], | 
|         rowsRegionCW = dataRegionRows[index], | 
|         colsRegionCW = dataRegionCols[index], | 
|         rowsLengthMatrice = rowsTotal - 2 * rowsRegion, // Size of matrice data | 
|         colsLengthMatrice = colsTotal - 2 * colsRegion, | 
|         blocks = interleavedBlocks[index],  // Number of Reed Solomon blocks | 
|         errorBlocks = (aSolomonCWCount / blocks), | 
|         codeWordsBits = [], // Calculte bits from codewords | 
|         datamatrix = [], // Put data in the matrix | 
|         assigned = []; | 
|   | 
|       addPadCW(dataCodeWords, aDataCWCount, totalDataCWCount); // Add codewords pads | 
|   | 
|       g = calculSolFactorTable(errorBlocks); // Calculate correction coefficients | 
|   | 
|       addReedSolomonCW(aSolomonCWCount, g, totalDataCWCount, dataCodeWords, blocks); // Add Reed Solomon codewords | 
|   | 
|       for (i = 0; i < totalCWCount; i++) { | 
|         codeWordsBits[i] = getBits(dataCodeWords[i]); | 
|       } | 
|   | 
|       for (i = 0; i < colsLengthMatrice; i++) { | 
|         datamatrix[i] = []; | 
|         assigned[i] = []; | 
|       } | 
|   | 
|       // 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 | 
|       next(0, rowsLengthMatrice, colsLengthMatrice, codeWordsBits, datamatrix, assigned); | 
|   | 
|       // Add the finder pattern | 
|       datamatrix = addFinderPattern(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW); | 
|   | 
|       return datamatrix; | 
|     } | 
|   })(); | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // tools | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   function intval(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; | 
|   } | 
|   | 
|   // lec tools - (little endian convertor tools) | 
|   // convert an int | 
|   function lecCInt(value, byteCount) { | 
|     var i, | 
|       le = ""; | 
|     for (i = 0; i < byteCount; i++) { | 
|       le += String.fromCharCode(value & 0xFF); | 
|       value = value >> 8; | 
|     } | 
|     return le; | 
|   } | 
|   | 
|   // return a byte string from rgb values | 
|   function lecCRgb(r, g, b) { | 
|     return String.fromCharCode(b) + String.fromCharCode(g) + String.fromCharCode(r); | 
|   } | 
|   | 
|   // return a byte string from a hex string color | 
|   function lecCHexColor(hex) { | 
|     var g, r, | 
|       v = parseInt("0x" + hex.substr(1), 16), | 
|       b = v & 0xFF; | 
|     v = v >> 8; | 
|     g = v & 0xFF; | 
|     r = v >> 8; | 
|     return (lecCRgb(r, g, b)); | 
|   } | 
|   | 
|   function hexToRGB(hex) { | 
|     var g, r, | 
|       v = parseInt("0x" + hex.substr(1), 16), | 
|       b = v & 0xFF; | 
|     v = v >> 8; | 
|     g = v & 0xFF; | 
|     r = v >> 8; | 
|     return ({r: r, g: g, b: b}); | 
|   } | 
|   | 
|   // test if a string is a hexa string color (like #FF0000) | 
|   function isHexColor(value) { | 
|     return value.match(/#[0-91-F]/gi); | 
|   } | 
|   | 
|   // encode data in base64 | 
|   function base64Encode(value) { | 
|     var c1, c2, c3, b1, b2, b3, b4, | 
|       r = '', | 
|       k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", | 
|       i = 0; | 
|     while (i < value.length) { | 
|       c1 = value.charCodeAt(i++); | 
|       c2 = value.charCodeAt(i++); | 
|       c3 = value.charCodeAt(i++); | 
|       b1 = c1 >> 2; | 
|       b2 = ((c1 & 3) << 4) | (c2 >> 4); | 
|       b3 = ((c2 & 15) << 2) | (c3 >> 6); | 
|       b4 = c3 & 63; | 
|       if (isNaN(c2)) { | 
|         b3 = b4 = 64; | 
|       } else if (isNaN(c3)) { | 
|         b4 = 64; | 
|       } | 
|       r += k.charAt(b1) + k.charAt(b2) + k.charAt(b3) + k.charAt(b4); | 
|     } | 
|     return r; | 
|   } | 
|   | 
|   // convert a bit string to an array of array of bit char | 
|   function bitStringTo2DArray(digit) { | 
|     var i, | 
|       d = []; | 
|     d[0] = []; | 
|     for (i = 0; i < digit.length; i++) { | 
|       d[0][i] = parseInt(digit.charAt(i), 10); | 
|     } | 
|     return d; | 
|   } | 
|   | 
|   // clear jQuery Target | 
|   function resize($container, w) { | 
|     $container | 
|       .css("padding", "0") | 
|       .css("overflow", "auto") | 
|       .css("width", w + "px") | 
|       .html(""); | 
|     return $container; | 
|   } | 
|   | 
|   // apply antialiasing for CSS rendering only | 
|   function antialiasing($container){ | 
|     $container | 
|       .css("display", "flex") | 
|       .css("flex-flow", "row wrap") | 
|       .css("justify-content", "space-around"); | 
|     return $container; | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // Raw Renderer functions | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   // bmp barcode renderer | 
|   function digitToBmpRenderer($container, settings, digit, hri, mw, mh) { | 
|     var i, y, x, k, padding, dataLen, bmp, line, object, | 
|       lines = digit.length, | 
|       columns = digit[0].length, | 
|       c0 = isHexColor(settings.bgColor) ? lecCHexColor(settings.bgColor) : lecCRgb(255, 255, 255), | 
|       c1 = isHexColor(settings.color) ? lecCHexColor(settings.color) : lecCRgb(0, 0, 0), | 
|       bar0 = "", | 
|       bar1 = "", | 
|       pad = ""; | 
|   | 
|     // create one bar 0 and 1 of "mw" byte length | 
|     for (i = 0; i < mw; i++) { | 
|       bar0 += c0; | 
|       bar1 += c1; | 
|     } | 
|   | 
|     padding = (4 - ((mw * columns * 3) % 4)) % 4; // Padding for 4 byte alignment ("* 3" come from "3 byte to color R, G and B") | 
|     dataLen = (mw * columns + padding) * mh * lines; | 
|   | 
|     for (i = 0; i < padding; i++) { | 
|       pad += '\0'; | 
|     } | 
|   | 
|     // Bitmap header | 
|     bmp = 'BM' +                        // Magic Number | 
|       lecCInt(54 + dataLen, 4) +  // Size of Bitmap size (header size + data len) | 
|       '\0\0\0\0' +                      // Unused | 
|       lecCInt(54, 4) +            // The offset where the bitmap data (pixels) can be found | 
|       lecCInt(40, 4) +            // The number of bytes in the header (from this point). | 
|       lecCInt(mw * columns, 4) +  // width | 
|       lecCInt(mh * lines, 4) +    // height | 
|       lecCInt(1, 2) +             // Number of color planes being used | 
|       lecCInt(24, 2) +            // The number of bits/pixel | 
|       '\0\0\0\0' +                      // BI_RGB, No compression used | 
|       lecCInt(dataLen, 4) +       // The size of the raw BMP data (after this header) | 
|       lecCInt(2835, 4) +          // The horizontal resolution of the image (pixels/meter) | 
|       lecCInt(2835, 4) +          // The vertical resolution of the image (pixels/meter) | 
|       lecCInt(0, 4) +             // Number of colors in the palette | 
|       lecCInt(0, 4);              // Means all colors are important | 
|     // Bitmap Data | 
|     for (y = lines - 1; y >= 0; y--) { | 
|       line = ""; | 
|       for (x = 0; x < columns; x++) { | 
|         line += digit[y][x] ? bar1 : bar0; | 
|       } | 
|       line += pad; | 
|       for (k = 0; k < mh; k++) { | 
|         bmp += line; | 
|       } | 
|     } | 
|     // set bmp image to the container | 
|     object = document.createElement("object"); | 
|     object.setAttribute("type", "image/bmp"); | 
|     object.setAttribute("data", "data:image/bmp;base64," + base64Encode(bmp)); | 
|     resize($container, mw * columns + padding).append(object); | 
|   } | 
|   | 
|   // css barcode renderer | 
|   function digitToCssRenderer($container, settings, digit, hri, mw, mh) { | 
|     var x, y, len, current, | 
|       lines = digit.length, | 
|       columns = digit[0].length, | 
|       content = "", | 
|       bar0 = "<div style=\"float: left; font-size: 0; background-color: " + settings.bgColor + "; height: " + mh + "px; width: &Wpx\"></div>", | 
|       bar1 = "<div style=\"float: left; font-size: 0; width:0; border-left: &Wpx solid " + settings.color + "; height: " + mh + "px;\"></div>"; | 
|     for (y = 0; y < lines; y++) { | 
|       len = 0; | 
|       current = digit[y][0]; | 
|       for (x = 0; x < columns; x++) { | 
|         if (current === digit[y][x]) { | 
|           len++; | 
|         } else { | 
|           content += (current ? bar1 : bar0).replace("&W", len * mw); | 
|           current = digit[y][x]; | 
|           len = 1; | 
|         } | 
|       } | 
|       if (len > 0) { | 
|         content += (current ? bar1 : bar0).replace("&W", len * mw); | 
|       } | 
|     } | 
|     if (settings.showHRI) { | 
|       content += "<div style=\"clear:both; width: 100%; background-color: " + settings.bgColor + "; color: " + settings.color + "; text-align: center; font-size: " + settings.fontSize + "px; margin-top: " + settings.marginHRI + "px;\">" + hri + "</div>"; | 
|     } | 
|     antialiasing($container); | 
|     resize($container, mw * columns).html(content); | 
|   } | 
|   | 
|   // svg barcode renderer | 
|   function digitToSvgRenderer($container, settings, digit, hri, mw, mh) { | 
|     var x, y, fontSize, svg, bar1, len, current, object, | 
|       lines = digit.length, | 
|       columns = digit[0].length, | 
|       width = mw * columns, | 
|       height = mh * lines; | 
|   | 
|     if (settings.showHRI) { | 
|       fontSize = intval(settings.fontSize); | 
|       height += intval(settings.marginHRI) + fontSize; | 
|     } | 
|   | 
|     // svg header | 
|     svg = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="' + width + '" height="' + height + '" shape-rendering="crispEdges">'; | 
|   | 
|     // background | 
|     svg += '<rect width="' +  width + '" height="' + height + '" x="0" y="0" fill="' + settings.bgColor + '" />'; | 
|   | 
|     bar1 = '<rect width="&W" height="' + mh + '" x="&X" y="&Y" fill="' + settings.color + '" />'; | 
|   | 
|     for (y = 0; y < lines; y++) { | 
|       len = 0; | 
|       current = digit[y][0]; | 
|       for (x = 0; x < columns; x++) { | 
|         if (current === digit[y][x]) { | 
|           len++; | 
|         } else { | 
|           if (current) { | 
|             svg += bar1.replace("&W", len * mw).replace("&X", (x - len) * mw).replace("&Y", y * mh); | 
|           } | 
|           current = digit[y][x]; | 
|           len = 1; | 
|         } | 
|       } | 
|       if (len && current) { | 
|         svg += bar1.replace("&W", len * mw).replace("&X", (columns - len) * mw).replace("&Y", y * mh); | 
|       } | 
|     } | 
|   | 
|     if (settings.showHRI) { | 
|       svg += '<g transform="translate(' + Math.floor(width / 2) + ' 0)">'; | 
|       svg += '<text y="' + (height - Math.floor(fontSize / 2)) + '" text-anchor="middle" style="font-family: Arial; font-size: ' + fontSize + 'px;" fill="' + settings.color + '">' + hri + '</text>'; | 
|       svg += '</g>'; | 
|     } | 
|     // svg footer | 
|     svg += '</svg>'; | 
|   | 
|     // create a dom object, flush container and add object to the container | 
|   | 
|     object = document.createElement('img'); | 
|     object.setAttribute('src', 'data:image/svg+xml;base64,'+ base64Encode(svg)); | 
|     resize($container, width).append(object); | 
|   } | 
|   | 
|   // canvas barcode renderer | 
|   function digitToCanvasRenderer($container, settings, digit, hri, xi, yi, mw, mh) { | 
|     var x, y, ctx, len, current, dim, | 
|       canvas = $container.get(0), | 
|       lines = digit.length, | 
|       columns = digit[0].length; | 
|   | 
|     if (!canvas || !canvas.getContext) { | 
|       return; // not compatible | 
|     } | 
|   | 
|     ctx = canvas.getContext("2d"); | 
|     ctx.lineWidth = 1; | 
|     ctx.lineCap = "butt"; | 
|     ctx.fillStyle = settings.bgColor; | 
|     ctx.fillRect(xi, yi, columns * mw, lines * mh); | 
|   | 
|     ctx.fillStyle = settings.color; | 
|   | 
|     for (y = 0; y < lines; y++) { | 
|       len = 0; | 
|       current = digit[y][0]; | 
|       for (x = 0; x < columns; x++) { | 
|         if (current === digit[y][x]) { | 
|           len++; | 
|         } else { | 
|           if (current) { | 
|             ctx.fillRect(xi + (x - len) * mw, yi + y * mh, mw * len, mh); | 
|           } | 
|           current = digit[y][x]; | 
|           len = 1; | 
|         } | 
|       } | 
|       if (len && current) { | 
|         ctx.fillRect(xi + (columns - len) * mw, yi + y * mh, mw * len, mh); | 
|       } | 
|     } | 
|     if (settings.showHRI) { | 
|       dim = ctx.measureText(hri); | 
|       ctx.fillText(hri, xi + Math.floor((columns * mw - dim.width) / 2), yi + lines * mh + settings.fontSize + settings.marginHRI); | 
|     } | 
|   } | 
|   | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   // Renderer | 
|   // * * * * * * * * * * * * * * * * * * * * * * | 
|   | 
|   var renderer = {}; | 
|   | 
|   // bmp 1D barcode renderer | 
|   renderer.bmp = function ($container, settings, digit, hri) { | 
|     var w = intval(settings.barWidth), | 
|       h = intval(settings.barHeight); | 
|     digitToBmpRenderer($container, settings, bitStringTo2DArray(digit), hri, w, h); | 
|   }; | 
|   | 
|   // bmp 2D barcode renderer | 
|   renderer.bmp2 = function ($container, settings, digit, hri) { | 
|     var s = intval(settings.moduleSize); | 
|     digitToBmpRenderer($container, settings, digit, hri, s, s); | 
|   }; | 
|   | 
|   // css 1D barcode renderer | 
|   renderer.css = function ($container, settings, digit, hri) { | 
|     var w = intval(settings.barWidth), | 
|       h = intval(settings.barHeight); | 
|     digitToCssRenderer($container, settings, bitStringTo2DArray(digit), hri, w, h); | 
|   }; | 
|   | 
|   // css 2D barcode renderer | 
|   renderer.css2 = function ($container, settings, digit, hri) { | 
|     var s = intval(settings.moduleSize); | 
|     digitToCssRenderer($container, settings, digit, hri, s, s); | 
|   }; | 
|   | 
|   // svg 1D barcode renderer | 
|   renderer.svg = function ($container, settings, digit, hri) { | 
|     var w = intval(settings.barWidth), | 
|       h = intval(settings.barHeight); | 
|     digitToSvgRenderer($container, settings, bitStringTo2DArray(digit), hri, w, h); | 
|   }; | 
|   | 
|   // svg 2D barcode renderer | 
|   renderer.svg2 = function ($container, settings, digit, hri) { | 
|     var s = intval(settings.moduleSize); | 
|     digitToSvgRenderer($container, settings, digit, hri, s, s); | 
|   }; | 
|   | 
|   // canvas 1D barcode renderer | 
|   renderer.canvas = function ($container, settings, digit, hri) { | 
|     var w  = intval(settings.barWidth), | 
|       h = intval(settings.barHeight), | 
|       x = intval(settings.posX), | 
|       y = intval(settings.posY); | 
|     digitToCanvasRenderer($container, settings, bitStringTo2DArray(digit), hri, x, y, w, h); | 
|   }; | 
|   | 
|   // canvas 2D barcode renderer | 
|   renderer.canvas2 = function ($container, settings, digit, hri) { | 
|     var s = intval(settings.moduleSize), | 
|       x = intval(settings.posX), | 
|       y = intval(settings.posY); | 
|     digitToCanvasRenderer($container, settings, digit, hri, x, y, s, s); | 
|   }; | 
|   | 
|   $.fn.barcode = function (data, type, settings) { | 
|     var code, crc, rect, fn, | 
|       digit = "", | 
|       hri   = "", | 
|       b2d   = false; | 
|   | 
|     data = $.extend({crc: true, rect: false}, typeof data === "object" ? data : {code: data}); | 
|   | 
|     code  = data.code; | 
|     crc   = data.crc; | 
|     rect  = data.rect; | 
|   | 
|     if (code) { | 
|       settings = $.extend(true, defaultSettings, settings); | 
|   | 
|       switch (type) { | 
|       case "std25": | 
|       case "int25": | 
|         digit = getDigitI25(code, crc, type); | 
|         hri = getDigitI25(code, crc, type); | 
|         break; | 
|       case "ean8": | 
|       case "ean13": | 
|         digit = getDigitEAN(code, type); | 
|         hri = computeEAN(code, type); | 
|         break; | 
|       case "upc": | 
|         digit = getDigitUPC(code); | 
|         hri = computeUPC(code); | 
|         break; | 
|       case "code11": | 
|         digit = getDigitCode11(code); | 
|         hri = code; | 
|         break; | 
|       case "code39": | 
|         digit = getDigitCode39(code); | 
|         hri = code; | 
|         break; | 
|       case "code93": | 
|         digit = getDigitCode93(code, crc); | 
|         hri = code; | 
|         break; | 
|       case "code128": | 
|         digit = getDigitCode128(code); | 
|         hri = code; | 
|         break; | 
|       case "codabar": | 
|         digit = getDigitCodabar(code); | 
|         hri = code; | 
|         break; | 
|       case "msi": | 
|         digit = getDigitMsi(code); | 
|         hri = computeMsi(code, crc); | 
|         break; | 
|       case "datamatrix": | 
|         digit = getDigitDatamatrix(code, rect); | 
|         hri = code; | 
|         b2d = true; | 
|         break; | 
|       } | 
|       if (digit.length) { | 
|         // Quiet Zone | 
|         if (!b2d && settings.addQuietZone) { | 
|           digit = "0000000000" + digit + "0000000000"; | 
|         } | 
|   | 
|         fn = renderer[settings.output + (b2d ? '2' : '')]; | 
|         if (fn) { | 
|           this.each(function () { | 
|             fn($(this), settings, digit, hri); | 
|           }); | 
|         } | 
|       } | 
|     } | 
|     return this; | 
|   }; | 
|   | 
| }(jQuery)); |