###
 * ISO 3166 country codes
 *
 * See eg https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes
###

iso3166 = [
  {name: "Afghanistan", aliases: ["AF"]},
  {name: "Åland Islands", aliases: ["AX", "Aland Islands"]},
  {name: "Albania", aliases: ["AL"]},
  {name: "Algeria", aliases: ["DZ"]},
  {name: "American Samoa", aliases: ["AS"]},
  {name: "Andorra", aliases: ["AD"]},
  {name: "Angola", aliases: ["AO"]},
  {name: "Anguilla", aliases: ["AI"]},
  {name: "Antarctica", aliases: ["AQ"]},
  {name: "Antigua and Barbuda", aliases: ["AG"]},
  {name: "Argentina", aliases: ["AR"]},
  {name: "Armenia", aliases: ["AM"]},
  {name: "Aruba", aliases: ["AW"]},
  {name: "Australia", aliases: ["AU"]},
  {name: "Austria", aliases: ["AT"]},
  {name: "Azerbaijan", aliases: ["AZ"]},
  {name: "Bahamas", aliases: ["BS"]},
  {name: "Bahrain", aliases: ["BH"]},
  {name: "Bangladesh", aliases: ["BD"]},
  {name: "Barbados", aliases: ["BB"]},
  {name: "Belarus", aliases: ["BY"]},
  {name: "Belgium", aliases: ["BE"]},
  {name: "Belize", aliases: ["BZ"]},
  {name: "Benin", aliases: ["BJ"]},
  {name: "Bermuda", aliases: ["BM"]},
  {name: "Bhutan", aliases: ["BT"]},
  {name: "Bolivia, Plurinational State of", aliases: ["BO", "Bolivia"]},
  {name: "Bonaire, Sint Eustatius and Saba", aliases: ["BQ"]},
  {name: "Bosnia and Herzegovina", aliases: ["BA"]},
  {name: "Botswana", aliases: ["BW"]},
  {name: "Bouvet Island", aliases: ["BV"]},
  {name: "Brazil", aliases: ["BR"]},
  {name: "British Indian Ocean Territory", aliases: ["IO"]},
  {name: "Brunei Darussalam", aliases: ["BN"]},
  {name: "Bulgaria", aliases: ["BG"]},
  {name: "Burkina Faso", aliases: ["BF"]},
  {name: "Burundi", aliases: ["BI"]},
  {name: "Cambodia", aliases: ["KH"]},
  {name: "Cameroon", aliases: ["CM"]},
  {name: "Canada", aliases: ["CA"]},
  {name: "Cape Verde", aliases: ["CV"]},
  {name: "Cayman Islands", aliases: ["KY"]},
  {name: "Central African Republic", aliases: ["CF"]},
  {name: "Chad", aliases: ["TD"]},
  {name: "Chile", aliases: ["CL"]},
  {name: "China", aliases: ["CN"]},
  {name: "Christmas Island", aliases: ["CX"]},
  {name: "Cocos (Keeling) Islands", aliases: ["CC"]},
  {name: "Colombia", aliases: ["CO"]},
  {name: "Comoros", aliases: ["KM"]},
  {name: "Congo", aliases: ["CG"]},
  {name: "Congo, the Democratic Republic of the", aliases: ["CD"]},
  {name: "Cook Islands", aliases: ["CK"]},
  {name: "Costa Rica", aliases: ["CR"]},
  {name: "Côte d'Ivoire", aliases: ["CI"]},
  {name: "Croatia", aliases: ["HR"]},
  {name: "Cuba", aliases: ["CU"]},
  {name: "Curaçao", aliases: ["CW"]},
  {name: "Cyprus", aliases: ["CY"]},
  {name: "Czech Republic", aliases: ["CZ"]},
  {name: "Denmark", aliases: ["DK"]},
  {name: "Djibouti", aliases: ["DJ"]},
  {name: "Dominica", aliases: ["DM"]},
  {name: "Dominican Republic", aliases: ["DO"]},
  {name: "Ecuador", aliases: ["EC"]},
  {name: "Egypt", aliases: ["EG"]},
  {name: "El Salvador", aliases: ["SV"]},
  {name: "Equatorial Guinea", aliases: ["GQ"]},
  {name: "Eritrea", aliases: ["ER"]},
  {name: "Estonia", aliases: ["EE"]},
  {name: "Ethiopia", aliases: ["ET"]},
  {name: "Falkland Islands (Malvinas)", aliases: ["FK"]},
  {name: "Faroe Islands", aliases: ["FO"]},
  {name: "Fiji", aliases: ["FJ"]},
  {name: "Finland", aliases: ["FI"]},
  {name: "France", aliases: ["FR"]},
  {name: "French Guiana", aliases: ["GF"]},
  {name: "French Polynesia", aliases: ["PF"]},
  {name: "French Southern Territories", aliases: ["TF"]},
  {name: "Gabon", aliases: ["GA"]},
  {name: "Gambia", aliases: ["GM"]},
  {name: "Georgia", aliases: ["GE"]},
  {name: "Germany", aliases: ["DE"]},
  {name: "Ghana", aliases: ["GH"]},
  {name: "Gibraltar", aliases: ["GI"]},
  {name: "Greece", aliases: ["GR"]},
  {name: "Greenland", aliases: ["GL"]},
  {name: "Grenada", aliases: ["GD"]},
  {name: "Guadeloupe", aliases: ["GP"]},
  {name: "Guam", aliases: ["GU"]},
  {name: "Guatemala", aliases: ["GT"]},
  {name: "Guernsey", aliases: ["GG"]},
  {name: "Guinea", aliases: ["GN"]},
  {name: "Guinea-Bissau", aliases: ["GW"]},
  {name: "Guyana", aliases: ["GY"]},
  {name: "Haiti", aliases: ["HT"]},
  {name: "Heard Island and McDonald Islands", aliases: ["HM"]},
  {name: "Holy See (Vatican City State)", aliases: ["VA"]},
  {name: "Honduras", aliases: ["HN"]},
  {name: "Hong Kong", aliases: ["HK"]},
  {name: "Hungary", aliases: ["HU"]},
  {name: "Iceland", aliases: ["IS"]},
  {name: "India", aliases: ["IN"]},
  {name: "Indonesia", aliases: ["ID"]},
  {name: "Iran, Islamic Republic of", aliases: ["IR"]},
  {name: "Iraq", aliases: ["IQ"]},
  {name: "Ireland", aliases: ["IE"]},
  {name: "Isle of Man", aliases: ["IM"]},
  {name: "Israel", aliases: ["IL"]},
  {name: "Italy", aliases: ["IT"]},
  {name: "Jamaica", aliases: ["JM"]},
  {name: "Japan", aliases: ["JP"]},
  {name: "Jersey", aliases: ["JE"]},
  {name: "Jordan", aliases: ["JO"]},
  {name: "Kazakhstan", aliases: ["KZ"]},
  {name: "Kenya", aliases: ["KE"]},
  {name: "Kiribati", aliases: ["KI"]},
  {name: "Korea, Democratic People's Republic of", aliases: ["KP"]},
  {name: "Korea, Republic of", aliases: ["KR"]},
  {name: "Kuwait", aliases: ["KW"]},
  {name: "Kyrgyzstan", aliases: ["KG"]},
  {name: "Lao People's Democratic Republic", aliases: ["LA"]},
  {name: "Latvia", aliases: ["LV"]},
  {name: "Lebanon", aliases: ["LB"]},
  {name: "Lesotho", aliases: ["LS"]},
  {name: "Liberia", aliases: ["LR"]},
  {name: "Libya", aliases: ["LY"]},
  {name: "Liechtenstein", aliases: ["LI"]},
  {name: "Lithuania", aliases: ["LT"]},
  {name: "Luxembourg", aliases: ["LU"]},
  {name: "Macao", aliases: ["MO"]},
  {name: "Macedonia, the former Yugoslav Republic of", aliases: ["MK"]},
  {name: "Madagascar", aliases: ["MG"]},
  {name: "Malawi", aliases: ["MW"]},
  {name: "Malaysia", aliases: ["MY"]},
  {name: "Maldives", aliases: ["MV"]},
  {name: "Mali", aliases: ["ML"]},
  {name: "Malta", aliases: ["MT"]},
  {name: "Marshall Islands", aliases: ["MH"]},
  {name: "Martinique", aliases: ["MQ"]},
  {name: "Mauritania", aliases: ["MR"]},
  {name: "Mauritius", aliases: ["MU"]},
  {name: "Mayotte", aliases: ["YT"]},
  {name: "Mexico", aliases: ["MX"]},
  {name: "Micronesia, Federated States of", aliases: ["FM"]},
  {name: "Moldova, Republic of", aliases: ["MD"]},
  {name: "Monaco", aliases: ["MC"]},
  {name: "Mongolia", aliases: ["MN"]},
  {name: "Montenegro", aliases: ["ME"]},
  {name: "Montserrat", aliases: ["MS"]},
  {name: "Morocco", aliases: ["MA"]},
  {name: "Mozambique", aliases: ["MZ"]},
  {name: "Myanmar", aliases: ["MM"]},
  {name: "Namibia", aliases: ["NA"]},
  {name: "Nauru", aliases: ["NR"]},
  {name: "Nepal", aliases: ["NP"]},
  {name: "Netherlands", aliases: ["NL"]},
  {name: "New Caledonia", aliases: ["NC"]},
  {name: "New Zealand", aliases: ["NZ"]},
  {name: "Nicaragua", aliases: ["NI"]},
  {name: "Niger", aliases: ["NE"]},
  {name: "Nigeria", aliases: ["NG"]},
  {name: "Niue", aliases: ["NU"]},
  {name: "Norfolk Island", aliases: ["NF"]},
  {name: "Northern Mariana Islands", aliases: ["MP"]},
  {name: "Norway", aliases: ["NO"]},
  {name: "Oman", aliases: ["OM"]},
  {name: "Pakistan", aliases: ["PK"]},
  {name: "Palau", aliases: ["PW"]},
  {name: "Palestinian Territory, Occupied", aliases: ["PS"]},
  {name: "Panama", aliases: ["PA"]},
  {name: "Papua New Guinea", aliases: ["PG"]},
  {name: "Paraguay", aliases: ["PY"]},
  {name: "Peru", aliases: ["PE"]},
  {name: "Philippines", aliases: ["PH"]},
  {name: "Pitcairn", aliases: ["PN"]},
  {name: "Poland", aliases: ["PL"]},
  {name: "Portugal", aliases: ["PT"]},
  {name: "Puerto Rico", aliases: ["PR"]},
  {name: "Qatar", aliases: ["QA"]},
  {name: "Réunion", aliases: ["RE"]},
  {name: "Romania", aliases: ["RO"]},
  {name: "Russian Federation", aliases: ["RU"]},
  {name: "Rwanda", aliases: ["RW"]},
  {name: "Saint Barthélemy", aliases: ["BL"]},
  {name: "Saint Helena, Ascension and Tristan da Cunha", aliases: ["SH"]},
  {name: "Saint Kitts and Nevis", aliases: ["KN"]},
  {name: "Saint Lucia", aliases: ["LC"]},
  {name: "Saint Martin (French part)", aliases: ["MF"]},
  {name: "Saint Pierre and Miquelon", aliases: ["PM"]},
  {name: "Saint Vincent and the Grenadines", aliases: ["VC"]},
  {name: "Samoa", aliases: ["WS"]},
  {name: "San Marino", aliases: ["SM"]},
  {name: "Sao Tome and Principe", aliases: ["ST"]},
  {name: "Saudi Arabia", aliases: ["SA"]},
  {name: "Senegal", aliases: ["SN"]},
  {name: "Serbia", aliases: ["RS"]},
  {name: "Seychelles", aliases: ["SC"]},
  {name: "Sierra Leone", aliases: ["SL"]},
  {name: "Singapore", aliases: ["SG"]},
  {name: "Sint Maarten (Dutch part)", aliases: ["SX"]},
  {name: "Slovakia", aliases: ["SK"]},
  {name: "Slovenia", aliases: ["SI"]},
  {name: "Solomon Islands", aliases: ["SB"]},
  {name: "Somalia", aliases: ["SO"]},
  {name: "South Africa", aliases: ["ZA"]},
  {name: "South Georgia and the South Sandwich Islands", aliases: ["GS"]},
  {name: "South Sudan", aliases: ["SS"]},
  {name: "Spain", aliases: ["ES"]},
  {name: "Sri Lanka", aliases: ["LK"]},
  {name: "Sudan", aliases: ["SD"]},
  {name: "Suriname", aliases: ["SR"]},
  {name: "Svalbard and Jan Mayen", aliases: ["SJ"]},
  {name: "Swaziland", aliases: ["SZ"]},
  {name: "Sweden", aliases: ["SE"]},
  {name: "Switzerland", aliases: ["CH"]},
  {name: "Syrian Arab Republic", aliases: ["SY"]},
  {name: "Taiwan, Province of China", aliases: ["TW"]},
  {name: "Tajikistan", aliases: ["TJ"]},
  {name: "Tanzania, United Republic of", aliases: ["TZ"]},
  {name: "Thailand", aliases: ["TH"]},
  {name: "Timor-Leste", aliases: ["TL"]},
  {name: "Togo", aliases: ["TG"]},
  {name: "Tokelau", aliases: ["TK"]},
  {name: "Tonga", aliases: ["TO"]},
  {name: "Trinidad and Tobago", aliases: ["TT"]},
  {name: "Tunisia", aliases: ["TN"]},
  {name: "Turkey", aliases: ["TR"]},
  {name: "Turkmenistan", aliases: ["TM"]},
  {name: "Turks and Caicos Islands", aliases: ["TC"]},
  {name: "Tuvalu", aliases: ["TV"]},
  {name: "Uganda", aliases: ["UG"]},
  {name: "Ukraine", aliases: ["UA"]},
  {name: "United Arab Emirates", aliases: ["AE"]},
  {name: "United Kingdom", aliases: ["GB"]},
  {name: "United States", aliases: ["US", "USA", "United States of America"]},
  {name: "United States Minor Outlying Islands", aliases: ["UM"]},
  {name: "Uruguay", aliases: ["UY"]},
  {name: "Uzbekistan", aliases: ["UZ"]},
  {name: "Vanuatu", aliases: ["VU"]},
  {name: "Venezuela, Bolivarian Republic of", aliases: ["VE"]},
  {name: "Viet Nam", aliases: ["VN"]},
  {name: "Virgin Islands, British", aliases: ["VG"]},
  {name: "Virgin Islands, U.S.", aliases: ["VI"]},
  {name: "Wallis and Futuna", aliases: ["WF"]},
  {name: "Western Sahara", aliases: ["EH"]},
  {name: "Yemen", aliases: ["YE"]},
  {name: "Zambia", aliases: ["ZM"]},
  {name: "Zimbabwe", aliases: ["ZW"]}
  ]

# the following is a list of all possible names of all countries
ALL_COUNTRY_IDS = _.flatten(_.map(iso3166, (c) -> [c.name, c.aliases]))

# the following maps aliases and names onto the canonical country name
# eg. USA: United States; United States: United States, etc.
COUNTRY_NAMES_MAP = {}

_.each(iso3166, (country) ->
  name = country.name.toLowerCase()

  COUNTRY_NAMES_MAP[name] = name

  _.each(country.aliases, (alias) ->
    COUNTRY_NAMES_MAP[alias.toLowerCase()] = name
  )
)

COUNTRIES_REX = XRegExp("(#{_.keys(iso3166).join("|")})")


