1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 cr.define('options', function() { 6 const OptionsPage = options.OptionsPage; 7 8 // The GUID of the loaded credit card. 9 var guid_; 10 11 /** 12 * AutofillEditCreditCardOverlay class 13 * Encapsulated handling of the 'Add Page' overlay page. 14 * @class 15 */ 16 function AutofillEditCreditCardOverlay() { 17 OptionsPage.call(this, 'autofillEditCreditCard', 18 templateData.autofillEditCreditCardTitle, 19 'autofill-edit-credit-card-overlay'); 20 } 21 22 cr.addSingletonGetter(AutofillEditCreditCardOverlay); 23 24 AutofillEditCreditCardOverlay.prototype = { 25 __proto__: OptionsPage.prototype, 26 27 /** 28 * Initializes the page. 29 */ 30 initializePage: function() { 31 OptionsPage.prototype.initializePage.call(this); 32 33 var self = this; 34 $('autofill-edit-credit-card-cancel-button').onclick = function(event) { 35 self.dismissOverlay_(); 36 } 37 $('autofill-edit-credit-card-apply-button').onclick = function(event) { 38 self.saveCreditCard_(); 39 self.dismissOverlay_(); 40 } 41 42 self.guid_ = ''; 43 self.hasEditedNumber_ = false; 44 self.clearInputFields_(); 45 self.connectInputEvents_(); 46 self.setDefaultSelectOptions_(); 47 }, 48 49 /** 50 * Clears any uncommitted input, and dismisses the overlay. 51 * @private 52 */ 53 dismissOverlay_: function() { 54 this.clearInputFields_(); 55 this.guid_ = ''; 56 this.hasEditedNumber_ = false; 57 OptionsPage.closeOverlay(); 58 }, 59 60 /** 61 * Aggregates the values in the input fields into an array and sends the 62 * array to the Autofill handler. 63 * @private 64 */ 65 saveCreditCard_: function() { 66 var creditCard = new Array(5); 67 creditCard[0] = this.guid_; 68 creditCard[1] = $('name-on-card').value; 69 creditCard[2] = $('credit-card-number').value; 70 creditCard[3] = $('expiration-month').value; 71 creditCard[4] = $('expiration-year').value; 72 chrome.send('setCreditCard', creditCard); 73 }, 74 75 /** 76 * Connects each input field to the inputFieldChanged_() method that enables 77 * or disables the 'Ok' button based on whether all the fields are empty or 78 * not. 79 * @private 80 */ 81 connectInputEvents_: function() { 82 var ccNumber = $('credit-card-number'); 83 $('name-on-card').oninput = ccNumber.oninput = 84 $('expiration-month').onchange = $('expiration-year').onchange = 85 this.inputFieldChanged_.bind(this); 86 }, 87 88 /** 89 * Checks the values of each of the input fields and disables the 'Ok' 90 * button if all of the fields are empty. 91 * @param {Event} opt_event Optional data for the 'input' event. 92 * @private 93 */ 94 inputFieldChanged_: function(opt_event) { 95 var disabled = !$('name-on-card').value && !$('credit-card-number'); 96 $('autofill-edit-credit-card-apply-button').disabled = disabled; 97 }, 98 99 /** 100 * Sets the default values of the options in the 'Expiration date' select 101 * controls. 102 * @private 103 */ 104 setDefaultSelectOptions_: function() { 105 // Set the 'Expiration month' default options. 106 var expirationMonth = $('expiration-month'); 107 expirationMonth.options.length = 0; 108 for (var i = 1; i <= 12; ++i) { 109 var text; 110 if (i < 10) 111 text = '0' + i; 112 else 113 text = i; 114 115 var option = document.createElement('option'); 116 option.text = text; 117 option.value = text; 118 expirationMonth.add(option, null); 119 } 120 121 // Set the 'Expiration year' default options. 122 var expirationYear = $('expiration-year'); 123 expirationYear.options.length = 0; 124 125 var date = new Date(); 126 var year = parseInt(date.getFullYear()); 127 for (var i = 0; i < 10; ++i) { 128 var text = year + i; 129 var option = document.createElement('option'); 130 option.text = text; 131 option.value = text; 132 expirationYear.add(option, null); 133 } 134 }, 135 136 /** 137 * Clears the value of each input field. 138 * @private 139 */ 140 clearInputFields_: function() { 141 $('name-on-card').value = ''; 142 $('credit-card-number').value = ''; 143 $('expiration-month').selectedIndex = 0; 144 $('expiration-year').selectedIndex = 0; 145 }, 146 147 /** 148 * Sets the value of each input field according to |creditCard| 149 * @private 150 */ 151 setInputFields_: function(creditCard) { 152 $('name-on-card').value = creditCard['nameOnCard']; 153 $('credit-card-number').value = creditCard['creditCardNumber']; 154 155 // The options for the year select control may be out-dated at this point, 156 // e.g. the user opened the options page before midnight on New Year's Eve 157 // and then loaded a credit card profile to edit in the new year, so 158 // reload the select options just to be safe. 159 this.setDefaultSelectOptions_(); 160 161 var idx = parseInt(creditCard['expirationMonth'], 10); 162 $('expiration-month').selectedIndex = idx - 1; 163 164 expYear = creditCard['expirationYear']; 165 var date = new Date(); 166 var year = parseInt(date.getFullYear()); 167 for (var i = 0; i < 10; ++i) { 168 var text = year + i; 169 if (expYear == String(text)) 170 $('expiration-year').selectedIndex = i; 171 } 172 }, 173 174 /** 175 * Loads the credit card data from |creditCard|, sets the input fields based 176 * on this data and stores the GUID of the credit card. 177 * @private 178 */ 179 loadCreditCard_: function(creditCard) { 180 this.setInputFields_(creditCard); 181 this.inputFieldChanged_(); 182 this.guid_ = creditCard['guid']; 183 }, 184 }; 185 186 AutofillEditCreditCardOverlay.clearInputFields = function(title) { 187 AutofillEditCreditCardOverlay.getInstance().clearInputFields_(); 188 }; 189 190 AutofillEditCreditCardOverlay.loadCreditCard = function(creditCard) { 191 AutofillEditCreditCardOverlay.getInstance().loadCreditCard_(creditCard); 192 }; 193 194 AutofillEditCreditCardOverlay.setTitle = function(title) { 195 $('autofill-credit-card-title').textContent = title; 196 }; 197 198 // Export 199 return { 200 AutofillEditCreditCardOverlay: AutofillEditCreditCardOverlay 201 }; 202 }); 203