text: /* Copyright 2016 Mozilla Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  'use strict';
  
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {
    var defaultUrl; // eslint-disable-line no-var
  
    (function rewriteUrlClosure() {
      // Run this code outside DOMContentLoaded to make sure that the URL
      // is rewritten as soon as possible.
      let queryString = document.location.search.slice(1);
      let m = /(^|&)file=([^&]*)/.exec(queryString);
      defaultUrl = m ? decodeURIComponent(m[2]) : '';
  
      // Example: chrome-extension://.../http://example.com/file.pdf
      let humanReadableUrl = '/' + defaultUrl + location.hash;
      history.replaceState(history.state, '', humanReadableUrl);
      if (top === window) {
        // eslint-disable-next-line no-undef
        chrome.runtime.sendMessage('showPageAction');
      }
    })();
  }
  
  let pdfjsWebApp, pdfjsWebAppOptions;
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('PRODUCTION')) {
    pdfjsWebApp = require('./app.js');
    pdfjsWebAppOptions = require('./app_options.js');
  }
  
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('FIREFOX || MOZCENTRAL')) {
    require('./firefoxcom.js');
    require('./firefox_print_service.js');
  }
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {
    require('./genericcom.js');
  }
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {
    require('./chromecom.js');
  }
  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME || GENERIC')) {
    require('./pdf_print_service.js');
  }
  
  function getViewerConfiguration() {
    return {
      appContainer: document.body,
      mainContainer: document.getElementById('viewerContainer'),
      viewerContainer: document.getElementById('viewer'),
      eventBus: null, // Using global event bus with (optional) DOM events.
      toolbar: {
        container: document.getElementById('toolbarViewer'),
        numPages: document.getElementById('numPages'),
        pageNumber: document.getElementById('pageNumber'),
        scaleSelectContainer: document.getElementById('scaleSelectContainer'),
        scaleSelect: document.getElementById('scaleSelect'),
        customScaleOption: document.getElementById('customScaleOption'),
        previous: document.getElementById('previous'),
        next: document.getElementById('next'),
        zoomIn: document.getElementById('zoomIn'),
        zoomOut: document.getElementById('zoomOut'),
        viewFind: document.getElementById('viewFind'),
        openFile: document.getElementById('openFile'),
        print: document.getElementById('print'),
        presentationModeButton: document.getElementById('presentationMode'),
        download: document.getElementById('download'),
        viewBookmark: document.getElementById('viewBookmark'),
      },
      secondaryToolbar: {
        toolbar: document.getElementById('secondaryToolbar'),
        toggleButton: document.getElementById('secondaryToolbarToggle'),
        toolbarButtonContainer:
          document.getElementById('secondaryToolbarButtonContainer'),
        presentationModeButton:
          document.getElementById('secondaryPresentationMode'),
        openFileButton: document.getElementById('secondaryOpenFile'),
        printButton: document.getElementById('secondaryPrint'),
        downloadButton: document.getElementById('secondaryDownload'),
        viewBookmarkButton: document.getElementById('secondaryViewBookmark'),
        firstPageButton: document.getElementById('firstPage'),
        lastPageButton: document.getElementById('lastPage'),
        pageRotateCwButton: document.getElementById('pageRotateCw'),
        pageRotateCcwButton: document.getElementById('pageRotateCcw'),
        cursorSelectToolButton: document.getElementById('cursorSelectTool'),
        cursorHandToolButton: document.getElementById('cursorHandTool'),
        scrollVerticalButton: document.getElementById('scrollVertical'),
        scrollHorizontalButton: document.getElementById('scrollHorizontal'),
        scrollWrappedButton: document.getElementById('scrollWrapped'),
        spreadNoneButton: document.getElementById('spreadNone'),
        spreadOddButton: document.getElementById('spreadOdd'),
        spreadEvenButton: document.getElementById('spreadEven'),
        documentPropertiesButton: document.getElementById('documentProperties'),
      },
      fullscreen: {
        contextFirstPage: document.getElementById('contextFirstPage'),
        contextLastPage: document.getElementById('contextLastPage'),
        contextPageRotateCw: document.getElementById('contextPageRotateCw'),
        contextPageRotateCcw: document.getElementById('contextPageRotateCcw'),
      },
      sidebar: {
        // Divs (and sidebar button)
        outerContainer: document.getElementById('outerContainer'),
        viewerContainer: document.getElementById('viewerContainer'),
        toggleButton: document.getElementById('sidebarToggle'),
        // Buttons
        thumbnailButton: document.getElementById('viewThumbnail'),
        outlineButton: document.getElementById('viewOutline'),
        attachmentsButton: document.getElementById('viewAttachments'),
        metadataIdxButton: document.getElementById('viewFragmentMetadata'),
        // Views
        thumbnailView: document.getElementById('thumbnailView'),
        outlineView: document.getElementById('outlineView'),
        attachmentsView: document.getElementById('attachmentsView'),
        fragmentMetadataView: document.getElementById('fragmentMetadata'),
      },
      sidebarResizer: {
        outerContainer: document.getElementById('outerContainer'),
        resizer: document.getElementById('sidebarResizer'),
      },
      findBar: {
        bar: document.getElementById('findbar'),
        toggleButton: document.getElementById('viewFind'),
        findField: document.getElementById('findInput'),
        highlightAllCheckbox: document.getElementById('findHighlightAll'),
        caseSensitiveCheckbox: document.getElementById('findMatchCase'),
        entireWordCheckbox: document.getElementById('findEntireWord'),
        findMsg: document.getElementById('findMsg'),
        findResultsCount: document.getElementById('findResultsCount'),
        findPreviousButton: document.getElementById('findPrevious'),
        findNextButton: document.getElementById('findNext'),
      },
      passwordOverlay: {
        overlayName: 'passwordOverlay',
        container: document.getElementById('passwordOverlay'),
        label: document.getElementById('passwordText'),
        input: document.getElementById('password'),
        submitButton: document.getElementById('passwordSubmit'),
        cancelButton: document.getElementById('passwordCancel'),
      },
      documentProperties: {
        overlayName: 'documentPropertiesOverlay',
        container: document.getElementById('documentPropertiesOverlay'),
        closeButton: document.getElementById('documentPropertiesClose'),
        fields: {
          'fileName': document.getElementById('fileNameField'),
          'fileSize': document.getElementById('fileSizeField'),
          'title': document.getElementById('titleField'),
          'author': document.getElementById('authorField'),
          'subject': document.getElementById('subjectField'),
          'keywords': document.getElementById('keywordsField'),
          'creationDate': document.getElementById('creationDateField'),
          'modificationDate': document.getElementById('modificationDateField'),
          'creator': document.getElementById('creatorField'),
          'producer': document.getElementById('producerField'),
          'version': document.getElementById('versionField'),
          'pageCount': document.getElementById('pageCountField'),
          'pageSize': document.getElementById('pageSizeField'),
          'linearized': document.getElementById('linearizedField'),
        },
      },
      errorWrapper: {
        container: document.getElementById('errorWrapper'),
        errorMessage: document.getElementById('errorMessage'),
        closeButton: document.getElementById('errorClose'),
        errorMoreInfo: document.getElementById('errorMoreInfo'),
        moreInfoButton: document.getElementById('errorShowMore'),
        lessInfoButton: document.getElementById('errorShowLess'),
      },
      printContainer: document.getElementById('printContainer'),
      openFileInputName: 'fileInput',
      debuggerScriptPath: './debugger.js',
    };
  }
  
  function webViewerLoad() {
    let config = getViewerConfiguration();
    if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {
      Promise.all([
        SystemJS.import('pdfjs-web/app'),
        SystemJS.import('pdfjs-web/app_options'),
        SystemJS.import('pdfjs-web/genericcom'),
        SystemJS.import('pdfjs-web/pdf_print_service'),
      ]).then(function([app, appOptions, ...otherModules]) {
        window.PDFViewerApplication = app.PDFViewerApplication;
        window.PDFViewerApplicationOptions = appOptions.AppOptions;
        app.PDFViewerApplication.run(config);
      });
    } else {
      if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {
        pdfjsWebAppOptions.AppOptions.set('defaultUrl', defaultUrl);
      }
  
      window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;
      window.PDFViewerApplicationOptions = pdfjsWebAppOptions.AppOptions;
  
      if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {
        // Give custom implementations of the default viewer a simpler way to
        // set various `AppOptions`, by dispatching an event once all viewer
        // files are loaded but *before* the viewer initialization has run.
        const event = document.createEvent('CustomEvent');
        event.initCustomEvent('webviewerloaded', true, true, {});
        document.dispatchEvent(event);
      }
  
      pdfjsWebApp.PDFViewerApplication.run(config);
    }
  }
  
  if (document.readyState === 'interactive' ||
      document.readyState === 'complete') {
    webViewerLoad();
  } else {
    document.addEventListener('DOMContentLoaded', webViewerLoad, true);
  }
  