// <--- --------------------------------------------------------------------------------------- ---- 
 | 
     
 | 
//     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) 
 | 
        ); 
 | 
} 
 |