/*
    PDFObject v1.2.20111123
    https://github.com/pipwerks/PDFObject
    Copyright (c) Philip Hutchison
    MIT-style license: http://pipwerks.mit-license.org/
*/

/*jslint browser: true, sloppy: true, white: true, plusplus: true */
/*global ActiveXObject, window */

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,

        //declare functions
        createAXO,
        hasReaderActiveX,
        hasReader,
        hasGeneric,
        pluginFound,
        setCssForFullWindowPdf,
        buildQueryString,
        get,
        embed;


    /* ----------------------------------------------------
       Supporting functions
       ---------------------------------------------------- */

    createAXO = function (type){
        var ax;
        try {
            ax = new ActiveXObject(type);
        } catch (e) {
            //ensure ax remains null
            ax = null;
        }
        return ax;
    };

    //Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
    hasReaderActiveX = function (){

        var axObj = null;
        
         try {
            axObj = new ActiveXObject("AcroPDF.PDF");
        } catch (e) {
            // Adobe installed
        }

        if (axObj != null || window.ActiveXObject) {

            axObj = createAXO("AcroPDF.PDF");

            //If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
            if(!axObj){ axObj = createAXO("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
    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
    hasGeneric = function (){
        var plugin = navigator.mimeTypes["application/pdf"];
        return (plugin && plugin.enabledPlugin);
    };


    //Determines what kind of PDF support is available: Adobe or generic
    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
    setCssForFullWindowPdf = function (){

        var html = document.getElementsByTagName("html"),
            html_style,
            body_style;

        if(!html){ return false; }

        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
    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
    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
       ---------------------------------------------------- */


    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); };
    this.pdfobjectversion = pdfobjectversion;

    return this;

};