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