// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The SFC licenses this file
// to you 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.

/**
 * @fileoverview Bootstrap file that loads all of the WebDriver scripts in the
 * correct order. Once loaded, pages can use {@code goog.require} statements
 * from Google Closure to load additional files as needed.
 *
 * Example Usage:
 *
 * <html>
 *   <head>
 *     <script src="test_bootstrap.js"></script>
 *     <script>
 *       goog.require('goog.debug.Logger');
 *     </script>
 *     <script>
 *       window.onload = function() {
 *         goog.debug.Logger.getLogger('').info(
 *             'The page has finished loading');
 *       };
 *     </script>
 *   </head>
 *   <body></body>
 * </html>
 */

(function() {
  // Enable the debug loader for the Closure Library (required for goog.require to work)
  window.CLOSURE_UNCOMPILED_DEFINES = {'goog.ENABLE_DEBUG_LOADER': true};

  window.errors = [];
  window.onerror = function() { window.errors.push(arguments); console.log(arguments); };
  var scripts = document.getElementsByTagName('script');
  var directoryPath = './';
  var thisFile = 'test_bootstrap.js';

  for (var i = 0; i < scripts.length; i++) {
    var src = scripts[i].src;
    var len = src.length;
    if (src.substr(len - thisFile.length) == thisFile) {
      directoryPath = src.substr(0, len - thisFile.length);
      break;
    }
  }

  // All of the files to load. Files are specified in the order they must be
  // loaded, NOT alphabetical order.
  var files = [
    '../../../third_party/closure/goog/base.js',
    '../../deps.js'
  ];


  if (location.pathname.lastIndexOf('/filez/_main/javascript/', 0) === 0
      || location.pathname.lastIndexOf('/common/generated/javascript/', 0) === 0) {
    directoryPath = '';
    files = [
      '/filez/_main/third_party/closure/goog/base.js',
      '/filez/_main/javascript/atoms/deps.js',
      '/filez/_main/javascript/webdriver/deps.js',
    ];
  }

  for (var j = 0; j < files.length; j++) {
    document.write('<script type="text/javascript" src="' +
        directoryPath + files[j] + '"></script>');
  }
})();
