var svgEditorExtension_storage = (function () { 
 | 
  'use strict'; 
 | 
  
 | 
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { 
 | 
    try { 
 | 
      var info = gen[key](arg); 
 | 
      var value = info.value; 
 | 
    } catch (error) { 
 | 
      reject(error); 
 | 
      return; 
 | 
    } 
 | 
  
 | 
    if (info.done) { 
 | 
      resolve(value); 
 | 
    } else { 
 | 
      Promise.resolve(value).then(_next, _throw); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  function _asyncToGenerator(fn) { 
 | 
    return function () { 
 | 
      var self = this, 
 | 
          args = arguments; 
 | 
      return new Promise(function (resolve, reject) { 
 | 
        var gen = fn.apply(self, args); 
 | 
  
 | 
        function _next(value) { 
 | 
          asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); 
 | 
        } 
 | 
  
 | 
        function _throw(err) { 
 | 
          asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); 
 | 
        } 
 | 
  
 | 
        _next(undefined); 
 | 
      }); 
 | 
    }; 
 | 
  } 
 | 
  
 | 
  /* globals jQuery */ 
 | 
  
 | 
  /** 
 | 
   * ext-storage.js 
 | 
   * 
 | 
   * This extension allows automatic saving of the SVG canvas contents upon 
 | 
   *  page unload (which can later be automatically retrieved upon future 
 | 
   *  editor loads). 
 | 
   * 
 | 
   *  The functionality was originally part of the SVG Editor, but moved to a 
 | 
   *  separate extension to make the setting behavior optional, and adapted 
 | 
   *  to inform the user of its setting of local data. 
 | 
   * Dependencies: 
 | 
   * 
 | 
   * 1. jQuery BBQ (for deparam) 
 | 
   * @license MIT 
 | 
   * 
 | 
   * @copyright 2010 Brett Zamir 
 | 
   * @todo Revisit on whether to use $.pref over directly setting curConfig in all 
 | 
   *   extensions for a more public API (not only for extPath and imagePath, 
 | 
   *   but other currently used config in the extensions) 
 | 
   * @todo We might provide control of storage settings through the UI besides the 
 | 
   *   initial (or URL-forced) dialog. * 
 | 
  */ 
 | 
  var extStorage = { 
 | 
    name: 'storage', 
 | 
    init: function init() { 
 | 
      var svgEditor = this; 
 | 
      var $ = jQuery; 
 | 
      var svgCanvas = svgEditor.canvas; // We could empty any already-set data for users when they decline storage, 
 | 
      //  but it would be a risk for users who wanted to store but accidentally 
 | 
      // said "no"; instead, we'll let those who already set it, delete it themselves; 
 | 
      // to change, set the "emptyStorageOnDecline" config setting to true 
 | 
      // in svgedit-config-iife.js/svgedit-config-es.js. 
 | 
  
 | 
      var _svgEditor$curConfig = svgEditor.curConfig, 
 | 
          emptyStorageOnDecline = _svgEditor$curConfig.emptyStorageOnDecline, 
 | 
          noStorageOnLoad = _svgEditor$curConfig.noStorageOnLoad, 
 | 
          forceStorage = _svgEditor$curConfig.forceStorage; 
 | 
      var storage = svgEditor.storage, 
 | 
          updateCanvas = svgEditor.updateCanvas; 
 | 
  
 | 
      function replaceStoragePrompt(val) { 
 | 
        val = val ? 'storagePrompt=' + val : ''; 
 | 
        var loc = top.location; // Allow this to work with the embedded editor as well 
 | 
  
 | 
        if (loc.href.includes('storagePrompt=')) { 
 | 
          loc.href = loc.href.replace(/([&?])storagePrompt=[^&]*(&?)/, function (n0, n1, amp) { 
 | 
            return (val ? n1 : '') + val + (!val && amp ? n1 : amp || ''); 
 | 
          }); 
 | 
        } else { 
 | 
          loc.href += (loc.href.includes('?') ? '&' : '?') + val; 
 | 
        } 
 | 
      } 
 | 
  
 | 
      function setSVGContentStorage(val) { 
 | 
        if (storage) { 
 | 
          var name = 'svgedit-' + svgEditor.curConfig.canvasName; 
 | 
  
 | 
          if (!val) { 
 | 
            storage.removeItem(name); 
 | 
          } else { 
 | 
            storage.setItem(name, val); 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
  
 | 
      function expireCookie(cookie) { 
 | 
        document.cookie = encodeURIComponent(cookie) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; 
 | 
      } 
 | 
  
 | 
      function removeStoragePrefCookie() { 
 | 
        expireCookie('store'); 
 | 
      } 
 | 
  
 | 
      function emptyStorage() { 
 | 
        setSVGContentStorage(''); 
 | 
  
 | 
        for (var name in svgEditor.curPrefs) { 
 | 
          if (svgEditor.curPrefs.hasOwnProperty(name)) { 
 | 
            name = 'svg-edit-' + name; 
 | 
  
 | 
            if (storage) { 
 | 
              storage.removeItem(name); 
 | 
            } 
 | 
  
 | 
            expireCookie(name); 
 | 
          } 
 | 
        } 
 | 
      } // emptyStorage(); 
 | 
  
 | 
      /** 
 | 
      * Listen for unloading: If and only if opted in by the user, set the content 
 | 
      *   document and preferences into storage: 
 | 
      * 1. Prevent save warnings (since we're automatically saving unsaved 
 | 
      *       content into storage) 
 | 
      * 2. Use localStorage to set SVG contents (potentially too large to allow in cookies) 
 | 
      * 3. Use localStorage (where available) or cookies to set preferences. 
 | 
      * @returns {undefined} 
 | 
      */ 
 | 
  
 | 
  
 | 
      function setupBeforeUnloadListener() { 
 | 
        window.addEventListener('beforeunload', function (e) { 
 | 
          // Don't save anything unless the user opted in to storage 
 | 
          if (!document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/)) { 
 | 
            return; 
 | 
          } 
 | 
  
 | 
          if (document.cookie.match(/(?:^|;\s*)store=prefsAndContent/)) { 
 | 
            setSVGContentStorage(svgCanvas.getSvgString()); 
 | 
          } 
 | 
  
 | 
          svgEditor.setConfig({ 
 | 
            no_save_warning: true 
 | 
          }); // No need for explicit saving at all once storage is on 
 | 
          // svgEditor.showSaveWarning = false; 
 | 
  
 | 
          var curPrefs = svgEditor.curPrefs; 
 | 
  
 | 
          for (var key in curPrefs) { 
 | 
            if (curPrefs.hasOwnProperty(key)) { 
 | 
              // It's our own config, so we don't need to iterate up the prototype chain 
 | 
              var val = curPrefs[key]; 
 | 
              var store = val !== undefined; 
 | 
              key = 'svg-edit-' + key; 
 | 
  
 | 
              if (!store) { 
 | 
                continue; 
 | 
              } 
 | 
  
 | 
              if (storage) { 
 | 
                storage.setItem(key, val); 
 | 
              } else if (window.widget) { 
 | 
                window.widget.setPreferenceForKey(val, key); 
 | 
              } else { 
 | 
                val = encodeURIComponent(val); 
 | 
                document.cookie = encodeURIComponent(key) + '=' + val + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; 
 | 
              } 
 | 
            } 
 | 
          } 
 | 
        }); 
 | 
      } 
 | 
  
 | 
      var loaded = false; 
 | 
      return { 
 | 
        name: 'storage', 
 | 
        langReady: function () { 
 | 
          var _langReady = _asyncToGenerator( 
 | 
          /*#__PURE__*/ 
 | 
          regeneratorRuntime.mark(function _callee(_ref) { 
 | 
            var importLocale, _$$deparam$querystrin, storagePrompt, confirmSetStorage, message, storagePrefsAndContent, storagePrefsOnly, storagePrefs, storageNoPrefsOrContent, storageNoPrefs, rememberLabel, rememberTooltip, options, oldContainerWidth, oldContainerMarginLeft, oldContentHeight, oldContainerHeight; 
 | 
  
 | 
            return regeneratorRuntime.wrap(function _callee$(_context) { 
 | 
              while (1) { 
 | 
                switch (_context.prev = _context.next) { 
 | 
                  case 0: 
 | 
                    importLocale = _ref.importLocale; 
 | 
                    _$$deparam$querystrin = $.deparam.querystring(true), storagePrompt = _$$deparam$querystrin.storagePrompt; 
 | 
                    _context.next = 4; 
 | 
                    return importLocale(); 
 | 
  
 | 
                  case 4: 
 | 
                    confirmSetStorage = _context.sent; 
 | 
                    message = confirmSetStorage.message, storagePrefsAndContent = confirmSetStorage.storagePrefsAndContent, storagePrefsOnly = confirmSetStorage.storagePrefsOnly, storagePrefs = confirmSetStorage.storagePrefs, storageNoPrefsOrContent = confirmSetStorage.storageNoPrefsOrContent, storageNoPrefs = confirmSetStorage.storageNoPrefs, rememberLabel = confirmSetStorage.rememberLabel, rememberTooltip = confirmSetStorage.rememberTooltip; // No need to run this one-time dialog again just because the user 
 | 
                    //   changes the language 
 | 
  
 | 
                    if (!loaded) { 
 | 
                      _context.next = 8; 
 | 
                      break; 
 | 
                    } 
 | 
  
 | 
                    return _context.abrupt("return"); 
 | 
  
 | 
                  case 8: 
 | 
                    loaded = true; // Note that the following can load even if "noStorageOnLoad" is 
 | 
                    //   set to false; to avoid any chance of storage, avoid this 
 | 
                    //   extension! (and to avoid using any prior storage, set the 
 | 
                    //   config option "noStorageOnLoad" to true). 
 | 
  
 | 
                    if (!forceStorage && ( // If the URL has been explicitly set to always prompt the 
 | 
                    //  user (e.g., so one can be pointed to a URL where one 
 | 
                    // can alter one's settings, say to prevent future storage)... 
 | 
                    storagePrompt === true || // ...or...if the URL at least doesn't explicitly prevent a 
 | 
                    //  storage prompt (as we use for users who 
 | 
                    // don't want to set cookies at all but who don't want 
 | 
                    // continual prompts about it)... 
 | 
                    storagePrompt !== false && // ...and this user hasn't previously indicated a desire for storage 
 | 
                    !document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/) // ...then show the storage prompt. 
 | 
                    )) { 
 | 
                      options = []; 
 | 
  
 | 
                      if (storage) { 
 | 
                        options.unshift({ 
 | 
                          value: 'prefsAndContent', 
 | 
                          text: storagePrefsAndContent 
 | 
                        }, { 
 | 
                          value: 'prefsOnly', 
 | 
                          text: storagePrefsOnly 
 | 
                        }, { 
 | 
                          value: 'noPrefsOrContent', 
 | 
                          text: storageNoPrefsOrContent 
 | 
                        }); 
 | 
                      } else { 
 | 
                        options.unshift({ 
 | 
                          value: 'prefsOnly', 
 | 
                          text: storagePrefs 
 | 
                        }, { 
 | 
                          value: 'noPrefsOrContent', 
 | 
                          text: storageNoPrefs 
 | 
                        }); 
 | 
                      } // Hack to temporarily provide a wide and high enough dialog 
 | 
  
 | 
  
 | 
                      oldContainerWidth = $('#dialog_container')[0].style.width, oldContainerMarginLeft = $('#dialog_container')[0].style.marginLeft, oldContentHeight = $('#dialog_content')[0].style.height, oldContainerHeight = $('#dialog_container')[0].style.height; 
 | 
                      $('#dialog_content')[0].style.height = '120px'; 
 | 
                      $('#dialog_container')[0].style.height = '170px'; 
 | 
                      $('#dialog_container')[0].style.width = '800px'; 
 | 
                      $('#dialog_container')[0].style.marginLeft = '-400px'; // Open select-with-checkbox dialog 
 | 
                      // From svg-editor.js 
 | 
  
 | 
                      $.select(message, options, function (pref, checked) { 
 | 
                        if (pref && pref !== 'noPrefsOrContent') { 
 | 
                          // Regardless of whether the user opted 
 | 
                          // to remember the choice (and move to a URL which won't 
 | 
                          // ask them again), we have to assume the user 
 | 
                          // doesn't even want to remember their not wanting 
 | 
                          // storage, so we don't set the cookie or continue on with 
 | 
                          //  setting storage on beforeunload 
 | 
                          document.cookie = 'store=' + encodeURIComponent(pref) + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; // 'prefsAndContent' | 'prefsOnly' 
 | 
                          // If the URL was configured to always insist on a prompt, if 
 | 
                          //    the user does indicate a wish to store their info, we 
 | 
                          //    don't want ask them again upon page refresh so move 
 | 
                          //    them instead to a URL which does not always prompt 
 | 
  
 | 
                          if (storagePrompt === true && checked) { 
 | 
                            replaceStoragePrompt(); 
 | 
                            return; 
 | 
                          } 
 | 
                        } else { 
 | 
                          // The user does not wish storage (or cancelled, which we treat equivalently) 
 | 
                          removeStoragePrefCookie(); 
 | 
  
 | 
                          if (pref && // If the user explicitly expresses wish for no storage 
 | 
                          emptyStorageOnDecline) { 
 | 
                            emptyStorage(); 
 | 
                          } 
 | 
  
 | 
                          if (pref && checked) { 
 | 
                            // Open a URL which won't set storage and won't prompt user about storage 
 | 
                            replaceStoragePrompt('false'); 
 | 
                            return; 
 | 
                          } 
 | 
                        } // Reset width/height of dialog (e.g., for use by Export) 
 | 
  
 | 
  
 | 
                        $('#dialog_container')[0].style.width = oldContainerWidth; 
 | 
                        $('#dialog_container')[0].style.marginLeft = oldContainerMarginLeft; 
 | 
                        $('#dialog_content')[0].style.height = oldContentHeight; 
 | 
                        $('#dialog_container')[0].style.height = oldContainerHeight; // It should be enough to (conditionally) add to storage on 
 | 
                        //   beforeunload, but if we wished to update immediately, 
 | 
                        //   we might wish to try setting: 
 | 
                        //       svgEditor.setConfig({noStorageOnLoad: true}); 
 | 
                        //   and then call: 
 | 
                        //       svgEditor.loadContentAndPrefs(); 
 | 
                        // We don't check for noStorageOnLoad here because 
 | 
                        //   the prompt gives the user the option to store data 
 | 
  
 | 
                        setupBeforeUnloadListener(); 
 | 
                        svgEditor.storagePromptState = 'closed'; 
 | 
                        updateCanvas(true); 
 | 
                      }, null, null, { 
 | 
                        label: rememberLabel, 
 | 
                        checked: true, 
 | 
                        tooltip: rememberTooltip 
 | 
                      }); 
 | 
                      svgEditor.storagePromptState = 'waiting'; 
 | 
                    } else if (!noStorageOnLoad || forceStorage) { 
 | 
                      setupBeforeUnloadListener(); 
 | 
                    } 
 | 
  
 | 
                  case 10: 
 | 
                  case "end": 
 | 
                    return _context.stop(); 
 | 
                } 
 | 
              } 
 | 
            }, _callee, this); 
 | 
          })); 
 | 
  
 | 
          return function langReady(_x) { 
 | 
            return _langReady.apply(this, arguments); 
 | 
          }; 
 | 
        }() 
 | 
      }; 
 | 
    } 
 | 
  }; 
 | 
  
 | 
  return extStorage; 
 | 
  
 | 
}()); 
 |