﻿/*
* Print Element Plugin 0.9
*
* Copyright (c) 2009 Erik Zaadi
*
* Inspired by PrintArea (http://plugins.jquery.com/project/PrintArea) and
* http://stackoverflow.com/questions/472951/how-do-i-print-an-iframe-from-javascript-in-safari-chrome
*
* $Id: jquery.printElement.js PENDING ID ErikZ $
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*/
(function($) {
    $.fn.printElement = function(options) { var mainOptions = $.extend({}, $.fn.printElement.defaults, options); $("[id^='printElement_']").remove(); return this.each(function() { var opts = $.meta ? $.extend({}, mainOptions, $this.data()) : mainOptions; _printElement($(this), opts); }); }; $.fn.printElement.defaults = { printMode: 'iframe', pageTitle: '', overrideElementCSS: [], printBodyOptions: { styleToAdd: 'padding:10px;margin:10px;', classNameToAdd: '' }, leaveOpen: false, iframeElementOptions: { styleToAdd: 'position:absolute;width:0px;height:0px;', classNameToAdd: ''} }; function _printElement(element, opts) {
        var $elementToPrint = $(element); var html = _getMarkup($elementToPrint, opts); var popupOrIframe = null; var documentToWriteTo = null; if (opts.printMode.toLowerCase() == 'popup') { popupOrIframe = window.open('', 'printElementWindow', 'width=650,height=440,scrollbars=yes'); documentToWriteTo = popup.document; }
        else { var printElementID = "printElement_" + (Math.random() * 99999).toString(); iframe = document.createElement('IFRAME'); $(iframe).attr({ style: opts.iframeElementOptions.styleToAdd, id: printElementID, className: opts.iframeElementOptions.classNameToAdd }); document.body.appendChild(iframe); documentToWriteTo = iframe.contentWindow.document; var iframe = document.frames ? document.frames[printElementID] : document.getElementById(printElementID); popupOrIframe = iframe.contentWindow || iframe; }
        documentToWriteTo.open(); documentToWriteTo.write(html); documentToWriteTo.close(); popupOrIframe.focus();
    }; function _getMarkup(element, opts) {
        var $elementToPrint = $(element); var html = new Array(); html.push('<html><head><title>' + opts.pageTitle + '</title>'); if (opts.overrideElementCSS && opts.overrideElementCSS.length > 0) { for (var x = 0; x < opts.overrideElementCSS.length; x++) { html.push('<link type="text/css" rel="stylesheet" href="' + opts.overrideElementCSS[x] + '" >'); } }
        else { $(document).find("link ").filter(function() { return $(this).attr("rel").toLowerCase() == "stylesheet"; }).each(function() { html.push('<link type="text/css" rel="stylesheet" href="' + $(this).attr("href") + '" >'); }); }
        html.push('</head><body onload="printPage();" style="' + opts.printBodyOptions.styleToAdd + '" class="' + opts.printBodyOptions.classNameToAdd + '">'); html.push('<div class="' + $elementToPrint.attr("class") + '">' + $elementToPrint.html() + '</div>'); html.push('<script type="text/javascript">function printPage() { focus();print();' + (opts.leaveOpen ? '' : 'close();') + '}</script></body></html>'); return html.join('');
    };
})(jQuery);
