summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/shortcodes/js/recipes-printthis.js')
-rw-r--r--plugins/jetpack/modules/shortcodes/js/recipes-printthis.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/shortcodes/js/recipes-printthis.js b/plugins/jetpack/modules/shortcodes/js/recipes-printthis.js
new file mode 100644
index 00000000..a8a52555
--- /dev/null
+++ b/plugins/jetpack/modules/shortcodes/js/recipes-printthis.js
@@ -0,0 +1,170 @@
+/*
+* printThis v1.3
+* @desc Printing plug-in for jQuery
+* @author Jason Day
+*
+* Resources (based on) :
+* jPrintArea: http://plugins.jquery.com/project/jPrintArea
+* jqPrint: https://github.com/permanenttourist/jquery.jqprint
+* Ben Nadal: http://www.bennadel.com/blog/1591-Ask-Ben-Print-Part-Of-A-Web-Page-With-jQuery.htm
+*
+* Dual licensed under the MIT and GPL licenses:
+* http://www.opensource.org/licenses/mit-license.php
+* http://www.gnu.org/licenses/gpl.html
+*
+* (c) Jason Day 2013
+*
+* Usage:
+*
+* $("#mySelector").printThis({
+* debug: false, * show the iframe for debugging
+* importCSS: true, * import page CSS
+* printContainer: true, * grab outer container as well as the contents of the selector
+* loadCSS: "path/to/my.css", * path to additional css file
+* pageTitle: "", * add title to print page
+* removeInline: false, * remove all inline styles from print elements
+* printDelay: 333, * variable print delay S. Vance
+* header: null * prefix to html
+* });
+*
+* Notes:
+* - the loadCSS will load additional css (with or without @media print) into the iframe, adjusting layout
+*/
+/* jshint onevar: false, smarttabs: true, devel: true */
+;(function ($) {
+ var opt;
+ $.fn.printThis = function (options) {
+ opt = $.extend({}, $.fn.printThis.defaults, options);
+ var $element = this instanceof jQuery ? this : $(this);
+
+ var strFrameName = 'printThis-' + (new Date()).getTime();
+
+ if(window.location.hostname !== document.domain && navigator.userAgent.match(/msie/i)){
+ // Ugly IE hacks due to IE not inheriting document.domain from parent
+ // checks if document.domain is set by comparing the host name against document.domain
+ var iframeContents = '<head><script>document.domain=\\\'' + document.domain + '\\\';</script></head><body></body>';
+ var iframeSrc = 'data:text/html;charset=utf-8,' + encodeURI(iframeContents);
+ var printI= document.createElement('iframe');
+ printI.name = 'printIframe';
+ printI.id = strFrameName;
+ printI.className = 'MSIE';
+ document.body.appendChild(printI);
+ printI.src = iframeSrc;
+
+ } else {
+ // other browsers inherit document.domain, and IE works if document.domain is not explicitly set
+ var $frame = $('<iframe id="' + strFrameName +'" name="printIframe" />');
+ $frame.appendTo('body');
+ }
+
+
+ var $iframe = $('#' + strFrameName);
+
+ // show frame if in debug mode
+ if (!opt.debug) {
+ $iframe.css({
+ position: 'absolute',
+ width: '0px',
+ height: '0px',
+ left: '-600px',
+ top: '-600px'
+ });
+ }
+
+
+ // $iframe.ready() and $iframe.load were inconsistent between browsers
+ setTimeout ( function () {
+
+ var $doc = $iframe.contents();
+
+ // import page stylesheets
+ if (opt.importCSS) {
+ $('link[rel=stylesheet]').each(function () {
+ var href = $(this).attr('href');
+ if (href) {
+ var media = $(this).attr('media') || 'all';
+ $doc.find('head').append('<link type="text/css" rel="stylesheet" href="' + href + '" media="' + media + '">');
+ }
+ });
+ }
+
+ //add title of the page
+ if (opt.pageTitle) {
+ $doc.find('head').append('<title>' + opt.pageTitle + '</title>');
+ }
+
+ // import additional stylesheet
+ if (opt.loadCSS) {
+ $doc.find('head').append('<link type="text/css" rel="stylesheet" href="' + opt.loadCSS + '">');
+ }
+
+ // print header
+ if (opt.header) {
+ $doc.find('body').append(opt.header);
+ }
+
+ // grab $.selector as container
+ if (opt.printContainer) {
+ $doc.find('body').append($element.outer());
+ }
+
+ // otherwise just print interior elements of container
+ else {
+ $element.each(function () {
+ $doc.find('body').append($(this).html());
+ });
+ }
+
+ // remove inline styles
+ if (opt.removeInline) {
+ // $.removeAttr available jQuery 1.7+
+ if ($.isFunction($.removeAttr)) {
+ $doc.find('body *').removeAttr('style');
+ } else {
+ $doc.find('body *').attr('style', '');
+ }
+ }
+
+ setTimeout(function () {
+ if($iframe.hasClass('MSIE')){
+ // check if the iframe was created with the ugly hack
+ // and perform another ugly hack out of neccessity
+ window.frames.printIframe.focus();
+ $doc.find('head').append('<script> window.print(); </script>');
+ } else {
+ // proper method
+ $iframe[0].contentWindow.focus();
+ $iframe[0].contentWindow.print();
+ }
+
+ $element.trigger( 'done');
+ //remove iframe after print
+ if (!opt.debug) {
+ setTimeout(function () {
+ $iframe.remove();
+ }, 1000);
+ }
+
+ }, opt.printDelay);
+
+ }, 333 );
+
+ };
+
+ // defaults
+ $.fn.printThis.defaults = {
+ debug: false, // show the iframe for debugging
+ importCSS: false, // import parent page css
+ printContainer: true, // print outer container/$.selector
+ loadCSS: '', // load an additional css file
+ pageTitle: '', // add title to print page
+ removeInline: false, // remove all inline styles
+ printDelay: 333, // variable print delay S. Vance
+ header: null // prefix to html
+ };
+
+ // $.selector container
+ jQuery.fn.outer = function () {
+ return $($('<div></div>').html(this.clone())).html();
+ };
+})(jQuery);