extensions/net.sf.basedb.print/trunk/resources/scripts/print.js

Code
Comments
Other
Rev Date Author Line
1870 20 Feb 13 nicklas 1
1870 20 Feb 13 nicklas 2 var Print = function()
1870 20 Feb 13 nicklas 3 {
1870 20 Feb 13 nicklas 4   var print = {};
1870 20 Feb 13 nicklas 5   var internal = {};
1870 20 Feb 13 nicklas 6   
2208 31 Jan 14 nicklas 7   print.initPage = function()
2208 31 Jan 14 nicklas 8   {
2208 31 Jan 14 nicklas 9     var pageId = Doc.getPageId();
2208 31 Jan 14 nicklas 10     if (pageId == 'print-window')
2208 31 Jan 14 nicklas 11     {
2208 31 Jan 14 nicklas 12       Events.addEventHandler('orientation-landscape', 'change', internal.orientationOnChange);
2208 31 Jan 14 nicklas 13       Events.addEventHandler('print-button', 'click', internal.doPrint);
2208 31 Jan 14 nicklas 14       window.opener.Print.finalizeTablePrint(window);
2208 31 Jan 14 nicklas 15     }
2208 31 Jan 14 nicklas 16     else
2208 31 Jan 14 nicklas 17     {
2208 31 Jan 14 nicklas 18       Buttons.addClickHandler('net.sf.basedb.print.print-button', print.tablePrint);
2208 31 Jan 14 nicklas 19     }
2208 31 Jan 14 nicklas 20   }
2208 31 Jan 14 nicklas 21   
1870 20 Feb 13 nicklas 22   /*
1870 20 Feb 13 nicklas 23     Open a popup window giving a print preview of an item-listing table.
1870 20 Feb 13 nicklas 24     Several adjustments are made to the visual appearance of the table to
1870 20 Feb 13 nicklas 25     make it more suitable for printing.
1870 20 Feb 13 nicklas 26   */
2208 31 Jan 14 nicklas 27   print.tablePrint = function(event)
1870 20 Feb 13 nicklas 28   {
1870 20 Feb 13 nicklas 29     var printData = {};
1870 20 Feb 13 nicklas 30     printData.pageTitle = print.extractDocumentTitle();
6247 24 May 21 nicklas 31     printData.extraStyleSheets = print.getExtraStyleSheets(window);
1870 20 Feb 13 nicklas 32     printData.pageOrientation = 'portrait';
1870 20 Feb 13 nicklas 33     printData.printNote = 'If the table is too wide, try printing in <b>landscape mode</b> or change the <b>scale</b> value.';
1870 20 Feb 13 nicklas 34     printData.printElement = document.forms[0].parentNode;
2208 31 Jan 14 nicklas 35     printData.printTemplate = Data.get(event.currentTarget, 'print-template');
1870 20 Feb 13 nicklas 36     internal.openPrintWindow(printData);
1870 20 Feb 13 nicklas 37   }
1870 20 Feb 13 nicklas 38   
1870 20 Feb 13 nicklas 39   
1870 20 Feb 13 nicklas 40   /*
1870 20 Feb 13 nicklas 41     Finalize the table print preview by setting document title, etc.
1870 20 Feb 13 nicklas 42     Several adjustments are made to the visual appearance of the table to
1870 20 Feb 13 nicklas 43     make it more suitable for printing.
1870 20 Feb 13 nicklas 44   */
1870 20 Feb 13 nicklas 45   print.finalizeTablePrint = function(printWin)
1870 20 Feb 13 nicklas 46   {
1870 20 Feb 13 nicklas 47     var printData = internal.printData;
1870 20 Feb 13 nicklas 48     
1870 20 Feb 13 nicklas 49     // Initalize common options
1870 20 Feb 13 nicklas 50     internal.setDefaultPrintOptions(printWin, printData);
1870 20 Feb 13 nicklas 51     
1870 20 Feb 13 nicklas 52     // Get the source element to be printed and the print-area copy
1870 20 Feb 13 nicklas 53     var printElement = printData.printElement;
1870 20 Feb 13 nicklas 54     var printArea = printWin.document.getElementById('print-area');
1870 20 Feb 13 nicklas 55         
6229 05 May 21 nicklas 56     // Remove 'fulltable' and 'sticky-headers' since that is absolutely positioned
2208 31 Jan 14 nicklas 57     Doc.removeClass(printArea, 'fulltable');
6229 05 May 21 nicklas 58     Doc.removeClass(printArea, 'sticky-headers');
1870 20 Feb 13 nicklas 59     
1870 20 Feb 13 nicklas 60     // Check the filter row if any filter has been set, and copy values
1870 20 Feb 13 nicklas 61     // since not all are copied when using innerHTML
1870 20 Feb 13 nicklas 62     var srcInput = printElement.getElementsByTagName('input');
1870 20 Feb 13 nicklas 63     var printInput = printArea.getElementsByTagName('input');
1870 20 Feb 13 nicklas 64     var hideFilterRow = true;
1870 20 Feb 13 nicklas 65     for (var i = 0; i < srcInput.length; i++)
1870 20 Feb 13 nicklas 66     {
1870 20 Feb 13 nicklas 67       var src = srcInput[i];
3211 26 Mar 15 nicklas 68       var prt = printInput[i];
1870 20 Feb 13 nicklas 69       if (src.name.indexOf('filter:') == 0 || src.name.indexOf('display:') == 0)
1870 20 Feb 13 nicklas 70       {
3211 26 Mar 15 nicklas 71         // Get to the <tr> tag on this filter row and add 'filterrow' class
3211 26 Mar 15 nicklas 72         var tr = print.findParentElement(prt, 'tr');
3211 26 Mar 15 nicklas 73         if (tr) 
3211 26 Mar 15 nicklas 74         {
3211 26 Mar 15 nicklas 75           Doc.addClass(tr, 'filterrow');
3211 26 Mar 15 nicklas 76           if (src.name.indexOf(']') != -1) Doc.addClass(tr, 'secondary');
3211 26 Mar 15 nicklas 77         }
3211 26 Mar 15 nicklas 78         
1870 20 Feb 13 nicklas 79         // For now, ignore all radio buttons
1870 20 Feb 13 nicklas 80         if (src.type != radio)
1870 20 Feb 13 nicklas 81         {
1870 20 Feb 13 nicklas 82           var value = src.value;
1870 20 Feb 13 nicklas 83           if (value != '') 
1870 20 Feb 13 nicklas 84           {
1870 20 Feb 13 nicklas 85             hideFilterRow = false;
3211 26 Mar 15 nicklas 86             prt.value = value;
1870 20 Feb 13 nicklas 87           }
1870 20 Feb 13 nicklas 88         }
1870 20 Feb 13 nicklas 89       }
1870 20 Feb 13 nicklas 90     }
1870 20 Feb 13 nicklas 91     
1870 20 Feb 13 nicklas 92     // Labels and radio buttons are handled separately
1870 20 Feb 13 nicklas 93     var labels = printArea.getElementsByTagName('label');
1870 20 Feb 13 nicklas 94     for (var i = 0; i < labels.length; i++)
1870 20 Feb 13 nicklas 95     {
1870 20 Feb 13 nicklas 96       // Always hide the actual radio button
1870 20 Feb 13 nicklas 97       var radio = printWin.document.getElementById(labels[i].getAttribute('for'));
1870 20 Feb 13 nicklas 98       radio.style.display = 'none';
1870 20 Feb 13 nicklas 99       if (!radio.checked)
1870 20 Feb 13 nicklas 100       {
1870 20 Feb 13 nicklas 101         // and all labels for unchecked buttons
1870 20 Feb 13 nicklas 102         labels[i].style.display = 'none';
1870 20 Feb 13 nicklas 103       }
1870 20 Feb 13 nicklas 104       else
1870 20 Feb 13 nicklas 105       {
1870 20 Feb 13 nicklas 106         // Keep only the label for the checked radio button
1870 20 Feb 13 nicklas 107         hideFilterRow = false;
1870 20 Feb 13 nicklas 108       }
1870 20 Feb 13 nicklas 109     }
1870 20 Feb 13 nicklas 110     
1870 20 Feb 13 nicklas 111     // Hide the filter row if there are no filters
1870 20 Feb 13 nicklas 112     if (hideFilterRow) printArea.className += ' nofilterrow';
1870 20 Feb 13 nicklas 113     
1870 20 Feb 13 nicklas 114     // Replace the 'check' table column with empty content
1870 20 Feb 13 nicklas 115     var allCheck = printArea.getElementsByClassName('check');
1870 20 Feb 13 nicklas 116     for (var i = 0; i < allCheck.length; i++)
1870 20 Feb 13 nicklas 117     {
1870 20 Feb 13 nicklas 118       allCheck[i].innerHTML = '';
1870 20 Feb 13 nicklas 119     }
1870 20 Feb 13 nicklas 120   }
1870 20 Feb 13 nicklas 121   
1870 20 Feb 13 nicklas 122   /*
3211 26 Mar 15 nicklas 123     Find the first parent element with the given tag.
3211 26 Mar 15 nicklas 124   */
3211 26 Mar 15 nicklas 125   print.findParentElement = function(element, tagName)
3211 26 Mar 15 nicklas 126   {
3211 26 Mar 15 nicklas 127     tagName = tagName.toUpperCase();
3211 26 Mar 15 nicklas 128     while (element && element.tagName != tagName)
3211 26 Mar 15 nicklas 129     {
3211 26 Mar 15 nicklas 130       element = element.parentNode;
3211 26 Mar 15 nicklas 131     }
3211 26 Mar 15 nicklas 132     return element || null;
3211 26 Mar 15 nicklas 133   }
3211 26 Mar 15 nicklas 134   
3211 26 Mar 15 nicklas 135   /*
1870 20 Feb 13 nicklas 136     Try to extract a document title. If the 'document.title' property is
1870 20 Feb 13 nicklas 137     set, use that. Otherwise get text from the first '<h1>' tag in the
1870 20 Feb 13 nicklas 138     document.
1870 20 Feb 13 nicklas 139   */
1870 20 Feb 13 nicklas 140   print.extractDocumentTitle = function()
1870 20 Feb 13 nicklas 141   {
1870 20 Feb 13 nicklas 142     var documentTitle = null;
1870 20 Feb 13 nicklas 143     if (document.title)
1870 20 Feb 13 nicklas 144     {
1870 20 Feb 13 nicklas 145       documentTitle = document.title;
1870 20 Feb 13 nicklas 146     }
1870 20 Feb 13 nicklas 147     else
1870 20 Feb 13 nicklas 148     {
1870 20 Feb 13 nicklas 149       var h1 = document.getElementsByTagName('h1');
1870 20 Feb 13 nicklas 150       if (h1.length > 0)
1870 20 Feb 13 nicklas 151       {
1870 20 Feb 13 nicklas 152         // We found a h1 element, get text-only from child nodes
1870 20 Feb 13 nicklas 153         var title = [];
1870 20 Feb 13 nicklas 154         for (var i = 0; i < h1[0].childNodes.length; i++)
1870 20 Feb 13 nicklas 155         {
1870 20 Feb 13 nicklas 156           title[title.length] = h1[0].childNodes[i].textContent;
1870 20 Feb 13 nicklas 157         }
1870 20 Feb 13 nicklas 158         documentTitle = title.join(', ');
1870 20 Feb 13 nicklas 159       }
1870 20 Feb 13 nicklas 160     }
1870 20 Feb 13 nicklas 161     return documentTitle;
1870 20 Feb 13 nicklas 162   }
1870 20 Feb 13 nicklas 163   
6247 24 May 21 nicklas 164   /**
6247 24 May 21 nicklas 165     Get all stylesheets that have been added by extensions to the given window.
6247 24 May 21 nicklas 166   */
6247 24 May 21 nicklas 167   print.getExtraStyleSheets = function(win)
6247 24 May 21 nicklas 168   {
6247 24 May 21 nicklas 169     var extra = [];
6247 24 May 21 nicklas 170     var all = win.document.styleSheets;
6247 24 May 21 nicklas 171     for (var i = 0; i < all.length; i++)
6247 24 May 21 nicklas 172     {
6247 24 May 21 nicklas 173       var ss = all[i];
6247 24 May 21 nicklas 174       if (ss.href && ss.href.indexOf('/extensions/') > 0)
6247 24 May 21 nicklas 175       {
6247 24 May 21 nicklas 176         extra[extra.length] = ss.href;
6247 24 May 21 nicklas 177       }
6247 24 May 21 nicklas 178     }
6247 24 May 21 nicklas 179     return extra;
6247 24 May 21 nicklas 180   }
6247 24 May 21 nicklas 181   
1870 20 Feb 13 nicklas 182   /*
1870 20 Feb 13 nicklas 183     Internal function for opening the print window. printData is
1870 20 Feb 13 nicklas 184     an object containing print options.
1870 20 Feb 13 nicklas 185     
1870 20 Feb 13 nicklas 186   */
1870 20 Feb 13 nicklas 187   internal.openPrintWindow = function(printData)
1870 20 Feb 13 nicklas 188   {
1870 20 Feb 13 nicklas 189     // Default width/height is for 'portrait' orientation
1870 20 Feb 13 nicklas 190     var width = 900;
1870 20 Feb 13 nicklas 191     var height = 900;
1870 20 Feb 13 nicklas 192     if (printData.pageOrientation == 'landscape')
1870 20 Feb 13 nicklas 193     {
1870 20 Feb 13 nicklas 194       width = 1300;
1870 20 Feb 13 nicklas 195       height = 700;
1870 20 Feb 13 nicklas 196     }
1870 20 Feb 13 nicklas 197     
1870 20 Feb 13 nicklas 198     internal.printData = printData;
1870 20 Feb 13 nicklas 199
1870 20 Feb 13 nicklas 200     // Open the print-window 
2208 31 Jan 14 nicklas 201     var printTemplate = printData.printTemplate;
1870 20 Feb 13 nicklas 202     printWin = window.open(printTemplate, 'PrintWindow', 'width='+width+',height='+height+',toolbar=yes,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes');
1870 20 Feb 13 nicklas 203   }
1870 20 Feb 13 nicklas 204   
1870 20 Feb 13 nicklas 205   internal.setDefaultPrintOptions = function(printWin, printData)
1870 20 Feb 13 nicklas 206   {
6247 24 May 21 nicklas 207     // Extra style sheets
6247 24 May 21 nicklas 208     if (printData.extraStyleSheets)
6247 24 May 21 nicklas 209     {
6247 24 May 21 nicklas 210       var current = print.getExtraStyleSheets(printWin);
6247 24 May 21 nicklas 211       for (var i = 0; i < printData.extraStyleSheets.length; i++)
6247 24 May 21 nicklas 212       {
6247 24 May 21 nicklas 213         if (current.indexOf(printData.extraStyleSheets[i])==-1)
6247 24 May 21 nicklas 214         {
6247 24 May 21 nicklas 215           // Only add the stylesheet if it is not already in the current
6247 24 May 21 nicklas 216           var link = document.createElement('link');
6247 24 May 21 nicklas 217           link.rel = 'stylesheet';
6247 24 May 21 nicklas 218           link.type = 'text/css';
6247 24 May 21 nicklas 219           link.href = printData.extraStyleSheets[i];
6247 24 May 21 nicklas 220           printWin.document.head.appendChild(link);
6247 24 May 21 nicklas 221         }
6247 24 May 21 nicklas 222       }
6247 24 May 21 nicklas 223     }
6247 24 May 21 nicklas 224     
1870 20 Feb 13 nicklas 225     // Set page title...
1870 20 Feb 13 nicklas 226     if (printData.pageTitle) 
1870 20 Feb 13 nicklas 227     {
1870 20 Feb 13 nicklas 228       printWin.document.title = printData.pageTitle;
1870 20 Feb 13 nicklas 229       printWin.document.getElementById('print-title').innerHTML = printData.pageTitle;
1870 20 Feb 13 nicklas 230     }
1870 20 Feb 13 nicklas 231   
1870 20 Feb 13 nicklas 232     // ...orientation...
1870 20 Feb 13 nicklas 233     if (printData.pageOrientation)
1870 20 Feb 13 nicklas 234     {
1870 20 Feb 13 nicklas 235       var paper = printWin.document.getElementById('paper');
1870 20 Feb 13 nicklas 236       paper.className += ' ' + printData.pageOrientation;
1870 20 Feb 13 nicklas 237       var landscape = printWin.document.getElementById('orientation-landscape').checked;
1870 20 Feb 13 nicklas 238       if (landscape && printData.pageOrientation == 'landscape')
1870 20 Feb 13 nicklas 239       {
1870 20 Feb 13 nicklas 240         landscape.checked = true;
1870 20 Feb 13 nicklas 241       }
1870 20 Feb 13 nicklas 242     }
1870 20 Feb 13 nicklas 243     
1870 20 Feb 13 nicklas 244     // ... and print note
1870 20 Feb 13 nicklas 245     if (printData.printNote)
1870 20 Feb 13 nicklas 246     {
1870 20 Feb 13 nicklas 247       var note = printWin.document.getElementById('print-note');
1870 20 Feb 13 nicklas 248       note.innerHTML = printData.printNote;
1870 20 Feb 13 nicklas 249     }
1870 20 Feb 13 nicklas 250     
1870 20 Feb 13 nicklas 251     // Get the HTML from the source element
1870 20 Feb 13 nicklas 252     var printElement = printData.printElement;
1870 20 Feb 13 nicklas 253     var printHtml = printElement.innerHTML;
1870 20 Feb 13 nicklas 254   
1870 20 Feb 13 nicklas 255     // Copy the HTML to the print-area in the print-window
1870 20 Feb 13 nicklas 256     var printArea = printWin.document.getElementById('print-area');
1870 20 Feb 13 nicklas 257     printArea.innerHTML = printHtml;
1870 20 Feb 13 nicklas 258     
1870 20 Feb 13 nicklas 259     // Copy the class name of the source to the print area
1870 20 Feb 13 nicklas 260     printArea.className += ' ' + printElement.className;
1870 20 Feb 13 nicklas 261   }
1870 20 Feb 13 nicklas 262   
2208 31 Jan 14 nicklas 263   internal.orientationOnChange = function()
2208 31 Jan 14 nicklas 264   {
2208 31 Jan 14 nicklas 265     var landscape = Doc.element('orientation-landscape').checked;
2208 31 Jan 14 nicklas 266     var paper = Doc.element('paper');
2208 31 Jan 14 nicklas 267     Doc.addOrRemoveClass(paper, 'landscape', landscape);
2208 31 Jan 14 nicklas 268   }
2208 31 Jan 14 nicklas 269
2208 31 Jan 14 nicklas 270   internal.doPrint = function()
2208 31 Jan 14 nicklas 271   {
2208 31 Jan 14 nicklas 272     window.print();
2208 31 Jan 14 nicklas 273   }
2208 31 Jan 14 nicklas 274   
1870 20 Feb 13 nicklas 275   return print;
1870 20 Feb 13 nicklas 276 }();
1870 20 Feb 13 nicklas 277
2208 31 Jan 14 nicklas 278 Doc.onLoad(Print.initPage);
1870 20 Feb 13 nicklas 279