﻿var PDFObject = function (obj) {

    if (!obj || !obj.url) { return false; }

    var pdfobjectversion = "1.2",
    //Set reasonable defaults
		id = obj.id || false,
		width = obj.width || "100%",
		height = obj.height || "100%",
		pdfOpenParams = obj.pdfOpenParams,
		url,
		pluginTypeFound;


    /* ----------------------------------------------------
    Supporting functions
    ---------------------------------------------------- */

    //Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
    var hasReaderActiveX = function () {

        var axObj = null;

        if (window.ActiveXObject) {

            axObj = new ActiveXObject("AcroPDF.PDF");

            //If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
            if (!axObj) {
                axObj = new ActiveXObject("PDF.PdfCtrl");
            }

            //If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true
            if (axObj !== null) {
                return true;
            }

        }

        //If you got to this point, there's no ActiveXObject for PDFs
        return false;

    };



    //Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers
    var hasReader = function () {

        var i,
			n = navigator.plugins,
			count = n.length,
			regx = /Adobe Reader|Adobe PDF|Acrobat/gi;

        for (i = 0; i < count; i++) {
            if (regx.test(n[i].name)) {
                return true;
            }
        }

        return false;

    };


    //Detects unbranded PDF support
    var hasGeneric = function () {
        var plugin = navigator.mimeTypes["application/pdf"];
        return (plugin && plugin.enabledPlugin);
    };


    //Determines what kind of PDF support is available: Adobe or generic
    var pluginFound = function () {

        var type = null;

        if (hasReader() || hasReaderActiveX()) {

            type = "Adobe";

        } else if (hasGeneric()) {

            type = "generic";

        }

        return type;

    };


    //If setting PDF to fill page, need to handle some CSS first
    var setCssForFullWindowPdf = function () {

        var html = document.getElementsByTagName("html");
        if (!html) { return false; }

        var html_style = html[0].style,
			body_style = document.body.style;

        html_style.height = "100%";
        html_style.overflow = "hidden";
        body_style.margin = "0";
        body_style.padding = "0";
        body_style.height = "100%";
        body_style.overflow = "hidden";

    };


    //Creating a querystring for using PDF Open parameters when embedding PDF
    var buildQueryString = function (pdfParams) {

        var string = "",
			prop;

        if (!pdfParams) { return string; }

        for (prop in pdfParams) {

            if (pdfParams.hasOwnProperty(prop)) {

                string += prop + "=";

                if (prop === "search") {

                    string += encodeURI(pdfParams[prop]);

                } else {

                    string += pdfParams[prop];

                }

                string += "&";

            }

        }

        //Remove last ampersand
        return string.slice(0, string.length - 1);

    };


    //Simple function for returning values from PDFObject
    var get = function (prop) {

        var value = null;

        switch (prop) {
            case "url": value = url; break;
            case "id": value = id; break;
            case "width": value = width; break;
            case "height": value = height; break;
            case "pdfOpenParams": value = pdfOpenParams; break;
            case "pluginTypeFound": value = pluginTypeFound; break;
            case "pdfobjectversion": value = pdfobjectversion; break;
        }

        return value;

    };


    /* ----------------------------------------------------
    PDF Embedding functions
    ---------------------------------------------------- */


    var embed = function (targetID) {

        if (!pluginTypeFound) { return false; }

        var targetNode = null;

        if (targetID) {

            //Allow users to pass an element OR an element's ID
            targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID : document.getElementById(targetID);

            //Ensure target element is found in document before continuing
            if (!targetNode) { return false; }

        } else {

            targetNode = document.body;
            setCssForFullWindowPdf();
            width = "100%";
            height = "100%";

        }

        targetNode.innerHTML = '<object	data="' + url + '" type="application/pdf" width="' + width + '" height="' + height + '"></object>';

        return targetNode.getElementsByTagName("object")[0];

    };

    //The hash (#) prevents odd behavior in Windows
    //Append optional Adobe params for opening document
    url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
    pluginTypeFound = pluginFound();

    this.get = function (prop) { return get(prop); };
    this.embed = function (id) { return embed(id); };

    return this;

};
