text: // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
  // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
  
  import { Log } from './Log';
  import { UrlUtility } from './UrlUtility';
  
  const CheckForPopupClosedInterval = 500;
  const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;';
  //const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;resizable=yes';
  
  const DefaultPopupTarget = "_blank";
  
  export class PopupWindow {
  
      constructor(params) {
          this._promise = new Promise((resolve, reject) => {
              this._resolve = resolve;
              this._reject = reject;
          });
  
          let target = params.popupWindowTarget || DefaultPopupTarget;
          let features = params.popupWindowFeatures || DefaultPopupFeatures;
  
          this._popup = window.open('', target, features);
          if (this._popup) {
              Log.debug("PopupWindow.ctor: popup successfully created");
              this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
          }
      }
  
      get promise() {
          return this._promise;
      }
  
      navigate(params) {
          if (!this._popup) {
              this._error("PopupWindow.navigate: Error opening popup window");
          }
          else if (!params || !params.url) {
              this._error("PopupWindow.navigate: no url provided");
              this._error("No url provided");
          }
          else {
              Log.debug("PopupWindow.navigate: Setting URL in popup");
  
              this._id = params.id;
              if (this._id) {
                  window["popupCallback_" + params.id] = this._callback.bind(this);
              }
  
             
              this._popup.window.location = params.url;
          }
  
          return this.promise;
      }
  
      _success(data) {
          Log.debug("PopupWindow.callback: Successful response from popup window");
  
          this._cleanup();
          this._resolve(data);
      }
      _error(message) {
          Log.error("PopupWindow.error: ", message);
          
          this._cleanup();
          this._reject(new Error(message));
      }
  
      close() {
          this._cleanup(false);
      }
  
      _cleanup(keepOpen) {
          Log.debug("PopupWindow.cleanup");
  
          window.clearInterval(this._checkForPopupClosedTimer);
          this._checkForPopupClosedTimer = null;
  
          delete window["popupCallback_" + this._id];
  
          if (this._popup && !keepOpen) {
              this._popup.close();
          }
          this._popup = null;
      }
  
      _checkForPopupClosed() {
          if (!this._popup || this._popup.closed) {
              this._error("Popup window closed");
          }
      }
  
      _callback(url, keepOpen) {
          this._cleanup(keepOpen);
  
          if (url) {
              Log.debug("PopupWindow.callback success");
              this._success({ url: url });
          }
          else {
              Log.debug("PopupWindow.callback: Invalid response from popup");
              this._error("Invalid response from popup");
          }
      }
  
      static notifyOpener(url, keepOpen, delimiter) {
          if (window.opener) {
              url = url || window.location.href;
              if (url) {
                  var data = UrlUtility.parseUrlFragment(url, delimiter);
  
                  if (data.state) {
                      var name = "popupCallback_" + data.state;
                      var callback = window.opener[name];
                      if (callback) {
                          Log.debug("PopupWindow.notifyOpener: passing url message to opener");
                          callback(url, keepOpen);
                      }
                      else {
                          Log.warn("PopupWindow.notifyOpener: no matching callback found on opener");
                      }
                  }
                  else {
                      Log.warn("PopupWindow.notifyOpener: no state found in response url");
                  }
              }
          }
          else {
              Log.warn("PopupWindow.notifyOpener: no window.opener. Can't complete notification.");
          }
      }
  }
  