/// <reference path="jspdf.d.ts" />

// From: https://mrrio.github.io/jsPDF/examples/basic.html

function test_simple_two_page_document() {
    var doc = new jsPDF();
    doc.text(20, 20, 'Hello world!');
    doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');
    doc.addPage();
    doc.text(20, 20, 'Do you like that?');
    doc.save('Test.pdf');
}

function test_landscape() {
    var doc = new jsPDF('landscape');
    doc.text(20, 20, 'Hello landscape world!');
    doc.save('Test.pdf');
}

function test_metadata() {
    var doc = new jsPDF();
    doc.text(20, 20, 'This PDF has a title, subject, author, keywords and a creator.');
    doc.setProperties({
        title: 'Title',
        subject: 'This is the subject',
        author: 'James Hall',
        keywords: 'generated, javascript, web 2.0, ajax',
        creator: 'MEEE'
    });
    doc.save('Test.pdf');
}

function test_user_input() {
    var doc = new jsPDF();
    doc.text(20, 20, 'This PDF has a title, subject, author, keywords and a creator.');
    doc.setProperties({
        title: 'Title',
        subject: 'This is the subject',
        author: 'James Hall',
        keywords: 'generated, javascript, web 2.0, ajax',
        creator: 'MEEE'
    });
    doc.save('Test.pdf');
}

function test_font_sizes() {
    var doc = new jsPDF();
    doc.setFontSize(22);
    doc.text(20, 20, 'This is a title');
    doc.setFontSize(16);
    doc.text(20, 30, 'This is some normal sized text underneath.');
    doc.save('Test.pdf');
}

function test_font_types() {
    var doc = new jsPDF();
    doc.text(20, 20, 'This is the default font.');
    doc.setFont("courier");
    doc.text(20, 30, 'This is courier normal.');
    doc.setFont("times");
    doc.setFontType("italic");
    doc.text(20, 40, 'This is times italic.');
    doc.setFont("helvetica");
    doc.setFontType("bold");
    doc.text(20, 50, 'This is helvetica bold.');
    doc.setFont("courier");
    doc.setFontType("bolditalic");
    doc.text(20, 60, 'This is courier bolditalic.');
    doc.save('Test.pdf');
}

function test_text_colors() {
    var doc = new jsPDF();
    doc.setTextColor(100);
    doc.text(20, 20, 'This is gray.');
    doc.setTextColor(150);
    doc.text(20, 30, 'This is light gray.');
    doc.setTextColor(255, 0, 0);
    doc.text(20, 40, 'This is red.');
    doc.setTextColor(0, 255, 0);
    doc.text(20, 50, 'This is green.');
    doc.setTextColor(0, 0, 255);
    doc.text(20, 60, 'This is blue.');
    doc.save('Test.pdf');
}

function test_font_metrics_based_line_sizing_split() {
    var pdf = new jsPDF('p', 'in', 'letter');
    var sizes:number[] = [12, 16, 20];
    var fonts = [['Times', 'Roman'], ['Helvetica', ''], ['Times', 'Italic']];
    var font:string[];
    var size:number;
    var lines:any[];
    var verticalOffset = 0.5; // inches on a 8.5 x 11 inch sheet.
    var loremipsum = 'Lorem ipsum dolor sit amet, ...';
    for (var i in fonts) {
        if (fonts.hasOwnProperty(i)) {
            font = fonts[i];
            size = sizes[i];
            lines = pdf.setFont(font[0], font[1])
                .setFontSize(size)
                .splitTextToSize(loremipsum, 7.5);
            pdf.text(0.5, verticalOffset + size / 72, lines);
            verticalOffset += (lines.length + 0.5) * size / 72
        }
    }
    pdf.save('Test.pdf');
}

function test_from_html() {
    var pdf = new jsPDF('p', 'pt', 'letter')
        , source = document.getElementById('#fromHTMLtestdiv')
        , specialElementHandlers = {
        '#bypassme': function (element:HTMLElement, renderer:any) {
            return true
        }
    };
    var margins = {
        top: 80,
        bottom: 60,
        left: 40,
        width: 522
    };

    pdf.fromHTML(
        source // HTML string or DOM elem ref.
        , margins.left // x coord
        , margins.top // y coord
        , {
            'width': margins.width // max width of content on PDF
            , 'elementHandlers': specialElementHandlers
        },
        function (dispose:any) {
            pdf.save('Test.pdf');
        },
        margins
    )
}

function test_rect_squares() {
    var doc = new jsPDF();
    doc.rect(20, 20, 10, 10); // empty square
    doc.rect(40, 20, 10, 10, 'F'); // filled square
    doc.setDrawColor(255, 0, 0);
    doc.rect(60, 20, 10, 10); // empty red square
    doc.setDrawColor(255, 0, 0);
    doc.rect(80, 20, 10, 10, 'FD'); // filled square with red borders
    doc.setDrawColor(0);
    doc.setFillColor(255, 0, 0);
    doc.rect(100, 20, 10, 10, 'F'); // filled red square
    doc.setDrawColor(0);
    doc.setFillColor(255, 0, 0);
    doc.rect(120, 20, 10, 10, 'FD'); // filled red square with black borders
    doc.setDrawColor(0);
    doc.setFillColor(255, 255, 255);
    doc.roundedRect(140, 20, 10, 10, 3, 3, 'FD'); //  Black sqaure with rounded corners
    doc.save('Test.pdf');
}

function test_lines() {
    var doc = new jsPDF();
    doc.line(20, 20, 60, 20); // horizontal line
    doc.setLineWidth(0.5);
    doc.line(20, 25, 60, 25);
    doc.setLineWidth(1);
    doc.line(20, 30, 60, 30);
    doc.setLineWidth(1.5);
    doc.line(20, 35, 60, 35);
    doc.setDrawColor(255, 0, 0); // draw red lines
    doc.setLineWidth(0.1);
    doc.line(100, 20, 100, 60); // vertical line
    doc.setLineWidth(0.5);
    doc.line(105, 20, 105, 60);
    doc.setLineWidth(1);
    doc.line(110, 20, 110, 60);
    doc.setLineWidth(1.5);
    doc.line(115, 20, 115, 60);
    doc.save('Test.pdf');
}

function test_circles_ellipses() {
    var doc = new jsPDF();
    doc.ellipse(40, 20, 10, 5);
    doc.setFillColor(0, 0, 255);
    doc.ellipse(80, 20, 10, 5, 'F');
    doc.setLineWidth(1);
    doc.setDrawColor(0);
    doc.setFillColor(255, 0, 0);
    doc.circle(120, 20, 5, 'FD');
    doc.save('Test.pdf');
}

function test_triangles() {
    var doc = new jsPDF();
    doc.triangle(60, 100, 60, 120, 80, 110, 'FD');
    doc.setLineWidth(1);
    doc.setDrawColor(255, 0, 0);
    doc.setFillColor(0, 0, 255);
    doc.triangle(100, 100, 110, 100, 120, 130, 'FD');
    doc.save('My file.pdf');
}

function test_images() {
    var getImageFromUrl = function (url:string, callback:Function) {
        var img = new Image();
        img.onerror = function () {
            alert('Cannot load image: "' + url + '"');
        };
        img.onload = function () {
            callback(img);
        };
        img.src = url;
    };

    var createPDF = function (imgData:string) {
        var doc = new jsPDF();
        doc.addImage(imgData, 'JPEG', 10, 10, 50, 50, 'monkey'); // Cache the image using the alias 'monkey'
        doc.addImage('monkey', 70, 10, 100, 120); // use the cached 'monkey' image, JPEG is optional regardless
        doc.addImage({
            imageData: imgData,
            angle: -20,
            x: 10,
            y: 78,
            w: 45,
            h: 58
        });
        doc.output('datauri');
    };
    getImageFromUrl('thinking-monkey.jpg', createPDF);
}

function test_add_html() {
    var pdf = new jsPDF('p', 'pt', 'a4');
    pdf.addHTML(document.body, function () {
        var string = pdf.output('datauristring');
        document.getElementsByClassName('preview-pane')[0].setAttribute('src', string);
    });
}
