<!--
@license
Copyright (C) 2016 The Android Open Source Project

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.
-->
<script>
(function(window) {
  'use strict';

  window.Gerrit = window.Gerrit || {};

  /** @polymerBehavior Gerrit.URLEncodingBehavior */
  Gerrit.URLEncodingBehavior = {
    /**
     * Pretty-encodes a URL. Double-encodes the string, and then replaces
     *   benevolent characters for legibility.
     * @param {string} url
     * @param {boolean=} replaceSlashes
     * @return {string}
     */
    encodeURL(url, replaceSlashes) {
      // @see Issue 4255 regarding double-encoding.
      let output = encodeURIComponent(encodeURIComponent(url));
      // @see Issue 4577 regarding more readable URLs.
      output = output.replace(/%253A/g, ':');
      output = output.replace(/%2520/g, '+');
      if (replaceSlashes) {
        output = output.replace(/%252F/g, '/');
      }
      return output;
    },

    /**
     * Single decode for URL components. Will decode plus signs ('+') to spaces.
     * Note: because this function decodes once, it is not the inverse of
     * encodeURL.
     * @param {string} url
     * @return {string}
     */
    singleDecodeURL(url) {
      const withoutPlus = url.replace(/\+/g, '%20');
      return decodeURIComponent(withoutPlus);
    },
  };
})(window);
</script>
