| // <--- --------------------------------------------------------------------------------------- ---- | 
|      | 
| //     Blog Entry: | 
| //     Ask Ben: Print Part Of A Web Page With jQuery | 
|      | 
| //     Author: | 
| //     Ben Nadel / Kinky Solutions | 
|      | 
| //     Link: | 
| //     http://www.bennadel.com/index.cfm?event=blog.view&id=1591 | 
|      | 
| //     Date Posted: | 
| //     May 21, 2009 at 9:10 PM | 
|      | 
| // ---- --------------------------------------------------------------------------------------- ---> | 
|   | 
|   | 
| // Create a jquery plugin that prints the given element. | 
| jQuery.fn.print = function(){ | 
|     // NOTE: We are trimming the jQuery collection down to the | 
|     // first element in the collection. | 
|     if (this.size() > 1){ | 
|         this.eq( 0 ).print(); | 
|         return; | 
|     } else if (!this.size()){ | 
|         return; | 
|     } | 
|   | 
|     var chart = $(this).closest('div.quintile-outer-container').find('div.jqplot-target'); | 
|     // var imgelem = chart.jqplotToImageElem(); | 
|     var imageElemStr = chart.jqplotToImageElemStr(); | 
|     // var statsrows = $(this).closest('div.quintile-outer-container').find('table.stats-table tr'); | 
|     var statsTable = $('<div></div>').append($(this).closest('div.quintile-outer-container').find('table.stats-table').clone()); | 
|     // var rowstyles = window.getComputedStyle(statsrows.get(0), ''); | 
|   | 
|     // ASSERT: At this point, we know that the current jQuery | 
|     // collection (as defined by THIS), contains only one | 
|     // printable element. | 
|   | 
|     // Create a random name for the print frame. | 
|     var strFrameName = ("printer-" + (new Date()).getTime()); | 
|   | 
|     // Create an iFrame with the new name. | 
|     var jFrame = $( "<iframe name='" + strFrameName + "'>" ); | 
|   | 
|     // Hide the frame (sort of) and attach to the body. | 
|     jFrame | 
|         .css( "width", "1px" ) | 
|         .css( "height", "1px" ) | 
|         .css( "position", "absolute" ) | 
|         .css( "left", "-9999px" ) | 
|         .appendTo( $( "body:first" ) ) | 
|     ; | 
|   | 
|     // Get a FRAMES reference to the new frame. | 
|     var objFrame = window.frames[ strFrameName ]; | 
|   | 
|     // Get a reference to the DOM in the new frame. | 
|     var objDoc = objFrame.document; | 
|   | 
|     // Grab all the style tags and copy to the new | 
|     // document so that we capture look and feel of | 
|     // the current document. | 
|   | 
|     // Create a temp document DIV to hold the style tags. | 
|     // This is the only way I could find to get the style | 
|     // tags into IE. | 
|     var jStyleDiv = $( "<div>" ).append( | 
|         $( "style" ).clone() | 
|         ); | 
|   | 
|     // Write the HTML for the document. In this, we will | 
|     // write out the HTML of the current element. | 
|     objDoc.open(); | 
|     objDoc.write( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" ); | 
|     objDoc.write( "<html>" ); | 
|     objDoc.write( "<body>" ); | 
|     objDoc.write( "<head>" ); | 
|     objDoc.write( "<title>" ); | 
|     objDoc.write( document.title ); | 
|     objDoc.write( "</title>" ); | 
|     objDoc.write( jStyleDiv.html() ); | 
|     objDoc.write( "</head>" ); | 
|   | 
|     // Typically, would just write out the html.     | 
|     // objDoc.write( this.html() ); | 
|   | 
|     // We need to do specific manipulation for kcp quintiles. | 
|     objDoc.write( '<div class="quintile-outer-container ui-widget ui-corner-all"> \ | 
|     <div class="quintile-content ui-widget-content ui-corner-bottom"> \ | 
|         <table class="quintile-display"> \ | 
|             <tr> \ | 
|                 <td class="chart-cell">'); | 
|   | 
|     objDoc.write(imageElemStr); | 
|      | 
|     objDoc.write('</td> <td class="stats-cell">'); | 
|   | 
|     objDoc.write(statsTable.html()); | 
|   | 
|     objDoc.write('</td></tr></table></div></div>'); | 
|   | 
|     objDoc.write( "</body>" ); | 
|     objDoc.write( "</html>" ); | 
|     objDoc.close(); | 
|   | 
|      //  | 
|     // When the iframe is completely loaded, print it. | 
|     // This seemed worked in IE 9, but caused problems in FF. | 
|     // | 
|     // $(objFrame).load(function() { | 
|     //     objFrame.focus(); | 
|     //     objFrame.print(); | 
|     // }); | 
|   | 
|     // | 
|     // This works in all supported browsers. | 
|     // Note, might have to adjust time. | 
|     // | 
|     setTimeout( | 
|         function() { | 
|             objFrame.focus(); | 
|             objFrame.print(); | 
|         }, 750); | 
|   | 
|   | 
|     // Have the frame remove itself in about a minute so that | 
|     // we don't build up too many of these frames. | 
|     setTimeout( | 
|         function(){ | 
|             jFrame.empty(); | 
|             jFrame.remove(); | 
|         }, | 
|         (60 * 1000) | 
|         ); | 
| } |