jQuery.fn.print = function(){
  // NOTE: We are trimming the jQuery collection down to the first element in the collection.
  if (!this.size()) {
    return;
  }
  if (this.size() > 1) {
    this.eq(0).print();
    return;
  }

  // Create an print iFrame with random name
  var strFrameName = ("printer-" + (new Date()).getTime());
  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><body><head><title>" + document.title + "</title>");
  objDoc.write(jStyleDiv.html());
  objDoc.write("</head>");
  objDoc.write(this.html());
  objDoc.write("</body></html>");
  objDoc.close();

  // Print the document
  objFrame.focus();
  objFrame.print();

  // Have the frame remove itself in about a minute so that we don't build up too many of these frames.
  setTimeout(function(){ jFrame.remove(); }, (60*1000));
}