/*
FPDF library for ASP can be downloaded from:
http://www.aspxnet.it/public/default.asp
INFORMATIONS:
Translated by: Jeremy
Author: Olivier
License: Freeware
DESCRIPTION:
This script implements EAN13 and UPC-A barcodes (the second being a particular case of the first one). 
Bars are drawn directly in the PDF (no image is generated)
function EAN13(x,y,barcode,h,w)
-x = x coordinate to start drawing the barcode
-y = y coordinate to start drawing the barcode
-barcode = code to write (must be all numeric)
-h = height of the bar
-w = the minimum width of individual bar
function UPC_A(x,y,barcode,h,w)
Same parameters
An EAN13 barcode is made up of 13 digits, UPC-A of 12 (leading zeroes are added if necessary). 
The last digit is a check digit; if it's not supplied or if it is incorrect, it will be automatically computed.
USAGE:
Copy all of this text and save it in a file called barcode.ext file under fpdf/extends folder
EXAMPLE:
Set pdf=CreateJsObject("FPDF")
pdf.CreatePDF "P","mm","letter"
pdf.SetPath("fpdf/")
pdf.LoadExtension("barcode")
pdf.Open()
pdf.AddPage()
'set the fill color to black
pdf.setfillcolor 0,0,0
pdf.UPC_A 80,40,"123456789012",16,0.35
pdf.Close()
pdf.NewOutput "" , true, "test.pdf"
*/
this.EAN13=function (x,y,barcode,h,w)
{
    return this.Barcode(x,y,barcode,h,w,13);
};
this.UPC_A=function (x,y,barcode,h,w)
{
    return this.Barcode(x,y,barcode,h,w,12);
};
function GetCheckDigit(barCode)
{
bc = barCode.replace(/[^0-9]+/g,'');
    total = 0;
    //Get Odd Numbers
    for (i=bc.length-1; i=0; i=i-2) 
    {
        total = total + parseInt(bc.substr(i,1));
    }
    //Get Even Numbers
    for (i=bc.length-2; i=0; i=i-2) 
    {
        temp = parseInt(bc.substr(i,1)) * 2;
        if (temp  9) {
        tens = Math.floor(temp/10);
        ones = temp - (tens*10);
        temp = tens + ones;
        }
        total = total + temp;
    }
    //Determine the checksum
    modDigit = (10 - total % 10) % 10;
    return modDigit.toString();
}
//Test validity of check digit
function TestCheckDigit(barcode)
{
    var cd=GetCheckDigit(barcode.substring(0,barcode.length-1));
    return cd==parseInt(barcode.substring(barcode.length-1,1));
}
this.Barcode=function Barcode(x,y,barcode,h,w,len)
{
    //Padding
    while(barcode.length < len-1)
    {
        barcode = '0' + barcode;
    }
    if(len==12) {barcode='0' + barcode;}
    //Add or control the check digit
    if(barcode.length==12)
    {
        barcode += GetCheckDigit(barcode);
    }
    else
    {   //if the check digit is incorrect, fix the check digit.
        if(!TestCheckDigit(barcode))
        {
            barcode = barcode.substring(0,barcode.length-1) + GetCheckDigit(barcode.substring(0,barcode.length-1));
        }
    }
    //Convert digits to bars
    var codes=[['0001101','0011001','0010011','0111101','0100011','0110001','0101111','0111011','0110111','0001011'],
        ['0100111','0110011','0011011','0100001','0011101','0111001','0000101','0010001','0001001','0010111'],
        ['1110010','1100110','1101100','1000010','1011100','1001110','1010000','1000100','1001000','1110100']
        ];
    var parities=[[0,0,0,0,0,0],
        [0,0,1,0,1,1],
        [0,0,1,1,0,1],
        [0,0,1,1,1,0],
        [0,1,0,0,1,1],
        [0,1,1,0,0,1],
        [0,1,1,1,0,0],
        [0,1,0,1,0,1],
        [0,1,0,1,1,0],
        [0,1,1,0,1,0]
        ];
    var code='101';
    var p=parities[parseInt(barcode.substr(0,1))];
    var i;
    for(i=1;i<=6;i++)
    {
        code+= codes[p[i-1]][parseInt(barcode.substr(i,1))]; 
    }
    code+='01010';
    for(i=7;i<=12;i++)
    {
        code+= codes[2][parseInt(barcode.substr(i,1))]; 
    }
    code+='101';
    //Draw bars
    for(i=0;i<code.length;i++)
    {
        if(code.substr(i,1)=='1')
        {
            this.Rect(x+i*w,y,w,h,'F');
        }
    }
    //Print text uder barcode. 
    this.SetFont('Arial','',12);
    //Set the x so that the font is centered under the barcode
    this.Text(x+parseInt(0.5*barcode.length)*w,y+h+11/this.k,barcode.substr(barcode.length-len,len));
}