// This file and its contents are copyrighted material and
// are the physical and intellectual property of RenderBar Imaging™.
// By distributing, viewing, modifying, or otherwise using this
// material, you are binding yourself to, and are in complete
// agreement with, our stated license agreement found at:
// http://www.renderbar.com/secure/agree.php
// expose object interfaces
Barcode.constructor = Barcode;
Barcode.prototype.codeA = getA;
Barcode.prototype.codeB = getB;
Barcode.prototype.codeC = getC;
Barcode.prototype.Shift = getShift;
Barcode.prototype.FNC1 = getFNC1;
Barcode.prototype.FNC2 = getFNC2;
Barcode.prototype.FNC3 = getFNC3;
Barcode.prototype.FNC4 = getFNC4;
Barcode.prototype.ToA = getToA;
Barcode.prototype.ToB = getToB;
Barcode.prototype.ToC = getToC;
Barcode.prototype.encode = encode;
Barcode.prototype.codeTableChar = new Array(
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
198
);
// A = 203; B = 204; C = 205;
// FNC1 = 202; FNC2 = 197;
// FNC3 = 196; FNC4 = 195;
// ToA = 201; ToB = 200; ToC = 199
// Shift = 198
Barcode.prototype.getCheckDigit = getCheckDigit;
Barcode.prototype.getCodeTable = getCodeTable;
Barcode.prototype.getHeight = getHeight;
Barcode.prototype.getIsReadable = getIsReadable;
Barcode.prototype.getIsCompressed = getIsCompressed;
Barcode.prototype.getParentElement = getParentElement;
Barcode.prototype.getRatio = getRatio;
Barcode.prototype.getType = getType;
Barcode.prototype.getValue = getValue;
Barcode.prototype.getWidth = getWidth;
Barcode.prototype.hasCheckDigit = hasCheckDigit;
Barcode.prototype.innerHTML = innerHTML;
Barcode.prototype.setCodeTable = setCodeTable;
Barcode.prototype.setHeight = setHeight;
Barcode.prototype.setIsReadable = setIsReadable;
Barcode.prototype.setParentElement = setParentElement;
Barcode.prototype.setRatio = setRatio;
Barcode.prototype.setType = setType;
Barcode.prototype.setValue = setValue;
Barcode.prototype.setWidth = setWidth;
Barcode.prototype.types = new Array(
"codabar",
"code128",
"code25",
"code39",
"ean13",
"ean8",
"itf",
"msi",
"upca",
"upce"
);
// 0 - 9 respectively
// default local variable values
var A = 203;
var B = 204;
var C = 205;
var Shift = 198;
var FNC1 = 202;
var FNC2 = 197;
var FNC3 = 196;
var FNC4 = 195;
var ToA = 201;
var ToB = 200;
var ToC = 199;
var checkDigit = 0;
var codeTable = 204;
var compress = false;
var encoded = "";
var hasCheck = false;
var height = 25;
var html = "";
var parentEl = null;
var readable = true;
var ratio = "3:1";
var type = "code39";
var value = "RenderBar";
var width = 1;
// interface functionality
function Barcode(){}
function encode(input, type, check, autoCompress, table){
if (input == null) return false;
if (input.length == 0) return false;
setType(type);
setCodeTable(table);
value = input;
hasCheck = (check ? true : false);
compress = (autoCompress ? true : false);
encoded = "";
checkDigit = 0;
switch (type){
case "codabar" : CodaBar(value); break;
case "code128" : Code128(value); break;
case "code25" : Code25(value); break;
case "code39" : Code39(value); break;
case "ean13" : EAN13(value); break;
case "ean8" : EAN8(value); break;
case "itf" : ITF(value); break;
case "msi" : MSI(value); break;
case "upca" : UPCA(value); break;
case "upce" : UPCE(value); break;
}
getHTML();
}
function getA() {return A;}
function getB() {return B;}
function getC() {return C;}
function getFNC1() {return FNC1;}
function getFNC2() {return FNC2;}
function getFNC3() {return FNC3;}
function getFNC4() {return FNC4;}
function getToA() {return ToA;}
function getToB() {return ToB;}
function getToC() {return ToC;}
function getCheckDigit(){return checkDigit;}
function getCodeTable(){
switch (codeTable){
case A: return "A"; break;
case B: return "B"; break;
case C: return "C"; break;
}
}
function getHeight(){return height;}
function getHTML(){
var chr = 0;
var chrCount = 0;
var gif = "";
var htm = "";
if (isNaN(height)) h = 25;
if (isNaN(width)) w = 1;
if (height < 5) height = 25;
if (width < 1) width = 1;
for (var i = 0; i < encoded.length; i++){
chr = parseInt(encoded.substr(i, 1));
chrCount = 1;
if (i == encoded.length) break;
while (chr == parseInt(encoded.substr(i + 1, 1))){
chrCount++;
i++;
if (i > encoded.length) break;
}
gif = ((chr == 1) ? "b.gif" : "w.gif");
htm += "
";
}
if (readable){
if (type == "code128"){ value = value.replace(/(\W|\D)*/, ""); }
htm += "
" + value + "
";
}
html = "" + htm + "
";
if (parentEl != null) parentEl.innerHTML = html;
}
function getIsCompressed() {return compress;}
function getIsReadable() {return readable;}
function getParentElement() {return parentEl;}
function getRatio() {return ratio;}
function getShift() {return Shift;}
function getType() {return type;}
function getValue() {return value;}
function getWidth() {return width;}
function hasCheckDigit() {return hasCheck;}
function innerHTML() {return html;}
function setCodeTable(chr){
if (chr == null) return false;
chr = (isNaN(chr) ? chr.charCodeAt(0) : chr);
chr = chr.toString();
chr = chr.toLowerCase();
var exp = new RegExp("(^[?i:abc]{1}$)+|(^20[3-5]{1}?$)+");
if (!exp.test(chr)) return false;
exp = new RegExp("^[?i:abc]{1}$");
chr = (exp.test(chr) ? chr.charCodeAt(0) + 106 : chr);
codeTable = chr;
return true;
}
function setHeight(h){
if (isNaN(h)) return;
if (h < 5) h = 5;
height = h;
}
function setIsReadable(yes){readable = yes;}
function setParentElement(e){
parentEl = (document.all ? document.all[e] : document.getElementById(e));
}
function setRatio(r){
if (!r) return;
switch (r){
case "2:1":
case "3:1": break;
default: return;
}
ratio = r;
}
function setType(barType){
var exp = new RegExp("^([0-9]{1}|(codabar|code128|code25|code39|ean13|ean8|itf|msi|upca|upce){1})$");
var exp = new RegExp();
if (barType == null) return false;
barType = (isNaN(barType) ? barType.toLowerCase() : barType);
if (!exp.test(barType)) return false;
type = (isNaN(barType) ? barType : types[barType]);
return true;
}
function setValue(val){value = val;}
function setWidth(w){
if (isNaN(w)) return;
if (w < 5) w = 5;
width = w;
}
// barcoding functions
function CodaBar(input){
var charIndex = 0;
var charSet = new Array();
var chr = "";
var encodeFormat = "";
var exp = new RegExp("^[?i:a-d]{1}[?i:0-9a-d\-\$\:\/\.\+]+[?i:a-d]{1}$");
var pad = "0";
if (!exp.test(input)) return "";
input = input.toUpperCase();
charSet[0] = "0000011"; // 0
charSet[1] = "0000110"; // 1
charSet[2] = "0001001"; // 2
charSet[3] = "1100000"; // 3
charSet[4] = "0010010"; // 4
charSet[5] = "1000010"; // 5
charSet[6] = "0100001"; // 6
charSet[7] = "0100100"; // 7
charSet[8] = "0110000"; // 8
charSet[9] = "1001000"; // 9
charSet[10] = "0001100"; // -
charSet[11] = "0011000"; // $
charSet[12] = "1000101"; // :
charSet[13] = "1010001"; // /
charSet[14] = "1010100"; // .
charSet[15] = "0010101"; // +
charSet[16] = "0011010"; // A
charSet[17] = "0101001"; // B
charSet[18] = "0001011"; // C
charSet[19] = "0001110"; // D
for (var i = 0; i < input.length; i++){
chr = input.substr(i, 1);
switch (true){
case (!isNaN(chr)) : charIndex = parseInt(chr); break;
case (chr == "-") : charIndex = 10; break;
case (chr == "$") : charIndex = 11; break;
case (chr == ":") : charIndex = 12; break;
case (chr == "/") : charIndex = 13; break;
case (chr == ".") : charIndex = 14; break;
case (chr == "+") : charIndex = 15; break;
default : charIndex = chr.charCodeAt(0) - 49; break;
}
encoded += charSet[charIndex];
}
input = encoded;
encoded = "";
for (var i = 0; i < input.length; i += 7){
encodeFormat = input.substr(i, 7);
for (var j = 0; j < 7; j++){
if ((j & 1) == 1){
encoded += ((encodeFormat.substr(j, 1) == 1) ? "00" : "0");
}else{
encoded += ((encodeFormat.substr(j, 1) == 1) ? "11" : "1");
}
}
if ((i + 7) < input.length) encoded += pad;
}
return encoded;
}
function Code128(input){
if (input.length == 0) return "";
var chr = 0;
var charSet = new Array();
var curCodeTable = 0;
var startChar = "";
var stopChar = "1100011101011";
charSet[0] = "11011001100";
charSet[1] = "11001101100";
charSet[2] = "11001100110";
charSet[3] = "10010011000";
charSet[4] = "10010001100";
charSet[5] = "10001001100";
charSet[6] = "10011001000";
charSet[7] = "10011000100";
charSet[8] = "10001100100";
charSet[9] = "11001001000";
charSet[10] = "11001000100";
charSet[11] = "11000100100";
charSet[12] = "10110011100";
charSet[13] = "10011011100";
charSet[14] = "10011001110";
charSet[15] = "10111001100";
charSet[16] = "10011101100";
charSet[17] = "10011100110";
charSet[18] = "11001110010";
charSet[19] = "11001011100";
charSet[20] = "11001001110";
charSet[21] = "11011100100";
charSet[22] = "11001110100";
charSet[23] = "11101101110";
charSet[24] = "11101001100";
charSet[25] = "11100101100";
charSet[26] = "11100100110";
charSet[27] = "11101100100";
charSet[28] = "11100110100";
charSet[29] = "11100110010";
charSet[30] = "11011011000";
charSet[31] = "11011000110";
charSet[32] = "11000110110";
charSet[33] = "10100011000";
charSet[34] = "10001011000";
charSet[35] = "10001000110";
charSet[36] = "10110001000";
charSet[37] = "10001101000";
charSet[38] = "10001100010";
charSet[39] = "11010001000";
charSet[40] = "11000101000";
charSet[41] = "11000100010";
charSet[42] = "10110111000";
charSet[43] = "10110001110";
charSet[44] = "10001101110";
charSet[45] = "10111011000";
charSet[46] = "10111000110";
charSet[47] = "10001110110";
charSet[48] = "11101110110";
charSet[49] = "11010001110";
charSet[50] = "11000101110";
charSet[51] = "11011101000";
charSet[52] = "11011100010";
charSet[53] = "11011101110";
charSet[54] = "11101011000";
charSet[55] = "11101000110";
charSet[56] = "11100010110";
charSet[57] = "11101101000";
charSet[58] = "11101100010";
charSet[59] = "11100011010";
charSet[60] = "11101111010";
charSet[61] = "11001000010";
charSet[62] = "11110001010";
charSet[63] = "10100110000";
charSet[64] = "11100001100";
charSet[65] = "10010110000";
charSet[66] = "10010000110";
charSet[67] = "10000101100";
charSet[68] = "10000100110";
charSet[69] = "10110010000";
charSet[70] = "10110000100";
charSet[71] = "10011010000";
charSet[72] = "10011000010";
charSet[73] = "10000110100";
charSet[74] = "10000110010";
charSet[75] = "11000010010";
charSet[76] = "11001010000";
charSet[77] = "11110111010";
charSet[78] = "11000010100";
charSet[79] = "10001111010";
charSet[80] = "10100111100";
charSet[81] = "10010111100";
charSet[82] = "10010011110";
charSet[83] = "10111100100";
charSet[84] = "10011110100";
charSet[85] = "10011110010";
charSet[86] = "11110100100";
charSet[87] = "11110010100";
charSet[88] = "11110010010";
charSet[89] = "11011011110";
charSet[90] = "11011110110";
charSet[91] = "11110110110";
charSet[92] = "10101111000";
charSet[93] = "10100011110";
charSet[94] = "10001011110";
charSet[95] = "10111101000";
charSet[96] = "10111100010";
charSet[97] = "11110101000";
charSet[98] = "11110100010";
charSet[99] = "10111011110";
charSet[100] = "10111101110";
charSet[101] = "11101011110";
charSet[102] = "11110101110";
charSet[103] = "11010000100";
charSet[104] = "11010010000";
charSet[105] = "11010011100";
curCodeTable = codeTable;
checkDigit = codeTable - 100;
startChar = charSet[checkDigit];
if (curCodeTable == C) input += ((input.length % 2 != 0) ? "0" : "");
for (var i = 0; i < input.length; i++){
chr = input.charCodeAt(i);
if (chr == ToA || chr == ToB || chr == ToC){
switch (curCodeTable){
case A: if (chr == ToC){curCodeTable = C;}else{if (chr == ToB) curCodeTable = B;} break;
case B: if (chr == ToC){curCodeTable = C;}else{if (chr == ToA) curCodeTable = A;} break;
case C: if (chr == ToB){curCodeTable = B;}else{if (chr == ToA) curCodeTable = A;} break;
}
}
if (curCodeTable == A || curCodeTable == B){
switch (true){
case chr < 32 : chr += 64; break;
case chr > 31 && chr < 128 : chr -= 32; break;
case chr > 127 : chr -= 100; break;
}
}else{
chr = ((chr < 200) ? parseInt(input.substr(i, 2)) : chr - 100);
}
i++;
if (curCodeTable == C){
if (chr < 100){
checkDigit += chr * (parseInt(i / 2) + 1);
i++;
}else{
checkDigit += chr * i;
}
}else{
checkDigit += chr * i;
}
i--;
encoded += charSet[chr];
}
checkDigit %= 103;
encoded = startChar + encoded + charSet[checkDigit] + stopChar;
return encoded;
}
function Code25(input){
var charSet = new Array();
var chr = 0;
var encodeFormat = "";
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var oddSum = 0;
var padd = "0";
var startChar = "1110111010";
var stopChar = "111010111";
if (!exp.test(input)) return "";
// numbers 0 to 9
charSet[0] = "00110";
charSet[1] = "10001";
charSet[2] = "01001";
charSet[3] = "11000";
charSet[4] = "00101";
charSet[5] = "10100";
charSet[6] = "01100";
charSet[7] = "00011";
charSet[8] = "10010";
charSet[9] = "01010";
for (var i = 0; i < input.length; i++){
chr = parseInt(input.substr(i, 1));
if (i % 2 == 0){
oddSum += chr;
}else{
evenSum += chr;
}
encoded += charSet[chr];
}
input = "";
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10);
if (checkDigit == 10) checkDigit = 0;
encoded += charSet[checkDigit];
for (var i = 0; i < encoded.length; i += 5){
encodeFormat = encoded.substr(i, 5);
for (var j = 0; j < 5; j++){
input += ((parseInt(encodeFormat.substr(j, 1)) == 1) ? "111" : "1");
input += padd;
}
}
encoded = input;
encoded = startChar + encoded + stopChar;
return encoded;
}
function Code39(input){
var charIndex = 0;
var charSet = new Array(43);
var chr = "";
var encodeFormat = "";
var exp = new RegExp("[a-zA-Z0-9\-\. \$\/\+\%]");
var guard = "010010100";
var padd = "0";
var stripeRatio = (ratio == "3:1" ? "000" : "00");
var barRatio = (ratio == "3:1" ? "111" : "11");
// numbers 0 to 9
charSet[0] = "000110100";
charSet[1] = "100100001";
charSet[2] = "001100001";
charSet[3] = "101100000";
charSet[4] = "000110001";
charSet[5] = "100110000";
charSet[6] = "001110000";
charSet[7] = "000100101";
charSet[8] = "100100100";
charSet[9] = "001100100";
// letters A to Z
charSet[10] = "100001001";
charSet[11] = "001001001";
charSet[12] = "101001000";
charSet[13] = "000011001";
charSet[14] = "100011000";
charSet[15] = "001011000";
charSet[16] = "000001101";
charSet[17] = "100001100";
charSet[18] = "001001100";
charSet[19] = "000011100";
charSet[20] = "100000011";
charSet[21] = "001000011";
charSet[22] = "101000010";
charSet[23] = "000010011";
charSet[24] = "100010010";
charSet[25] = "001010010";
charSet[26] = "000000111";
charSet[27] = "100000110";
charSet[28] = "001000110";
charSet[29] = "000010110";
charSet[30] = "110000001";
charSet[31] = "011000001";
charSet[32] = "111000000";
charSet[33] = "010010001";
charSet[34] = "110010000";
charSet[35] = "011010000";
// allowed symbols - . SP $ / + %
charSet[36] = "010000101";
charSet[37] = "110000100";
charSet[38] = "011000100";
charSet[39] = "010101000";
charSet[40] = "010100010";
charSet[41] = "010001010";
charSet[42] = "000101010";
while (input.indexOf("*") != -1) input = input.replace("*", "");
input = input.toUpperCase();
for (i = 0; i < input.length; i++){
chr = input.substr(i, 1);
if (!exp.test(chr)){encoded = ""; return "";}
switch (true){
case chr == "-" : charIndex = 36; break;
case chr == "." : charIndex = 37; break;
case chr == " " : charIndex = 38; break;
case chr == "$" : charIndex = 39; break;
case chr == "/" : charIndex = 40; break;
case chr == "+" : charIndex = 41; break;
case chr == "%" : charIndex = 42; break;
case !isNaN(chr) : charIndex = parseInt(chr); break;
default : charIndex = chr.charCodeAt(0) - 55; break;
}
checkDigit += charIndex;
encoded += charSet[charIndex];
}
checkDigit %= 43;
if (hasCheck) encoded += charSet[checkDigit];
encoded = guard + encoded + guard;
input = "";
for (i = 0; i < encoded.length; i += 9){
encodeFormat = encoded.substr(i, 9);
for (j = 0; j < 9; j++){
if ((j & 1) == 1){
input += ((encodeFormat.substr(j, 1) == 1) ? stripeRatio : "0");
}else{
input += ((encodeFormat.substr(j, 1) == 1) ? barRatio : "1");
}
}
input += padd;
}
encoded = input;
return encoded;
}
function EAN13(input){
var center = "01010";
var charSet = new Array();
var encodeSupplement = false;
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var guard = "101";
var numberSystem = 0;
var oddSum = 0;
var parity = 0;
var paritySequence = "";
var supplement = "";
if (!exp.test(input)) return "";
switch (input.length){
case 12:
case 14:
case 17: if (input.length > 12){
supplement = input.substr(12, input.length - 12);
input = input.substr(0, 12);
encodeSupplement = true;
break;
}
case 13:
case 15:
case 18: if (input.length > 13){
supplement = input.substr(13, input.length - 13);
checkDigit = input.substr(12, 1);
encodeSupplement = True;
}else{
checkDigit = input.substr(input.length - 1, 1);
}
input = input.substr(0, 12);
break;
default: return ""; break;
}
if (encodeSupplement) supplement = EncodeSupplement(supplement);
// left even parity
charSet[0] = "0001101";
charSet[1] = "0011001";
charSet[2] = "0010011";
charSet[3] = "0111101";
charSet[4] = "0100011";
charSet[5] = "0110001";
charSet[6] = "0101111";
charSet[7] = "0111011";
charSet[8] = "0110111";
charSet[9] = "0001011";
// left odd parity
charSet[10] = "0100111";
charSet[11] = "0110011";
charSet[12] = "0011011";
charSet[13] = "0100001";
charSet[14] = "0011101";
charSet[15] = "0111001";
charSet[16] = "0000101";
charSet[17] = "0010001";
charSet[18] = "0001001";
charSet[19] = "0010111";
// right char set
charSet[20] = "1110010";
charSet[21] = "1100110";
charSet[22] = "1101100";
charSet[23] = "1000010";
charSet[24] = "1011100";
charSet[25] = "1001110";
charSet[26] = "1010000";
charSet[27] = "1000100";
charSet[28] = "1001000";
charSet[29] = "1110100";
if (input.length == 12){
for (var i = 0; i < input.length; i++){
if (i % 2 == 0){
evenSum += parseInt(input.substr(i, 1));
}else{
oddSum += parseInt(input.substr(i, 1));
}
}
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10)
checkDigit = (checkDigit == 10 ? 0 : checkDigit);
input += checkDigit.toString();
}
numberSystem = parseInt(input.substr(0, 1));
input = input.substr(1, input.length - 1);
switch (numberSystem){
case 0: paritySequence = "000000222222"; break;
case 1: paritySequence = "001011222222"; break;
case 2: paritySequence = "001101222222"; break;
case 3: paritySequence = "001110222222"; break;
case 4: paritySequence = "010011222222"; break;
case 5: paritySequence = "011001222222"; break;
case 6: paritySequence = "011100222222"; break;
case 7: paritySequence = "010101222222"; break;
case 8: paritySequence = "010110222222"; break;
case 9: paritySequence = "011010222222"; break;
}
for (var i = 0; i < input.length; i++){
parity = parseInt(paritySequence.substr(i, 1)) * 10;
parity += parseInt(input.substr(i, 1));
encoded += charSet[parity];
if (i == 5) encoded += center;
}
encoded = guard + encoded + guard + supplement;
return encoded;
}
function EAN8(input){
var center = "01010";
var charSet = new Array();
var encodeSupplement = false;
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var guard = "101";
var oddSum = 0;
var parity = 0;
var supplement = "";
if (!exp.test(input)) return "";
switch (input.length){
case 7 :
case 9 :
case 12: if (input.length > 7){
supplement = input.substr(7, input.length - 7);
input = input.substr(0, 7);
encodeSupplement = true;
}
break;
case 8 :
case 10:
case 13: if (input.length > 8){
supplement = input.substr(8, input.length - 8);
checkDigit = parseInt(input.substr(8, 1));
input = input.substr(0, 8);
encodeSupplement = true;
}
break;
default: return ""; break;
}
if (encodeSupplement) supplement = EncodeSupplement(supplement);
// left char set
charSet[0] = "0001101";
charSet[1] = "0011001";
charSet[2] = "0010011";
charSet[3] = "0111101";
charSet[4] = "0100011";
charSet[5] = "0110001";
charSet[6] = "0101111";
charSet[7] = "0111011";
charSet[8] = "0110111";
charSet[9] = "0001011";
// right char set
charSet[10] = "1110010";
charSet[11] = "1100110";
charSet[12] = "1101100";
charSet[13] = "1000010";
charSet[14] = "1011100";
charSet[15] = "1001110";
charSet[16] = "1010000";
charSet[17] = "1000100";
charSet[18] = "1001000";
charSet[19] = "1110100";
if (input.length == 8){
for (var i = 0; i < input.length; i++){
if (i % 2 == 0){
oddSum += parseInt(input.substr(i, 1));
}else{
evenSum += parseInt(input.substr(i, 1));
}
}
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10);
checkDigit = (checkDigit == 10 ? 0 : checkDigit);
input += checkDigit.toString();
}
for (var i = 0; i < 8; i++){
parity = (i < 4 ? 0 : 1) * 10;
parity += parseInt(input.substr(i, 1));
encoded += charSet[parity];
if (i == 3) encoded += center;
}
encoded = guard + encoded + guard + supplement;
return encoded;
}
function EncodeSupplement(input){
var charSet = new Array();
var center = "01";
var encode = "";
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var guard = "1011";
var largeParity = new Array();
var oddSum = 0;
var padd = "00000000000000000000";
var parity = 0;
var parityMask = "";
var smallParity = new Array();
if (!exp.test(input)) return "";
// even char set
charSet[0] = "0100111";
charSet[1] = "0110011";
charSet[2] = "0011011";
charSet[3] = "0100001";
charSet[4] = "0011101";
charSet[5] = "0111001";
charSet[6] = "0000101";
charSet[7] = "0010001";
charSet[8] = "0001001";
charSet[9] = "0010111";
// odd char set
charSet[10] = "0001101";
charSet[11] = "0011001";
charSet[12] = "0010011";
charSet[13] = "0111101";
charSet[14] = "0100011";
charSet[15] = "0110001";
charSet[16] = "0101111";
charSet[17] = "0111011";
charSet[18] = "0110111";
charSet[19] = "0001011";
// populate parity masks
// 2 digit
smallParity[0] = "11";
smallParity[1] = "10";
smallParity[2] = "01";
smallParity[3] = "00";
// 5 digit
largeParity[0] = "00111";
largeParity[1] = "01011";
largeParity[2] = "01101";
largeParity[3] = "01110";
largeParity[4] = "10011";
largeParity[5] = "11001";
largeParity[6] = "11100";
largeParity[7] = "10101";
largeParity[8] = "10110";
largeParity[9] = "11010";
switch (input.length){
case 2 : parityMask = smallParity(parseInt(input) % 4);
for (var i = 0; i < 2; i++){
parity = (parseInt(parityMask.substr(i, 1)) * 10);
parity += parseInt(input.substr(i, 1));
encode += charSet[parity];
if (i == 1) encode += center;
}
encode = padd + guard + encode;
break;
case 5 : for (var i = 0; i < 5; i++){
if (i % 2 == 0){
oddSum += parseInt(input.substr(i, 1));
}else{
evenSum += parseInt(input.substr(i, 1));
}
}
parity = ((oddSum * 3) + (evenSum * 9)) % 10;
parityMask = largeParity(parity);
for (var i = 1; i < 5; i++){
parity = (parseInt(parityMask.substr(i, 1)) * 10);
parity += parseInt(input.substr(i, 1));
encode += charSet[parity];
if (i == 4) break;
encode += center;
}
encode = padd + guard + encode;
break;
default: return ""; break;
}
return encode;
}
function Interlace(input){
var left = "";
var right = "";
var newString = "";
for (var i = 0; i < input.length; i+= 10){
left = input.substr(i, 5);
right = input.substr(i + 5, 5);
for (var j = 0; j < 5; j++){
newString += left.substr(j, 1) + right.substr(j, 1);
}
}
return newString;
}
function ITF(input){
var chr = 0;
var charSet = new Array();
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var oddSum = 0;
var startChar = "1010";
var stopChar = "1101";
charSet[0] = "00110";
charSet[1] = "10001";
charSet[2] = "01001";
charSet[3] = "11000";
charSet[4] = "00101";
charSet[5] = "10100";
charSet[6] = "01100";
charSet[7] = "00011";
charSet[8] = "10010";
charSet[9] = "01010";
if (!exp.test(input)) return "";
if (hasCheck){
for (var i = 0; i < input.length; i++){
if (i % 2 == 0){
oddSum += parseInt(input.substr(i, 1));
}else{
evenSum += parseInt(input.substr(i, 1));
}
}
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10);
checkDigit = (checkDigit == 10 ? 0 : checkDigit);
input += checkDigit.toString();
}
if ((input.length & 1) == 1) input = "0" + input;
for (var i = 0; i < input.length; i++){
encoded += charSet[parseInt(input.substr(i, 1))];
}
input = Interlace(encoded);
encoded = "";
for (var i = 0; i < input.length; i++){
chr = parseInt(input.substr(i, 1));
if (i % 2 == 0){
encoded += (chr == 1 ? "11" : "1");
}else{
encoded += (chr == 1 ? "00" : "0");
}
}
encoded = startChar + encoded + stopChar;
return encoded;
}
function MSI(input){
var charSet = new Array();
var chr = "";
var exp = new RegExp("^[0-9]+$");
var product = "";
var oddSum = 0;
var startChar = "110";
var stopChar = "1001";
if (!exp.test(input)) return "";
if (input.length < 3 || input.length > 14) return "";
charSet[0] = "100100100100";
charSet[1] = "100100100110";
charSet[2] = "100100110100";
charSet[3] = "100100110110";
charSet[4] = "100110100100";
charSet[5] = "100110100110";
charSet[6] = "100110110100";
charSet[7] = "100110110110";
charSet[8] = "110100100100";
charSet[9] = "110100100110";
for (var i = 0; i < input.length; i++){
chr = input.substr(i, 1);
if (i % 2 == 0){
oddSum += parseInt(chr);
}else{
product += chr;
}
}
product = parseInt(product) * 2;
product = String(product);
for (var i = 0; i < product.length; i++){
checkDigit += parseInt(product.substr(i, 1));
}
checkDigit += oddSum;
checkDigit = 10 - (checkDigit % 10);
if (checkDigit == 10) checkDigit = 0;
input += checkDigit;
for (var i = 0; i < input.length; i++){
chr = input.substr(i, 1);
encoded += charSet[parseInt(chr)];
}
encoded = startChar + encoded + stopChar;
}
function UPCA(input){
var center = "01010";
var charSet = new Array();
var encodeSupplement = false;
var evenSum = 0;
var exp = new RegExp("^[0-9]+$");
var guard = "101";
var oddSum = 0;
var parity = 0;
var supplement = "";
if (!exp.test(input)) return "";
switch (input.length){
case 11:
case 13:
case 16: if (input.length > 11){
supplement = input.substr(11, input.length - 11);
input = input.substr(0, 11);
encodeSupplement = true;
}
break;
case 12:
case 14:
case 17: if (input.length > 12){
supplement = input.substr(12, input.length - 12);
input = input.substr(0, 12);
encodeSupplement = true;
}
break;
default: return ""; break;
}
if (encodeSupplement) suppliment = EncodeSupplement(supplement);
if (compress){
// see: http://www.uc-council.org/reflib/01302/d36-2.htm for specifications
var expFirst = new RegExp("(^[0-9]{3})([0-2]{1})(0{2})([0-9]{5}$)");
var expSecond = new RegExp("(^[0-9]{3})([3-9]{1})(0{2})([0-9]{5}$)");
var expThird = new RegExp("(^[0-9]{4})([1-9]{1})(0{1})([0-9]{5}$)");
var expFourth = new RegExp("(^[0-9]{4})([1-9]{2})([0-9]{5}$)");
switch (true){
case expFirst.test(input) : expFirst = new RegExp("(^[0-9]{3})([0-2]{1})([0-9]{4})([0-9]{3}$)");
input = input.replace(expFirst, "$1$4$2");
break;
case expSecond.test(input): expSecond = new RegExp("(^[0-9]{4})([0-9]{5})([0-9]{2}$)");
input = input.replace(expSecond, "$1$3") + "3";
break;
case expThird.test(input) : expThird = new RegExp("(^[0-9]{5})([0-9]{5})([0-9]{1}$)");
input = input.replace(expThird, "$1$3") + "4";
break;
case expFourth.test(input): expFourth = new RegExp("(^[0-9]{6})([0-9]{4})([0-9]{1}$)");
input = input.replace(expFourth, "$1$3");
break;
default : compress = false; break;
}
}
if (compress){
input += suppliment;
encoded = UPCE(input);
return encoded;
}
compress = false;
// left char set
charSet[0] = "0001101";
charSet[1] = "0011001";
charSet[2] = "0010011";
charSet[3] = "0111101";
charSet[4] = "0100011";
charSet[5] = "0110001";
charSet[6] = "0101111";
charSet[7] = "0111011";
charSet[8] = "0110111";
charSet[9] = "0001011";
// right char set
charSet[10] = "1110010";
charSet[11] = "1100110";
charSet[12] = "1101100";
charSet[13] = "1000010";
charSet[14] = "1011100";
charSet[15] = "1001110";
charSet[16] = "1010000";
charSet[17] = "1000100";
charSet[18] = "1001000";
charSet[19] = "1110100";
if (input.length == 11){
for (var i = 0; i < input.length; i++){
if (i % 2 == 0){
oddSum += parseInt(input.substr(i, 1));
}else{
evenSum += parseInt(input.substr(i, 1));
}
}
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10);
if (checkDigit == 10) checkDigit = 0;
input += checkDigit.toString();
}else{
checkDigit = parseInt(input.substr(11, 1));
}
for (var i = 0; i < 12; i++){
parity = (i > 5 ? 1 : 0) * 10;
parity += parseInt(input.substr(i, 1));
encoded += charSet[parity];
if (i == 5) encoded += center;
}
encoded = guard + encoded + guard + supplement;
}
function UPCE(input){
var charSet = new Array();
var encodeSupplement = false;
var evenSum = 0;
var exp = new RegExp("^0{1}[0-9]+$");
var leftGuard = "101";
var oddSum = 0;
var originalNumber = "";
var parity = 0;
var parityMask = "";
var rightGuard = "010101";
var supplement = "";
if (!exp.test(input)) return "";
switch (input.length){
case 7 :
case 9 :
case 12: if (input.length > 7){
supplement = input.substr(7, input.length - 7);
input = input.substr(0, 7);
encodeSupplement = true;
}
break;
case 8 :
case 10:
case 13: if (input.length > 8){
supplement = input.substr(8, input.length - 8);
input = input.substr(0, 8);
encodeSupplement = true;
}
break;
default: return ""; break;
}
if (encodeSupplement) suppliment = EncodeSupplement(supplement);
// even parity
charSet[0] = "0100111";
charSet[1] = "0110011";
charSet[2] = "0011011";
charSet[3] = "0100001";
charSet[4] = "0011101";
charSet[5] = "0111001";
charSet[6] = "0000101";
charSet[7] = "0010001";
charSet[8] = "0001001";
charSet[9] = "0010111";
// odd parity
charSet[10] = "0001101";
charSet[11] = "0011001";
charSet[12] = "0010011";
charSet[13] = "0111101";
charSet[14] = "0100011";
charSet[15] = "0110001";
charSet[16] = "0101111";
charSet[17] = "0111011";
charSet[18] = "0110111";
charSet[19] = "0001011";
// parity masks
charSet[20] = "000111";
charSet[21] = "001011";
charSet[22] = "001101";
charSet[23] = "001110";
charSet[24] = "010011";
charSet[25] = "011001";
charSet[26] = "011100";
charSet[27] = "010101";
charSet[28] = "010110";
charSet[29] = "011010";
if (input.length == 7){
// reverse engineer the precompressed data to get check digit
// see: http://www.uc-council.org/reflib/01302/d36-2.htm
switch (parseInt(input.substr(6, 1))){
case 0 :
case 1 :
case 2 : originalNumber = input.substr(0, 3) +
input.substr(input.length -1, 1) +
"0000" + input.substr(3, 3);
break;
case 3 : originalNumber = input.substr(0, 4) +
"00000" + input.substr(4, 2);
break;
case 4 : originalNumber = input.substr(0, 5) +
"00000" + input.substr(5, 1);
break;
default: originalNumber = input.substr(0, 6) +
"0000" + input.substr(input.length -1, 1);
break;
}
for (var i = 0; i < 11; i++){
if (i % 2 == 0){
oddSum += parseInt(originalNumber.substr(i, 1));
}else{
evenSum += parseInt(originalNumber.substr(i, 1));
}
}
checkDigit = 10 - ((evenSum + (oddSum * 3)) % 10);
if (checkDigit == 10) checkDigit = 0;
}else{
checkDigit = parseInt(input.substr(input.length - 1, 1));
input = input.substr(0, 7);
}
parityMask = charSet[checkDigit + 20];
input = input.substr(1, 6);
for (var i = 0; i < input.length; i++){
parity = (parseInt(parityMask.substr(i, 1)) * 10);
parity += parseInt(input.substr(i, 1));
encoded += charSet[parity];
}
encoded = leftGuard + encoded + rightGuard + supplement;
return encoded;
}