1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvar localStrings = new LocalStrings(); 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvar hasPDFPlugin = true; 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The total page count of the previewed document regardless of which pages the 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// user has selected. 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvar totalPageCount = -1; 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The previously selected pages by the user. It is used in 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// onPageSelectionMayHaveChanged() to make sure that a new preview is not 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// requested more often than necessary. 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvar previouslySelectedPages = []; 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Timer id of the page range textfield. It is used to reset the timer whenever 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// needed. 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvar timerId; 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/** 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Window onload handler, sets up the page and starts print preview by getting 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * the printer list. 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onLoad() { 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen initializeAnimation(); 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('printer-list').disabled = true; 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('print-button').disabled = true; 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('print-button').addEventListener('click', printFile); 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('cancel-button').addEventListener('click', function(e) { 32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch window.close(); 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch }); 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('all-pages').addEventListener('click', onPageSelectionMayHaveChanged); 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('copies').addEventListener('input', validateNumberOfCopies); 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('copies').addEventListener('blur', handleCopiesFieldBlur); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('print-pages').addEventListener('click', handleIndividualPagesCheckbox); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').addEventListener('blur', handlePageRangesFieldBlur); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').addEventListener('focus', addTimerToPageRangeField); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').addEventListener('input', resetPageRangeFieldTimer); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('landscape').addEventListener('click', onLayoutModeToggle); 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('portrait').addEventListener('click', onLayoutModeToggle); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('color').addEventListener('click', function() { setColor(true); }); 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('bw').addEventListener('click', function() { setColor(false); }); 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('printer-list').addEventListener( 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'change', updateControlsWithSelectedPrinterCapabilities); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch chrome.send('getPrinters'); 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Gets the selected printer capabilities and updates the controls accordingly. 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction updateControlsWithSelectedPrinterCapabilities() { 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printerList = $('printer-list'); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var selectedPrinter = printerList.selectedIndex; 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (selectedPrinter < 0) 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printerName = printerList.options[selectedPrinter].textContent; 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (printerName == localStrings.getString('printToPDF')) { 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateWithPrinterCapabilities({'disableColorOption': true, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'setColorAsDefault': true}); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This message will call back to 'updateWithPrinterCapabilities' 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // function. 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome.send('getPrinterCapabilities', [printerName]); 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Updates the controls with printer capabilities information. 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Object} settingInfo printer setting information. 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction updateWithPrinterCapabilities(settingInfo) { 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var disableColorOption = settingInfo.disableColorOption; 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var setColorAsDefault = settingInfo.setColorAsDefault; 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var colorOption = $('color'); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var bwOption = $('bw'); 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (disableColorOption != colorOption.disabled) { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setControlAndLabelDisabled(colorOption, disableColorOption); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setControlAndLabelDisabled(bwOption, disableColorOption); 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (colorOption.checked != setColorAsDefault) { 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colorOption.checked = setColorAsDefault; 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bwOption.checked = !setColorAsDefault; 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setColor(colorOption.checked); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/** 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Disables the input control element and its associated label. 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {HTMLElement} controlElm An input control element. 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {boolean} disable set to true to disable element and label. 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen */ 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction setControlAndLabelDisabled(controlElm, disable) { 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen controlElm.disabled = disable; 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var label = $(controlElm.getAttribute('label')); 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (disable) 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen label.classList.add('disabled-label-text'); 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen label.classList.remove('disabled-label-text'); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Parses the copies field text for validation and updates the state of print 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * button and collate checkbox. If the specified value is invalid, displays an 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * invalid warning icon on the text box and sets the error message as the title 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * message of text box. 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction validateNumberOfCopies() { 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copiesField = $('copies'); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var message = ''; 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!isNumberOfCopiesValid()) 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message = localStrings.getString('invalidNumberOfCopiesTitleToolTip'); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copiesField.setCustomValidity(message); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copiesField.title = message; 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updatePrintButtonState(); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Handles copies field blur event. 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction handleCopiesFieldBlur() { 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen checkAndSetCopiesField(); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSettingChanged(); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Handles page ranges field blur event. 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction handlePageRangesFieldBlur() { 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen checkAndSetPageRangesField(); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onPageSelectionMayHaveChanged(); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Validates the copies text field value. 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * NOTE: An empty copies field text is considered valid because the blur event 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * listener of this field will set it back to a default value. 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {boolean} true if the number of copies is valid else returns false. 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction isNumberOfCopiesValid() { 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copiesFieldText = $('copies').value.replace(/\s/g, ''); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (copiesFieldText == '') 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen var numericExp = /^[0-9]+$/; 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return (numericExp.test(copiesFieldText) && Number(copiesFieldText) > 0); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks the value of the copies field. If it is a valid number it does 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * nothing. If it can only parse the first part of the string it replaces the 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * string with the first part. Example: '123abcd' becomes '123'. 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * If the string can't be parsed at all it replaces with 1. 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction checkAndSetCopiesField() { 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copiesField = $('copies'); 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copies = parseInt(copiesField.value, 10); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (isNaN(copies)) 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copies = 1; 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copiesField.value = copies; 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateSummary(); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks the value of the page ranges text field. It parses the page ranges and 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * normalizes them. For example: '1,2,3,5,9-10' becomes '1-3, 5, 9-10'. 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * If it can't parse the whole string it will replace with the part it parsed. 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * For example: '1-6,9-10,sd343jf' becomes '1-6, 9-10'. If the specified page 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * range includes all pages it replaces it with the empty string (so that the 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * example text is automatically shown. 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction checkAndSetPageRangesField() { 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageRanges = getSelectedPageRanges(); 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parsedPageRanges = ''; 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var individualPagesField = $('individual-pages'); 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < pageRanges.length; ++i) { 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (pageRanges[i].from == pageRanges[i].to) 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parsedPageRanges += pageRanges[i].from; 187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen else 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parsedPageRanges += pageRanges[i].from + '-' + pageRanges[i].to; 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (i < pageRanges.length - 1) 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parsedPageRanges += ', '; 191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen individualPagesField.value = parsedPageRanges; 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateSummary(); 194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks whether the preview layout setting is set to 'landscape' or not. 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {boolean} true if layout is 'landscape'. 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction isLandscape() { 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return $('landscape').checked; 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks whether the preview color setting is set to 'color' or not. 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {boolean} true if color is 'color'. 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction isColor() { 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return $('color').checked; 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks whether the preview collate setting value is set or not. 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {boolean} true if collate setting is enabled and checked. 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction isCollated() { 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var collateField = $('collate'); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return !collateField.disabled && collateField.checked; 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Returns the number of copies currently indicated in the copies textfield. If 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * the contents of the textfield can not be converted to a number or if <1 it 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * returns 1. 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {number} number of copies. 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction getCopies() { 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copies = parseInt($('copies').value, 10); 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!copies || copies <= 1) 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copies = 1; 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return copies; 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Checks whether the preview two-sided checkbox is checked. 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {boolean} true if two-sided is checked. 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction isTwoSided() { 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return $('two-sided').checked; 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Creates a JSON string based on the values in the printer settings. 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {string} JSON string with print job settings. 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction getSettingsJSON() { 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printerList = $('printer-list') 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var selectedPrinter = printerList.selectedIndex; 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printerName = ''; 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (selectedPrinter >= 0) 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printerName = printerList.options[selectedPrinter].textContent; 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen var printAll = $('all-pages').checked; 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printToPDF = (printerName == localStrings.getString('printToPDF')); 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return JSON.stringify({'printerName': printerName, 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'pageRange': getSelectedPageRanges(), 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'printAll': printAll, 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'twoSided': isTwoSided(), 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'copies': getCopies(), 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'collate': isCollated(), 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'landscape': isLandscape(), 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'color': isColor(), 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 'printToPDF': printToPDF}); 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Asks the browser to print the preview PDF based on current print settings. 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction printFile() { 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome.send('print', [getSettingsJSON()]); 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Asks the browser to generate a preview PDF based on current print settings. 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction getPreview() { 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome.send('getPreview', [getSettingsJSON()]); 284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen/** 287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Fill the printer list drop down. 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Called from PrintPreviewHandler::SendPrinterList(). 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Array} printers Array of printer names. 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {number} defaultPrinterIndex The index of the default printer. 291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction setPrinters(printers, defaultPrinterIndex) { 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printerList = $('printer-list'); 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < printers.length; ++i) { 295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch var option = document.createElement('option'); 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen option.textContent = printers[i]; 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printerList.add(option); 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (i == defaultPrinterIndex) 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen option.selected = true; 300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Adding option for saving PDF to disk. 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var option = document.createElement('option'); 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen option.textContent = localStrings.getString('printToPDF'); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printerList.add(option); 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printerList.disabled = false; 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateControlsWithSelectedPrinterCapabilities(); 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Once the printer list is populated, generate the initial preview. 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getPreview(); 312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Sets the color mode for the PDF plugin. 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Called from PrintPreviewHandler::ProcessColorSetting(). 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {boolean} color is true if the PDF plugin should display in color. 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction setColor(color) { 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!hasPDFPlugin) { 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('pdf-viewer').grayscale(!color); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Called when the PDF plugin loads its document. 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 32921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenfunction onPDFLoad() { 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (isLandscape()) 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('pdf-viewer').fitToWidth(); 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('pdf-viewer').fitToHeight(); 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Update the print preview when new preview data is available. 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Create the PDF plugin as needed. 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Called from PrintPreviewUI::PreviewDataIsAvailable(). 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {number} pageCount The expected total pages count. 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {string} jobTitle The print job title. 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction updatePrintPreview(pageCount, jobTitle) { 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initialize the expected page count. 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (totalPageCount == -1) 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen totalPageCount = pageCount; 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initialize the selected pages (defaults to all selected). 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (previouslySelectedPages.length == 0) 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < totalPageCount; i++) 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen previouslySelectedPages.push(i+1); 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen regeneratePreview = false; 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Update the current tab title. 357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle); 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen createPDFPlugin(); 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateSummary(); 36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 363513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen/** 36521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * Create the PDF plugin or reload the existing one. 36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen */ 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction createPDFPlugin() { 36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!hasPDFPlugin) { 36921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Enable the print button. 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!$('printer-list').disabled) { 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('print-button').disabled = false; 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 37621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pdfViewer = $('pdf-viewer'); 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (pdfViewer) { 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pdfViewer.reload(); 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pdfViewer.grayscale(!isColor()); 38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 38221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 38321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 38421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen var loadingElement = $('loading'); 38521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen loadingElement.classList.add('hidden'); 38621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen var mainView = loadingElement.parentNode; 38721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pdfPlugin = document.createElement('embed'); 38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pdfPlugin.setAttribute('id', 'pdf-viewer'); 39021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pdfPlugin.setAttribute('type', 'application/pdf'); 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pdfPlugin.setAttribute('src', 'chrome://print/print.pdf'); 39221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen mainView.appendChild(pdfPlugin); 39321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!pdfPlugin.onload) { 39421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen hasPDFPlugin = false; 39521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen mainView.removeChild(pdfPlugin); 39621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen $('no-plugin').classList.remove('hidden'); 39721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 39821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pdfPlugin.grayscale(true); 40021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pdfPlugin.onload('onPDFLoad()'); 40121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Updates the state of print button depending on the user selection. 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * If the user has selected 'All' pages option, enables the print button. 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * If the user has selected a page range, depending on the validity of page 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * range text enables/disables the print button. 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Depending on the validity of 'copies' value, enables/disables the print 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * button. 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction updatePrintButtonState() { 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('print-button').disabled = (!($('all-pages').checked || 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').checkValidity()) || 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !$('copies').checkValidity()); 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenwindow.addEventListener('DOMContentLoaded', onLoad); 419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Listener function that executes whenever any of the available settings 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * is changed. 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction printSettingChanged() { 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('collate-option').hidden = getCopies() <= 1; 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen updateSummary(); 427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Updates the print summary based on the currently selected user options. 431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction updateSummary() { 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copies = getCopies(); 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printButton = $('print-button'); 436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var printSummary = $('print-summary'); 437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (isNaN($('copies').value)) { 439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSummary.innerHTML = 440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localStrings.getString('invalidNumberOfCopiesTitleToolTip'); 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageList = getSelectedPages(); 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (pageList.length <= 0) { 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSummary.innerHTML = 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localStrings.getString('pageRangeInvalidTitleToolTip'); 448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printButton.disabled = true; 449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pagesLabel = localStrings.getString('printPreviewPageLabelSingular'); 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var twoSidedLabel = ''; 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var timesSign = ''; 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var numOfCopies = ''; 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var copiesLabel = ''; 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var equalSign = ''; 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var numOfSheets = ''; 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var sheetsLabel = ''; 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printButton.disabled = false; 462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (pageList.length > 1) 464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pagesLabel = localStrings.getString('printPreviewPageLabelPlural'); 465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (isTwoSided()) 467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen twoSidedLabel = '('+localStrings.getString('optionTwoSided')+')'; 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (copies > 1) { 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timesSign = '×'; 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numOfCopies = copies; 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copiesLabel = localStrings.getString('copiesLabel').toLowerCase(); 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ((copies > 1) || (isTwoSided())) { 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numOfSheets = pageList.length; 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (isTwoSided()) 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numOfSheets = Math.ceil(numOfSheets / 2); 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen equalSign = '='; 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numOfSheets *= copies; 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sheetsLabel = localStrings.getString('printPreviewSheetsLabel'); 484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var html = localStrings.getStringF('printPreviewSummaryFormat', 487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pageList.length, pagesLabel, 488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen twoSidedLabel, timesSign, numOfCopies, 489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen copiesLabel, equalSign, 490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen '<strong>' + numOfSheets + '</strong>', 491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen '<strong>' + sheetsLabel + '</strong>'); 492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Removing extra spaces from within the string. 494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen html.replace(/\s{2,}/g, ' '); 495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSummary.innerHTML = html; 496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Handles a click event on the two-sided option. 500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction handleTwoSidedClick(event) { 502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen handleZippyClickEl($('binding')); 503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSettingChanged(event); 504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Gives focus to the individual pages textfield when 'print-pages' textbox is 508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * clicked. 509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction handleIndividualPagesCheckbox() { 511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printSettingChanged(); 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').focus(); 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * When the user switches printing orientation mode the page field selection is 517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * reset to "all pages selected". After the change the number of pages will be 518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * different and currently selected page numbers might no longer be valid. 519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Even if they are still valid the content of these pages will be different. 520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onLayoutModeToggle() { 522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('individual-pages').value = ''; 523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $('all-pages').checked = true; 524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen totalPageCount = -1; 525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen previouslySelectedPages.length = 0; 526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getPreview(); 527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Returns a list of all pages in the specified ranges. If the page ranges can't 531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * be parsed an empty list is returned. 532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {Array} 534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction getSelectedPages() { 536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageText = $('individual-pages').value; 537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ($('all-pages').checked || pageText == '') 539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pageText = '1-' + totalPageCount; 540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageList = []; 542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parts = pageText.split(/,/); 543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < parts.length; ++i) { 545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var part = parts[i]; 546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var match = part.match(/([0-9]+)-([0-9]+)/); 547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (match && match[1] && match[2]) { 549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var from = parseInt(match[1], 10); 550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var to = parseInt(match[2], 10); 551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (from && to) { 553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var j = from; j <= to; ++j) 554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (j <= totalPageCount) 555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pageList.push(j); 556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (parseInt(part, 10)) { 558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (parseInt(part, 10) <= totalPageCount) 559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pageList.push(parseInt(part, 10)); 560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return pageList; 563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Parses the selected page ranges, processes them and returns the results. 567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * It squashes whenever possible. Example '1-2,3,5-7' becomes 1-3,5-7 568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @return {Array} an array of page range objects. A page range object has 570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * fields 'from' and 'to'. 571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction getSelectedPageRanges() { 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageList = getSelectedPages(); 574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var pageRanges = []; 575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < pageList.length; ++i) { 576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tempFrom = pageList[i]; 577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (i + 1 < pageList.length && pageList[i + 1] == pageList[i] + 1) 578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++i; 579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tempTo = pageList[i]; 580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pageRanges.push({'from': tempFrom, 'to': tempTo}); 581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return pageRanges; 583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Whenever the page range textfield gains focus we add a timer to detect when 587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * the user stops typing in order to update the print preview. 588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction addTimerToPageRangeField() { 590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timerId = window.setTimeout(onPageSelectionMayHaveChanged, 500); 591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * As the user types in the page range textfield, we need to reset this timer, 595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * since the page ranges are still being edited. 596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction resetPageRangeFieldTimer() { 598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clearTimeout(timerId); 599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addTimerToPageRangeField(); 600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * When the user stops typing in the page range textfield or clicks on the 604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 'all-pages' checkbox, a new print preview is requested, only if 605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 1) The input is valid (it can be parsed, even only partially). 606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 2) The newly selected pages differ from the previously selected. 607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onPageSelectionMayHaveChanged() { 609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var currentlySelectedPages = getSelectedPages(); 610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (currentlySelectedPages.length == 0) 612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (areArraysEqual(previouslySelectedPages, currentlySelectedPages)) 614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen previouslySelectedPages = currentlySelectedPages; 617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getPreview(); 618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/** 621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Returns true if the contents of the two arrays are equal. 622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction areArraysEqual(array1, array2) { 624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (array1.length != array2.length) 625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < array1.length; i++) 627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(array1[i] != array2[i]) 628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 631