- add sources.
[platform/framework/web/crosswalk.git] / src / components / autofill / core / browser / autofill_country.cc
1 // Copyright 2013 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 #include "components/autofill/core/browser/autofill_country.h"
6
7 #include <stddef.h>
8 #include <stdint.h>
9 #include <map>
10 #include <utility>
11
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h"
15 #include "base/stl_util.h"
16 #include "base/strings/string_util.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "grit/component_strings.h"
19 #include "third_party/icu/source/common/unicode/locid.h"
20 #include "third_party/icu/source/common/unicode/uloc.h"
21 #include "third_party/icu/source/common/unicode/unistr.h"
22 #include "third_party/icu/source/common/unicode/urename.h"
23 #include "third_party/icu/source/common/unicode/utypes.h"
24 #include "third_party/icu/source/i18n/unicode/coll.h"
25 #include "third_party/icu/source/i18n/unicode/ucol.h"
26 #include "ui/base/l10n/l10n_util.h"
27
28 namespace autofill {
29 namespace {
30
31 // The maximum capacity needed to store a locale up to the country code.
32 const size_t kLocaleCapacity =
33     ULOC_LANG_CAPACITY + ULOC_SCRIPT_CAPACITY + ULOC_COUNTRY_CAPACITY + 1;
34
35 struct CountryData {
36   int postal_code_label_id;
37   int state_label_id;
38   AddressRequiredFields address_required_fields;
39 };
40
41 struct StaticCountryData {
42   char country_code[3];
43   CountryData country_data;
44 };
45
46 // Maps country codes to localized label string identifiers.
47 const StaticCountryData kCountryData[] = {
48   { "AD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
49             IDS_AUTOFILL_FIELD_LABEL_PARISH,
50             ADDRESS_REQUIRES_STATE } },
51   { "AE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
52             IDS_AUTOFILL_FIELD_LABEL_EMIRATE,
53             ADDRESS_REQUIRES_STATE } },
54   { "AF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
55             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
56             ADDRESS_REQUIREMENTS_UNKNOWN } },
57   { "AG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
58             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
59             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
60   { "AI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
61             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
62             ADDRESS_REQUIREMENTS_UNKNOWN } },
63   { "AL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
64             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
65             ADDRESS_REQUIREMENTS_UNKNOWN } },
66   { "AM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
67             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
68             ADDRESS_REQUIREMENTS_UNKNOWN } },
69   { "AN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
70             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
71             ADDRESS_REQUIREMENTS_UNKNOWN } },
72   { "AO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
73             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
74             ADDRESS_REQUIREMENTS_UNKNOWN } },
75   { "AQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
76             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
77             ADDRESS_REQUIREMENTS_UNKNOWN } },
78   { "AR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
79             IDS_AUTOFILL_FIELD_LABEL_STATE,
80             ADDRESS_REQUIREMENTS_UNKNOWN } },
81   { "AS", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
82             IDS_AUTOFILL_FIELD_LABEL_STATE,
83             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
84   { "AT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
85             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
86             ADDRESS_REQUIRES_CITY_ZIP } },
87   { "AU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
88             IDS_AUTOFILL_FIELD_LABEL_STATE,
89             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
90   { "AW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
91             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
92             ADDRESS_REQUIREMENTS_UNKNOWN } },
93   { "AX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
94             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
95             ADDRESS_REQUIRES_CITY_ZIP } },
96   { "AZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
97             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
98             ADDRESS_REQUIREMENTS_UNKNOWN } },
99   { "BA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
100             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
101             ADDRESS_REQUIREMENTS_UNKNOWN } },
102   { "BB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
103             IDS_AUTOFILL_FIELD_LABEL_PARISH,
104             ADDRESS_REQUIREMENTS_UNKNOWN } },
105   { "BD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
106             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
107             ADDRESS_REQUIREMENTS_UNKNOWN } },
108   { "BE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
109             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
110             ADDRESS_REQUIRES_CITY_ZIP } },
111   { "BF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
112             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
113             ADDRESS_REQUIREMENTS_UNKNOWN } },
114   { "BG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
115             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
116             ADDRESS_REQUIREMENTS_UNKNOWN } },
117   { "BH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
118             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
119             ADDRESS_REQUIREMENTS_UNKNOWN } },
120   { "BI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
121             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
122             ADDRESS_REQUIREMENTS_UNKNOWN } },
123   { "BJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
124             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
125             ADDRESS_REQUIREMENTS_UNKNOWN } },
126   { "BL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
127             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
128             ADDRESS_REQUIRES_CITY_ZIP } },
129   { "BM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
130             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
131             ADDRESS_REQUIREMENTS_UNKNOWN } },
132   { "BN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
133             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
134             ADDRESS_REQUIREMENTS_UNKNOWN } },
135   { "BO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
136             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
137             ADDRESS_REQUIREMENTS_UNKNOWN } },
138   { "BR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
139             IDS_AUTOFILL_FIELD_LABEL_STATE,
140             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
141   { "BS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
142             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
143             ADDRESS_REQUIREMENTS_UNKNOWN } },
144   { "BT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
145             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
146             ADDRESS_REQUIREMENTS_UNKNOWN } },
147   { "BV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
148             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
149             ADDRESS_REQUIREMENTS_UNKNOWN } },
150   { "BW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
151             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
152             ADDRESS_REQUIREMENTS_UNKNOWN } },
153   { "BY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
154             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
155             ADDRESS_REQUIREMENTS_UNKNOWN } },
156   { "BZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
157             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
158             ADDRESS_REQUIREMENTS_UNKNOWN } },
159   { "CA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
160             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
161             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
162   { "CC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
163             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
164             ADDRESS_REQUIREMENTS_UNKNOWN } },
165   { "CD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
166             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
167             ADDRESS_REQUIREMENTS_UNKNOWN } },
168   { "CF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
169             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
170             ADDRESS_REQUIREMENTS_UNKNOWN } },
171   { "CG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
172             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
173             ADDRESS_REQUIREMENTS_UNKNOWN } },
174   { "CH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
175             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
176             ADDRESS_REQUIRES_CITY_ZIP } },
177   { "CI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
178             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
179             ADDRESS_REQUIREMENTS_UNKNOWN } },
180   { "CK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
181             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
182             ADDRESS_REQUIREMENTS_UNKNOWN } },
183   { "CL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
184             IDS_AUTOFILL_FIELD_LABEL_STATE,
185             ADDRESS_REQUIREMENTS_UNKNOWN } },
186   { "CM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
187             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
188             ADDRESS_REQUIREMENTS_UNKNOWN } },
189   { "CN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
190             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
191             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
192   { "CO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
193             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
194             ADDRESS_REQUIREMENTS_UNKNOWN } },
195   { "CR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
196             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
197             ADDRESS_REQUIREMENTS_UNKNOWN } },
198   { "CS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
199             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
200             ADDRESS_REQUIREMENTS_UNKNOWN } },
201   { "CV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
202             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
203             ADDRESS_REQUIREMENTS_UNKNOWN } },
204   { "CX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
205             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
206             ADDRESS_REQUIREMENTS_UNKNOWN } },
207   { "CY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
208             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
209             ADDRESS_REQUIREMENTS_UNKNOWN } },
210   { "CZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
211             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
212             ADDRESS_REQUIREMENTS_UNKNOWN } },
213   { "DE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
214             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
215             ADDRESS_REQUIRES_CITY_ZIP } },
216   { "DJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
217             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
218             ADDRESS_REQUIREMENTS_UNKNOWN } },
219   { "DK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
220             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
221             ADDRESS_REQUIRES_CITY_ZIP } },
222   { "DM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
223             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
224             ADDRESS_REQUIREMENTS_UNKNOWN } },
225   { "DO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
226             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
227             ADDRESS_REQUIREMENTS_UNKNOWN } },
228   { "DZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
229             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
230             ADDRESS_REQUIREMENTS_UNKNOWN } },
231   { "EC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
232             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
233             ADDRESS_REQUIREMENTS_UNKNOWN } },
234   { "EE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
235             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
236             ADDRESS_REQUIREMENTS_UNKNOWN } },
237   { "EG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
238             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
239             ADDRESS_REQUIREMENTS_UNKNOWN } },
240   { "EH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
241             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
242             ADDRESS_REQUIREMENTS_UNKNOWN } },
243   { "ER", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
244             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
245             ADDRESS_REQUIREMENTS_UNKNOWN } },
246   { "ES", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
247             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
248             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
249   { "ET", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
250             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
251             ADDRESS_REQUIREMENTS_UNKNOWN } },
252   { "FI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
253             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
254             ADDRESS_REQUIRES_CITY_ZIP } },
255   { "FJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
256             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
257             ADDRESS_REQUIREMENTS_UNKNOWN } },
258   { "FK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
259             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
260             ADDRESS_REQUIRES_CITY_ZIP } },
261   { "FM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
262             IDS_AUTOFILL_FIELD_LABEL_STATE,
263             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
264   { "FO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
265             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
266             ADDRESS_REQUIREMENTS_UNKNOWN } },
267   { "FR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
268             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
269             ADDRESS_REQUIRES_CITY_ZIP } },
270   { "GA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
271             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
272             ADDRESS_REQUIREMENTS_UNKNOWN } },
273   { "GB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
274             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
275             ADDRESS_REQUIRES_CITY_ZIP } },
276   { "GD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
277             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
278             ADDRESS_REQUIREMENTS_UNKNOWN } },
279   { "GE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
280             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
281             ADDRESS_REQUIREMENTS_UNKNOWN } },
282   { "GF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
283             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
284             ADDRESS_REQUIRES_CITY_ZIP } },
285   { "GG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
286             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
287             ADDRESS_REQUIRES_CITY_ZIP } },
288   { "GH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
289             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
290             ADDRESS_REQUIREMENTS_UNKNOWN } },
291   { "GI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
292             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
293             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
294   { "GL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
295             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
296             ADDRESS_REQUIRES_CITY_ZIP } },
297   { "GM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
298             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
299             ADDRESS_REQUIREMENTS_UNKNOWN } },
300   { "GN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
301             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
302             ADDRESS_REQUIREMENTS_UNKNOWN } },
303   { "GP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
304             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
305             ADDRESS_REQUIRES_CITY_ZIP } },
306   { "GQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
307             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
308             ADDRESS_REQUIREMENTS_UNKNOWN } },
309   { "GR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
310             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
311             ADDRESS_REQUIRES_CITY_ZIP } },
312   { "GS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
313             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
314             ADDRESS_REQUIRES_CITY_ZIP } },
315   { "GT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
316             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
317             ADDRESS_REQUIREMENTS_UNKNOWN } },
318   { "GU", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
319             IDS_AUTOFILL_FIELD_LABEL_STATE,
320             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
321   { "GW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
322             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
323             ADDRESS_REQUIREMENTS_UNKNOWN } },
324   { "GY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
325             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
326             ADDRESS_REQUIREMENTS_UNKNOWN } },
327   { "HK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
328             IDS_AUTOFILL_FIELD_LABEL_AREA,
329             ADDRESS_REQUIRES_STATE } },
330   { "HM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
331             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
332             ADDRESS_REQUIREMENTS_UNKNOWN } },
333   { "HN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
334             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
335             ADDRESS_REQUIRES_CITY_STATE } },
336   { "HR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
337             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
338             ADDRESS_REQUIREMENTS_UNKNOWN } },
339   { "HT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
340             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
341             ADDRESS_REQUIREMENTS_UNKNOWN } },
342   { "HU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
343             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
344             ADDRESS_REQUIREMENTS_UNKNOWN } },
345   { "ID", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
346             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
347             ADDRESS_REQUIREMENTS_UNKNOWN } },
348   { "IE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
349             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
350             ADDRESS_REQUIREMENTS_UNKNOWN } },
351   { "IL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
352             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
353             ADDRESS_REQUIREMENTS_UNKNOWN } },
354   { "IM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
355             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
356             ADDRESS_REQUIRES_CITY_ZIP } },
357   { "IN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
358             IDS_AUTOFILL_FIELD_LABEL_STATE,
359             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
360   { "IO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
361             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
362             ADDRESS_REQUIRES_CITY_ZIP } },
363   { "IQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
364             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
365             ADDRESS_REQUIRES_CITY_STATE } },
366   { "IS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
367             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
368             ADDRESS_REQUIREMENTS_UNKNOWN } },
369   { "IT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
370             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
371             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
372   { "JE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
373             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
374             ADDRESS_REQUIRES_CITY_ZIP } },
375   { "JM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
376             IDS_AUTOFILL_FIELD_LABEL_PARISH,
377             ADDRESS_REQUIRES_CITY_STATE } },
378   { "JO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
379             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
380             ADDRESS_REQUIREMENTS_UNKNOWN } },
381   { "JP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
382             IDS_AUTOFILL_FIELD_LABEL_PREFECTURE,
383             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
384   { "KE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
385             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
386             ADDRESS_REQUIREMENTS_UNKNOWN } },
387   { "KG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
388             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
389             ADDRESS_REQUIREMENTS_UNKNOWN } },
390   { "KH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
391             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
392             ADDRESS_REQUIREMENTS_UNKNOWN } },
393   { "KI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
394             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
395             ADDRESS_REQUIREMENTS_UNKNOWN } },
396   { "KM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
397             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
398             ADDRESS_REQUIREMENTS_UNKNOWN } },
399   { "KN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
400             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
401             ADDRESS_REQUIRES_CITY_STATE } },
402   { "KP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
403             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
404             ADDRESS_REQUIREMENTS_UNKNOWN } },
405   { "KR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
406             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
407             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
408   { "KW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
409             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
410             ADDRESS_REQUIREMENTS_UNKNOWN } },
411   { "KY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
412             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
413             ADDRESS_REQUIRES_STATE } },
414   { "KZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
415             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
416             ADDRESS_REQUIREMENTS_UNKNOWN } },
417   { "LA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
418             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
419             ADDRESS_REQUIREMENTS_UNKNOWN } },
420   { "LB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
421             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
422             ADDRESS_REQUIREMENTS_UNKNOWN } },
423   { "LC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
424             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
425             ADDRESS_REQUIREMENTS_UNKNOWN } },
426   { "LI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
427             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
428             ADDRESS_REQUIRES_CITY_ZIP } },
429   { "LK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
430             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
431             ADDRESS_REQUIREMENTS_UNKNOWN } },
432   { "LR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
433             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
434             ADDRESS_REQUIREMENTS_UNKNOWN } },
435   { "LS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
436             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
437             ADDRESS_REQUIREMENTS_UNKNOWN } },
438   { "LT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
439             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
440             ADDRESS_REQUIREMENTS_UNKNOWN } },
441   { "LU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
442             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
443             ADDRESS_REQUIRES_CITY_ZIP } },
444   { "LV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
445             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
446             ADDRESS_REQUIREMENTS_UNKNOWN } },
447   { "LY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
448             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
449             ADDRESS_REQUIREMENTS_UNKNOWN } },
450   { "MA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
451             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
452             ADDRESS_REQUIREMENTS_UNKNOWN } },
453   { "MC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
454             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
455             ADDRESS_REQUIREMENTS_UNKNOWN } },
456   { "MD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
457             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
458             ADDRESS_REQUIREMENTS_UNKNOWN } },
459   { "ME", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
460             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
461             ADDRESS_REQUIREMENTS_UNKNOWN } },
462   { "MF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
463             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
464             ADDRESS_REQUIRES_CITY_ZIP } },
465   { "MG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
466             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
467             ADDRESS_REQUIREMENTS_UNKNOWN } },
468   { "MH", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
469             IDS_AUTOFILL_FIELD_LABEL_STATE,
470             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
471   { "MK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
472             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
473             ADDRESS_REQUIREMENTS_UNKNOWN } },
474   { "ML", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
475             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
476             ADDRESS_REQUIREMENTS_UNKNOWN } },
477   { "MN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
478             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
479             ADDRESS_REQUIREMENTS_UNKNOWN } },
480   { "MO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
481             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
482             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
483   { "MP", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
484             IDS_AUTOFILL_FIELD_LABEL_STATE,
485             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
486   { "MQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
487             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
488             ADDRESS_REQUIRES_CITY_ZIP } },
489   { "MR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
490             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
491             ADDRESS_REQUIREMENTS_UNKNOWN } },
492   { "MS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
493             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
494             ADDRESS_REQUIREMENTS_UNKNOWN } },
495   { "MT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
496             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
497             ADDRESS_REQUIREMENTS_UNKNOWN } },
498   { "MU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
499             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
500             ADDRESS_REQUIREMENTS_UNKNOWN } },
501   { "MV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
502             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
503             ADDRESS_REQUIREMENTS_UNKNOWN } },
504   { "MW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
505             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
506             ADDRESS_REQUIREMENTS_UNKNOWN } },
507   { "MX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
508             IDS_AUTOFILL_FIELD_LABEL_STATE,
509             ADDRESS_REQUIRES_CITY_ZIP } },
510   { "MY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
511             IDS_AUTOFILL_FIELD_LABEL_STATE,
512             ADDRESS_REQUIRES_CITY_ZIP } },
513   { "MZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
514             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
515             ADDRESS_REQUIREMENTS_UNKNOWN } },
516   { "NA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
517             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
518             ADDRESS_REQUIREMENTS_UNKNOWN } },
519   { "NC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
520             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
521             ADDRESS_REQUIRES_CITY_ZIP } },
522   { "NE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
523             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
524             ADDRESS_REQUIREMENTS_UNKNOWN } },
525   { "NF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
526             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
527             ADDRESS_REQUIREMENTS_UNKNOWN } },
528   { "NG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
529             IDS_AUTOFILL_FIELD_LABEL_STATE,
530             ADDRESS_REQUIREMENTS_UNKNOWN } },
531   { "NI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
532             IDS_AUTOFILL_FIELD_LABEL_DEPARTMENT,
533             ADDRESS_REQUIREMENTS_UNKNOWN } },
534   { "NL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
535             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
536             ADDRESS_REQUIRES_CITY_ZIP } },
537   { "NO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
538             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
539             ADDRESS_REQUIRES_CITY_ZIP } },
540   { "NP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
541             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
542             ADDRESS_REQUIREMENTS_UNKNOWN } },
543   { "NR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
544             IDS_AUTOFILL_FIELD_LABEL_DISTRICT,
545             ADDRESS_REQUIRES_STATE } },
546   { "NU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
547             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
548             ADDRESS_REQUIREMENTS_UNKNOWN } },
549   { "NZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
550             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
551             ADDRESS_REQUIRES_CITY_ZIP } },
552   { "OM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
553             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
554             ADDRESS_REQUIREMENTS_UNKNOWN } },
555   { "PA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
556             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
557             ADDRESS_REQUIREMENTS_UNKNOWN } },
558   { "PE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
559             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
560             ADDRESS_REQUIREMENTS_UNKNOWN } },
561   { "PF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
562             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
563             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
564   { "PG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
565             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
566             ADDRESS_REQUIRES_CITY_STATE } },
567   { "PH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
568             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
569             ADDRESS_REQUIRES_CITY } },
570   { "PK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
571             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
572             ADDRESS_REQUIREMENTS_UNKNOWN } },
573   { "PL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
574             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
575             ADDRESS_REQUIRES_CITY_ZIP } },
576   { "PM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
577             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
578             ADDRESS_REQUIRES_CITY_ZIP } },
579   { "PN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
580             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
581             ADDRESS_REQUIRES_CITY_ZIP } },
582   { "PR", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
583             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
584             ADDRESS_REQUIRES_CITY_ZIP } },
585   { "PS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
586             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
587             ADDRESS_REQUIREMENTS_UNKNOWN } },
588   { "PT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
589             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
590             ADDRESS_REQUIRES_CITY_ZIP } },
591   { "PW", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
592             IDS_AUTOFILL_FIELD_LABEL_STATE,
593             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
594   { "PY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
595             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
596             ADDRESS_REQUIREMENTS_UNKNOWN } },
597   { "QA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
598             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
599             ADDRESS_REQUIREMENTS_UNKNOWN } },
600   { "RE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
601             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
602             ADDRESS_REQUIRES_CITY_ZIP } },
603   { "RO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
604             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
605             ADDRESS_REQUIREMENTS_UNKNOWN } },
606   { "RS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
607             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
608             ADDRESS_REQUIREMENTS_UNKNOWN } },
609   { "RU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
610             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
611             ADDRESS_REQUIRES_CITY_ZIP } },
612   { "RW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
613             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
614             ADDRESS_REQUIREMENTS_UNKNOWN } },
615   { "SA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
616             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
617             ADDRESS_REQUIREMENTS_UNKNOWN } },
618   { "SB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
619             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
620             ADDRESS_REQUIREMENTS_UNKNOWN } },
621   { "SC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
622             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
623             ADDRESS_REQUIREMENTS_UNKNOWN } },
624   { "SE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
625             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
626             ADDRESS_REQUIRES_CITY_ZIP } },
627   { "SG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
628             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
629             ADDRESS_REQUIRES_ZIP } },
630   { "SH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
631             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
632             ADDRESS_REQUIRES_CITY_ZIP } },
633   { "SI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
634             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
635             ADDRESS_REQUIREMENTS_UNKNOWN } },
636   { "SJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
637             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
638             ADDRESS_REQUIRES_CITY_ZIP } },
639   { "SK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
640             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
641             ADDRESS_REQUIREMENTS_UNKNOWN } },
642   { "SL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
643             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
644             ADDRESS_REQUIREMENTS_UNKNOWN } },
645   { "SM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
646             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
647             ADDRESS_REQUIRES_ZIP } },
648   { "SN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
649             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
650             ADDRESS_REQUIREMENTS_UNKNOWN } },
651   { "SO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
652             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
653             ADDRESS_REQUIRES_CITY_STATE } },
654   { "SR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
655             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
656             ADDRESS_REQUIREMENTS_UNKNOWN } },
657   { "ST", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
658             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
659             ADDRESS_REQUIREMENTS_UNKNOWN } },
660   { "SV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
661             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
662             ADDRESS_REQUIRES_CITY_STATE } },
663   { "SZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
664             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
665             ADDRESS_REQUIREMENTS_UNKNOWN } },
666   { "TC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
667             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
668             ADDRESS_REQUIRES_CITY_ZIP } },
669   { "TD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
670             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
671             ADDRESS_REQUIREMENTS_UNKNOWN } },
672   { "TF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
673             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
674             ADDRESS_REQUIREMENTS_UNKNOWN } },
675   { "TG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
676             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
677             ADDRESS_REQUIREMENTS_UNKNOWN } },
678   { "TH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
679             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
680             ADDRESS_REQUIREMENTS_UNKNOWN } },
681   { "TJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
682             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
683             ADDRESS_REQUIREMENTS_UNKNOWN } },
684   { "TK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
685             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
686             ADDRESS_REQUIREMENTS_UNKNOWN } },
687   { "TL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
688             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
689             ADDRESS_REQUIREMENTS_UNKNOWN } },
690   { "TM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
691             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
692             ADDRESS_REQUIREMENTS_UNKNOWN } },
693   { "TN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
694             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
695             ADDRESS_REQUIREMENTS_UNKNOWN } },
696   { "TO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
697             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
698             ADDRESS_REQUIREMENTS_UNKNOWN } },
699   { "TR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
700             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
701             ADDRESS_REQUIRES_CITY_ZIP } },
702   { "TT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
703             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
704             ADDRESS_REQUIREMENTS_UNKNOWN } },
705   { "TV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
706             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
707             ADDRESS_REQUIREMENTS_UNKNOWN } },
708   { "TW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
709             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
710             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
711   { "TZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
712             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
713             ADDRESS_REQUIREMENTS_UNKNOWN } },
714   { "UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
715             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
716             ADDRESS_REQUIREMENTS_UNKNOWN } },
717   { "UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
718             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
719             ADDRESS_REQUIREMENTS_UNKNOWN } },
720   { "UM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
721             IDS_AUTOFILL_FIELD_LABEL_STATE,
722             ADDRESS_REQUIRES_CITY_STATE } },
723   { "US", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
724             IDS_AUTOFILL_FIELD_LABEL_STATE,
725             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
726   { "UY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
727             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
728             ADDRESS_REQUIREMENTS_UNKNOWN } },
729   { "UZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
730             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
731             ADDRESS_REQUIREMENTS_UNKNOWN } },
732   { "VA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
733             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
734             ADDRESS_REQUIREMENTS_UNKNOWN } },
735   { "VC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
736             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
737             ADDRESS_REQUIREMENTS_UNKNOWN } },
738   { "VE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
739             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
740             ADDRESS_REQUIRES_CITY_STATE } },
741   { "VG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
742             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
743             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
744   { "VI", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
745             IDS_AUTOFILL_FIELD_LABEL_STATE,
746             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
747   { "VN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
748             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
749             ADDRESS_REQUIRES_CITY } },
750   { "VU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
751             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
752             ADDRESS_REQUIREMENTS_UNKNOWN } },
753   { "WF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
754             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
755             ADDRESS_REQUIRES_CITY_ZIP } },
756   { "WS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
757             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
758             ADDRESS_REQUIREMENTS_UNKNOWN } },
759   { "YE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
760             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
761             ADDRESS_REQUIRES_CITY } },
762   { "YT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
763             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
764             ADDRESS_REQUIRES_CITY_ZIP } },
765   { "ZA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
766             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
767             ADDRESS_REQUIRES_CITY_ZIP } },
768   { "ZM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
769             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
770             ADDRESS_REQUIRES_CITY } },
771   { "ZW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
772             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
773             ADDRESS_REQUIREMENTS_UNKNOWN } },
774 };
775
776 // A singleton class that encapsulates a map from country codes to country data.
777 class CountryDataMap {
778  public:
779   // A const iterator over the wrapped map data.
780   typedef std::map<std::string, CountryData>::const_iterator Iterator;
781
782   static CountryDataMap* GetInstance();
783   static const Iterator Begin();
784   static const Iterator End();
785   static const Iterator Find(const std::string& country_code);
786
787  private:
788   CountryDataMap();
789   friend struct DefaultSingletonTraits<CountryDataMap>;
790
791   std::map<std::string, CountryData> country_data_;
792
793   DISALLOW_COPY_AND_ASSIGN(CountryDataMap);
794 };
795
796 // static
797 CountryDataMap* CountryDataMap::GetInstance() {
798   return Singleton<CountryDataMap>::get();
799 }
800
801 CountryDataMap::CountryDataMap() {
802   // Add all the countries we have explicit data for.
803   for (size_t i = 0; i < arraysize(kCountryData); ++i) {
804     const StaticCountryData& static_data = kCountryData[i];
805     country_data_.insert(std::make_pair(static_data.country_code,
806                                         static_data.country_data));
807   }
808
809   // Add any other countries that ICU knows about, falling back to default data
810   // values.
811   for (const char* const* country_pointer = icu::Locale::getISOCountries();
812        *country_pointer;
813        ++country_pointer) {
814     std::string country_code = *country_pointer;
815     if (!country_data_.count(country_code)) {
816       CountryData data = {
817         IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
818         IDS_AUTOFILL_FIELD_LABEL_PROVINCE
819       };
820       country_data_.insert(std::make_pair(country_code, data));
821     }
822   }
823 }
824
825 const CountryDataMap::Iterator CountryDataMap::Begin() {
826   return GetInstance()->country_data_.begin();
827 }
828
829 const CountryDataMap::Iterator CountryDataMap::End() {
830   return GetInstance()->country_data_.end();
831 }
832
833 const CountryDataMap::Iterator CountryDataMap::Find(
834     const std::string& country_code) {
835   return GetInstance()->country_data_.find(country_code);
836 }
837
838 // A singleton class that encapsulates mappings from country names to their
839 // corresponding country codes.
840 class CountryNames {
841  public:
842   static CountryNames* GetInstance();
843
844   // Returns the country code corresponding to |country|, which should be a
845   // country code or country name localized to |locale|.
846   const std::string GetCountryCode(const base::string16& country,
847                                    const std::string& locale);
848
849  private:
850   CountryNames();
851   ~CountryNames();
852   friend struct DefaultSingletonTraits<CountryNames>;
853
854   // Populates |locales_to_localized_names_| with the mapping of country names
855   // localized to |locale| to their corresponding country codes.
856   void AddLocalizedNamesForLocale(const std::string& locale);
857
858   // Interprets |country_name| as a full country name localized to the given
859   // |locale| and returns the corresponding country code stored in
860   // |locales_to_localized_names_|, or an empty string if there is none.
861   const std::string GetCountryCodeForLocalizedName(
862       const base::string16& country_name,
863       const std::string& locale);
864
865   // Returns an ICU collator -- i.e. string comparator -- appropriate for the
866   // given |locale|.
867   icu::Collator* GetCollatorForLocale(const std::string& locale);
868
869   // Returns the ICU sort key corresponding to |str| for the given |collator|.
870   // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
871   // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
872   // the |buffer| is resized.
873   const std::string GetSortKey(const icu::Collator& collator,
874                                const base::string16& str,
875                                scoped_ptr<uint8_t[]>* buffer,
876                                int32_t* buffer_size) const;
877
878   // Maps from common country names, including 2- and 3-letter country codes,
879   // to the corresponding 2-letter country codes. The keys are uppercase ASCII
880   // strings.
881   std::map<std::string, std::string> common_names_;
882
883   // The outer map keys are ICU locale identifiers.
884   // The inner maps map from localized country names to their corresponding
885   // country codes. The inner map keys are ICU collation sort keys corresponding
886   // to the target localized country name.
887   std::map<std::string, std::map<std::string, std::string> >
888       locales_to_localized_names_;
889
890   // Maps ICU locale names to their corresponding collators.
891   std::map<std::string, icu::Collator*> collators_;
892
893   DISALLOW_COPY_AND_ASSIGN(CountryNames);
894 };
895
896 // static
897 CountryNames* CountryNames::GetInstance() {
898   return Singleton<CountryNames>::get();
899 }
900
901 CountryNames::CountryNames() {
902   // Add 2- and 3-letter ISO country codes.
903   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
904        it != CountryDataMap::End();
905        ++it) {
906     const std::string& country_code = it->first;
907     std::string iso3_country_code =
908         icu::Locale(NULL, country_code.c_str()).getISO3Country();
909
910     common_names_.insert(std::make_pair(country_code, country_code));
911     common_names_.insert(std::make_pair(iso3_country_code, country_code));
912   }
913
914   // Add a few other common synonyms.
915   common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
916   common_names_.insert(std::make_pair("U.S.A.", "US"));
917   common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
918   common_names_.insert(std::make_pair("UK", "GB"));
919   common_names_.insert(std::make_pair("BRASIL", "BR"));
920   common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
921 }
922
923 CountryNames::~CountryNames() {
924   STLDeleteContainerPairSecondPointers(collators_.begin(),
925                                        collators_.end());
926 }
927
928 const std::string CountryNames::GetCountryCode(const base::string16& country,
929                                                const std::string& locale) {
930   // First, check common country names, including 2- and 3-letter country codes.
931   std::string country_utf8 = UTF16ToUTF8(StringToUpperASCII(country));
932   std::map<std::string, std::string>::const_iterator result =
933       common_names_.find(country_utf8);
934   if (result != common_names_.end())
935     return result->second;
936
937   // Next, check country names localized to |locale|.
938   std::string country_code = GetCountryCodeForLocalizedName(country, locale);
939   if (!country_code.empty())
940     return country_code;
941
942   // Finally, check country names localized to US English.
943   return GetCountryCodeForLocalizedName(country, "en_US");
944 }
945
946 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) {
947   // Nothing to do if we've previously added the localized names for the given
948   // |locale|.
949   if (locales_to_localized_names_.count(locale))
950     return;
951
952   std::map<std::string, std::string> localized_names;
953   const icu::Collator* collator = GetCollatorForLocale(locale);
954   int32_t buffer_size = 1000;
955   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
956
957   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
958        it != CountryDataMap::End();
959        ++it) {
960     const std::string& country_code = it->first;
961     base::string16 country_name = l10n_util::GetDisplayNameForCountry(
962         country_code, locale);
963     std::string sort_key = GetSortKey(*collator,
964                                       country_name,
965                                       &buffer,
966                                       &buffer_size);
967
968     localized_names.insert(std::make_pair(sort_key, country_code));
969   }
970
971   locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
972 }
973
974 const std::string CountryNames::GetCountryCodeForLocalizedName(
975     const base::string16& country_name,
976     const std::string& locale) {
977   AddLocalizedNamesForLocale(locale);
978
979   icu::Collator* collator = GetCollatorForLocale(locale);
980
981   // As recommended[1] by ICU, initialize the buffer size to four times the
982   // source string length.
983   // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
984   int32_t buffer_size = country_name.size() * 4;
985   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
986   std::string sort_key = GetSortKey(*collator,
987                                     country_name,
988                                     &buffer,
989                                     &buffer_size);
990
991   const std::map<std::string, std::string>& localized_names =
992       locales_to_localized_names_[locale];
993   std::map<std::string, std::string>::const_iterator result =
994       localized_names.find(sort_key);
995
996   if (result != localized_names.end())
997     return result->second;
998
999   return std::string();
1000 }
1001
1002 icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) {
1003   if (!collators_.count(locale)) {
1004     icu::Locale icu_locale(locale.c_str());
1005     UErrorCode ignored = U_ZERO_ERROR;
1006     icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored));
1007
1008     // Compare case-insensitively and ignoring punctuation.
1009     ignored = U_ZERO_ERROR;
1010     collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
1011     ignored = U_ZERO_ERROR;
1012     collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
1013
1014     collators_.insert(std::make_pair(locale, collator));
1015   }
1016
1017   return collators_[locale];
1018 }
1019
1020 const std::string CountryNames::GetSortKey(const icu::Collator& collator,
1021                                            const base::string16& str,
1022                                            scoped_ptr<uint8_t[]>* buffer,
1023                                            int32_t* buffer_size) const {
1024   DCHECK(buffer);
1025   DCHECK(buffer_size);
1026
1027   icu::UnicodeString icu_str(str.c_str(), str.length());
1028   int32_t expected_size = collator.getSortKey(icu_str, buffer->get(),
1029                                               *buffer_size);
1030   if (expected_size > *buffer_size) {
1031     // If there wasn't enough space, grow the buffer and try again.
1032     *buffer_size = expected_size;
1033     buffer->reset(new uint8_t[*buffer_size]);
1034     DCHECK(buffer->get());
1035
1036     expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size);
1037     DCHECK_EQ(*buffer_size, expected_size);
1038   }
1039
1040   return std::string(reinterpret_cast<const char*>(buffer->get()));
1041 }
1042
1043 }  // namespace
1044
1045 AutofillCountry::AutofillCountry(const std::string& country_code,
1046                                  const std::string& locale) {
1047   const CountryDataMap::Iterator result = CountryDataMap::Find(country_code);
1048   DCHECK(result != CountryDataMap::End());
1049   const CountryData& data = result->second;
1050
1051   country_code_ = country_code;
1052   name_ = l10n_util::GetDisplayNameForCountry(country_code, locale);
1053   postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id);
1054   state_label_ = l10n_util::GetStringUTF16(data.state_label_id);
1055   address_required_fields_ = data.address_required_fields;
1056 }
1057
1058 AutofillCountry::~AutofillCountry() {
1059 }
1060
1061 // static
1062 void AutofillCountry::GetAvailableCountries(
1063     std::vector<std::string>* country_codes) {
1064   DCHECK(country_codes);
1065
1066   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
1067        it != CountryDataMap::End();
1068        ++it) {
1069     country_codes->push_back(it->first);
1070   }
1071 }
1072
1073 // static
1074 const std::string AutofillCountry::CountryCodeForLocale(
1075     const std::string& locale) {
1076   // Add likely subtags to the locale. In particular, add any likely country
1077   // subtags -- e.g. for locales like "ru" that only include the language.
1078   std::string likely_locale;
1079   UErrorCode error_ignored = U_ZERO_ERROR;
1080   uloc_addLikelySubtags(locale.c_str(),
1081                         WriteInto(&likely_locale, kLocaleCapacity),
1082                         kLocaleCapacity,
1083                         &error_ignored);
1084
1085   // Extract the country code.
1086   std::string country_code = icu::Locale(likely_locale.c_str()).getCountry();
1087
1088   // Default to the United States if we have no better guess.
1089   if (CountryDataMap::Find(country_code) == CountryDataMap::End())
1090     return "US";
1091
1092   return country_code;
1093 }
1094
1095 // static
1096 const std::string AutofillCountry::GetCountryCode(const base::string16& country,
1097                                                   const std::string& locale) {
1098   return CountryNames::GetInstance()->GetCountryCode(country, locale);
1099 }
1100
1101 AutofillCountry::AutofillCountry(const std::string& country_code,
1102                                  const base::string16& name,
1103                                  const base::string16& postal_code_label,
1104                                  const base::string16& state_label)
1105     : country_code_(country_code),
1106       name_(name),
1107       postal_code_label_(postal_code_label),
1108       state_label_(state_label) {
1109 }
1110
1111 }  // namespace autofill