<!--
Copyright (C) 2015 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.
-->

<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html">

<dom-module id="gr-ajax">
  <template>
    <iron-ajax id="xhr"
        auto="[[auto]]"
        url="[[url]]"
        params="[[params]]"
        json-prefix=")]}'"
        last-response="{{lastResponse}}"
        loading="{{loading}}"
        on-response="_handleResponse"
        on-error="_handleError"
        debounce-duration="300"></iron-ajax>
  </template>
  <script>
  (function() {
    'use strict';

    Polymer({
      is: 'gr-ajax',

      /**
       * Fired when a response is received.
       *
       * @event response
       */

      /**
       * Fired when an error is received.
       *
       * @event error
       */

      hostAttributes: {
        hidden: true
      },

      properties: {
        auto: {
          type: Boolean,
          value: false,
        },
        url: String,
        params: {
          type: Object,
          value: function() {
            return {};
          },
        },
        lastResponse: {
          type: Object,
          notify: true,
        },
        loading: {
          type: Boolean,
          notify: true,
        },
      },

      ready: function() {
        // Used for debugging which element a request came from.
        var headers = this.$.xhr.headers;
        headers['x-requesting-element-id'] = this.id || 'gr-ajax (no id)';
        this.$.xhr.headers = headers;
      },

      generateRequest: function() {
        return this.$.xhr.generateRequest();
      },

      _handleResponse: function(e, req) {
        this.fire('response', req, {bubbles: false});
      },

      _handleError: function(e, req) {
        this.fire('error', req, {bubbles: false});
      },

    });
  })();
  </script>
</dom-module>
