1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be
321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file.
421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsencr.define('options.autofillOptions', function() {
621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const DeletableItem = options.DeletableItem;
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const DeletableItemList = options.DeletableItemList;
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const InlineEditableItem = options.InlineEditableItem;
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const InlineEditableItemList = options.InlineEditableItemList;
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  /**
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * Creates a new address list item.
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   * @param {Array} entry An array of the form [guid, label].
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   * @constructor
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   * @extends {options.DeletableItem}
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   */
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  function AddressListItem(entry) {
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    var el = cr.doc.createElement('div');
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    el.guid = entry[0];
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    el.label = entry[1];
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.__proto__ = AddressListItem.prototype;
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    el.decorate();
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return el;
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  AddressListItem.prototype = {
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    __proto__: DeletableItem.prototype,
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    /** @inheritDoc */
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    decorate: function() {
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      DeletableItem.prototype.decorate.call(this);
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      // The stored label.
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      var label = this.ownerDocument.createElement('div');
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      label.className = 'autofill-list-item';
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      label.textContent = this.label;
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      this.contentElement.appendChild(label);
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    },
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  /**
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * Creates a new credit card list item.
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * @param {Array} entry An array of the form [guid, label, icon].
453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * @constructor
463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * @extends {options.DeletableItem}
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   */
483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  function CreditCardListItem(entry) {
493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    var el = cr.doc.createElement('div');
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.guid = entry[0];
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.label = entry[1];
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.icon = entry[2];
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.description = entry[3];
543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.__proto__ = CreditCardListItem.prototype;
553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    el.decorate();
563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return el;
583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  }
593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  CreditCardListItem.prototype = {
613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    __proto__: DeletableItem.prototype,
623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /** @inheritDoc */
643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    decorate: function() {
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      DeletableItem.prototype.decorate.call(this);
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      // The stored label.
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      var label = this.ownerDocument.createElement('div');
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      label.className = 'autofill-list-item';
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      label.textContent = this.label;
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.contentElement.appendChild(label);
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      // The credit card icon.
743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      var icon = this.ownerDocument.createElement('image');
753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      icon.src = this.icon;
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      icon.alt = this.description;
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.contentElement.appendChild(icon);
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  };
803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  /**
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * Creates a new value list item.
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @param {AutofillValuesList} list The parent list of this item.
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @param {String} entry A string value.
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @constructor
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @extends {options.InlineEditableItem}
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   */
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  function ValuesListItem(list, entry) {
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    var el = cr.doc.createElement('div');
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.list = list;
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.value = entry;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.__proto__ = ValuesListItem.prototype;
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.decorate();
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return el;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ValuesListItem.prototype = {
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    __proto__: InlineEditableItem.prototype,
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /** @inheritDoc */
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    decorate: function() {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      InlineEditableItem.prototype.decorate.call(this);
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.isPlaceholder = !this.value;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // The stored value.
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var cell = this.createEditableTextCell(this.value);
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.contentElement.appendChild(cell);
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.input = cell.querySelector('input');
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.addEventListener('commitedit', this.onEditCommitted_);
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * Called when committing an edit.
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @param {Event} e The end event.
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @private
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    onEditCommitted_: function(e) {
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var i = this.list.items.indexOf(this);
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (this.input.value == this.list.dataModel.item(i))
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return;
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (this.input.value &&
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this.list.dataModel.indexOf(this.input.value) == -1) {
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Update with new value.
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.list.dataModel.splice(i, 1, this.input.value);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Reject empty values and duplicates.
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.list.dataModel.splice(i, 1);
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /**
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * Creates a new list item for the Add New Item row, which doesn't represent
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * an actual entry in the values list but allows the user to add new
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * values.
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @param {AutofillValuesList} entry The parent list of this item.
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @constructor
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @extends {cr.ui.ValuesListItem}
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   */
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  function ValuesAddRowListItem(list) {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    var el = cr.doc.createElement('div');
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.list = list;
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.__proto__ = ValuesAddRowListItem.prototype;
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    el.decorate();
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return el;
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ValuesAddRowListItem.prototype = {
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    __proto__: ValuesListItem.prototype,
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    decorate: function() {
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ValuesListItem.prototype.decorate.call(this);
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.input.value = '';
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.input.placeholder = this.list.getAttribute('placeholder');
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.deletable = false;
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * Called when committing an edit.  Committing a non-empty value adds it
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * to the end of the values list, leaving this "AddRow" in place.
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @param {Event} e The end event.
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @extends {options.ValuesListItem}
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @private
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    onEditCommitted_: function(e) {
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var i = this.list.items.indexOf(this);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (i < 0 || i >= this.list.dataModel.length)
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return;
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (this.input.value &&
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this.list.dataModel.indexOf(this.input.value) == -1) {
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.list.dataModel.splice(i, 0, this.input.value);
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.input.value = '';
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.list.dataModel.updateIndex(i);
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /**
1863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * Create a new address list.
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   * @constructor
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   * @extends {options.DeletableItemList}
18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen   */
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var AutofillAddressList = cr.ui.define('list');
19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillAddressList.prototype = {
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    __proto__: DeletableItemList.prototype,
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    decorate: function() {
1963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      DeletableItemList.prototype.decorate.call(this);
1973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.addEventListener('blur', this.onBlur_);
1993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /**
2023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     * When the list loses focus, unselect all items in the list.
2033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     * @private
2043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     */
2053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    onBlur_: function() {
2063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.selectionModel.unselectAll();
2073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /** @inheritDoc */
2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    createItem: function(entry) {
2113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      return new AddressListItem(entry);
2123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /** @inheritDoc */
2153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    activateItemAtIndex: function(index) {
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AutofillOptions.loadAddressEditor(this.dataModel.item(index)[0]);
2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /** @inheritDoc */
2203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    deleteItemAtIndex: function(index) {
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AutofillOptions.removeAddress(this.dataModel.item(index)[0]);
2223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  };
2243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  /**
2263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * Create a new credit card list.
2273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * @constructor
2283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   * @extends {options.DeletableItemList}
2293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen   */
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var AutofillCreditCardList = cr.ui.define('list');
2313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillCreditCardList.prototype = {
2333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    __proto__: DeletableItemList.prototype,
2343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    decorate: function() {
2363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      DeletableItemList.prototype.decorate.call(this);
2373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.addEventListener('blur', this.onBlur_);
2393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    /**
2423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     * When the list loses focus, unselect all items in the list.
2433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     * @private
2443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen     */
2453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    onBlur_: function() {
2463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      this.selectionModel.unselectAll();
2473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    },
2483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    /** @inheritDoc */
25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    createItem: function(entry) {
2513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      return new CreditCardListItem(entry);
25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    },
25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    /** @inheritDoc */
25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    activateItemAtIndex: function(index) {
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AutofillOptions.loadCreditCardEditor(this.dataModel.item(index)[0]);
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /** @inheritDoc */
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    deleteItemAtIndex: function(index) {
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AutofillOptions.removeCreditCard(this.dataModel.item(index)[0]);
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /**
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * Create a new value list.
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @constructor
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @extends {options.InlineEditableItemList}
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   */
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var AutofillValuesList = cr.ui.define('list');
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillValuesList.prototype = {
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    __proto__: InlineEditableItemList.prototype,
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    decorate: function() {
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      InlineEditableItemList.prototype.decorate.call(this);
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var self = this;
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      function handleBlur(e) {
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // When the blur event happens we do not know who is getting focus so we
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // delay this a bit until we know if the new focus node is outside the
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // list.
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        var doc = e.target.ownerDocument;
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        window.setTimeout(function() {
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          var activeElement = doc.activeElement;
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (!self.contains(activeElement))
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            self.selectionModel.unselectAll();
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }, 50);
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.addEventListener('blur', handleBlur, true);
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /** @inheritDoc */
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    createItem: function(entry) {
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (entry != null)
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return new ValuesListItem(this, entry);
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      else
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return new ValuesAddRowListItem(this);
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    },
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    /** @inheritDoc */
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    deleteItemAtIndex: function(index) {
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.dataModel.splice(index, 1);
30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    },
30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return {
3093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    AddressListItem: AddressListItem,
3103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    CreditCardListItem: CreditCardListItem,
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ValuesListItem: ValuesListItem,
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ValuesAddRowListItem: ValuesAddRowListItem,
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillAddressList: AutofillAddressList,
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillCreditCardList: AutofillCreditCardList,
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillValuesList: AutofillValuesList,
31621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
31721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen});
318