# CountrySelect module ActionView module Helpers module FormOptionsHelper # Return select and option tags for the given object and method, using country_options_for_select to generate the list of option tags. def country_select(object, method, priority_countries = nil, options = {}, html_options = {}) InstanceTag.new(object, method, self, options.delete(:object)).to_country_select_tag(priority_countries, options, html_options) end # Returns a string of option tags for pretty much any country in the world. Supply a country name as +selected+ to # have it marked as the selected option tag. You can also supply an array of countries as +priority_countries+, so # that they will be listed above the rest of the (long) list. # # NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag. def country_options_for_select(selected = nil, priority_countries = nil) country_options = "" if priority_countries.blank? priority_countries = ["United States", "Argentina", "Australia", "Brasil", "Canada", "Finland", "France", "Germany", "Italy", "Japan", "Mexico", "Norway", "Poland", "Portugal", "Spain", "Sweden", "Russia", "United Kingdom"] end # Add iso code for priority countries priority_countries_iso = COUNTRIES.select{|c| priority_countries.include?(c[0]) } # Add iso code for selected countries if not nil unless selected.nil? selected = COUNTRIES.select{|c| selected.include?(c[1]) }.flatten end country_options += options_for_select(priority_countries_iso, selected) country_options += "\n" other_countries = COUNTRIES.select{|c| !priority_countries.include?(c[0]) } return (country_options + options_for_select(other_countries, selected)).html_safe end # All the countries included in the country_options output. COUNTRIES = [ ['Afghanistan', 'AF'], ['Aland Islands', 'AX'], ['Albania', 'AL'], ['Algeria', 'DZ'], ['American Samoa', 'AS'], ['Andorra', 'AD'], ['Angola', 'AO'], ['Anguilla', 'AI'], ['Antarctica', 'AQ'], ['Antigua and Barbuda', 'AG'], ['Argentina', 'AR'], ['Armenia', 'AM'], ['Aruba', 'AW'], ['Australia', 'AU'], ['Austria', 'AT'], ['Azerbaijan', 'AZ'], ['Bahamas', 'BS'], ['Bahrain', 'BH'], ['Bangladesh', 'BD'], ['Barbados', 'BB'], ['Belarus', 'BY'], ['Belgium', 'BE'], ['Belize', 'BZ'], ['Benin', 'BJ'], ['Bermuda', 'BM'], ['Bhutan', 'BT'], ['Bolivia, Plurinational State of', 'BO'], ['Bonaire, Sint Eustatius and Saba', 'BQ'], ['Bosnia and Herzegovina', 'BA'], ['Botswana', 'BW'], ['Bouvet Island', 'BV'], ['Brazil', 'BR'], ['British Indian Ocean Territory', 'IO'], ['Brunei Darussalam', 'BN'], ['Bulgaria', 'BG'], ['Burkina Faso', 'BF'], ['Burundi', 'BI'], ['Cambodia', 'KH'], ['Cameroon', 'CM'], ['Canada', 'CA'], ['Cape Verde', 'CV'], ['Cayman Islands', 'KY'], ['Central African Republic', 'CF'], ['Chad', 'TD'], ['Chile', 'CL'], ['China', 'CN'], ['Christmas Island', 'CX'], ['Cocos (Keeling) Islands', 'CC'], ['Colombia', 'CO'], ['Comoros', 'KM'], ['Congo', 'CG'], ['Congo, the Democratic Republic of the', 'CD'], ['Cook Islands', 'CK'], ['Costa Rica', 'CR'], ['Cote d\'Ivoire', 'CI'], ['Croatia', 'HR'], ['Cuba', 'CU'], ['Curacao', 'CW'], ['Cyprus', 'CY'], ['Czech Republic', 'CZ'], ['Denmark', 'DK'], ['Djibouti', 'DJ'], ['Dominica', 'DM'], ['Dominican Republic', 'DO'], ['Ecuador', 'EC'], ['Egypt', 'EG'], ['El Salvador', 'SV'], ['Equatorial Guinea', 'GQ'], ['Eritrea', 'ER'], ['Estonia', 'EE'], ['Ethiopia', 'ET'], ['Falkland Islands (Malvinas)', 'FK'], ['Faroe Islands', 'FO'], ['Fiji', 'FJ'], ['Finland', 'FI'], ['France', 'FR'], ['French Guiana', 'GF'], ['French Polynesia', 'PF'], ['French Southern Territories', 'TF'], ['Gabon', 'GA'], ['Gambia', 'GM'], ['Georgia', 'GE'], ['Germany', 'DE'], ['Ghana', 'GH'], ['Gibraltar', 'GI'], ['Greece', 'GR'], ['Greenland', 'GL'], ['Grenada', 'GD'], ['Guadeloupe', 'GP'], ['Guam', 'GU'], ['Guatemala', 'GT'], ['Guernsey', 'GG'], ['Guinea', 'GN'], ['Guinea-Bissau', 'GW'], ['Guyana', 'GY'], ['Haiti', 'HT'], ['Heard Island and McDonald Islands', 'HM'], ['Holy See (Vatican City State)', 'VA'], ['Honduras', 'HN'], ['Hong Kong', 'HK'], ['Hungary', 'HU'], ['Iceland', 'IS'], ['India', 'IN'], ['Indonesia', 'ID'], ['Iran, Islamic Republic of', 'IR'], ['Iraq', 'IQ'], ['Ireland', 'IE'], ['Isle of Man', 'IM'], ['Israel', 'IL'], ['Italy', 'IT'], ['Jamaica', 'JM'], ['Japan', 'JP'], ['Jersey', 'JE'], ['Jordan', 'JO'], ['Kazakhstan', 'KZ'], ['Kenya', 'KE'], ['Kiribati', 'KI'], ['Korea, Democratic People\'s Republic of', 'KP'], ['Korea, Republic of', 'KR'], ['Kosovo', 'XK'], ['Kuwait', 'KW'], ['Kyrgyzstan', 'KG'], ['Lao People\'s Democratic Republic', 'LA'], ['Latvia', 'LV'], ['Lebanon', 'LB'], ['Lesotho', 'LS'], ['Liberia', 'LR'], ['Libya', 'LY'], ['Liechtenstein', 'LI'], ['Lithuania', 'LT'], ['Luxembourg', 'LU'], ['Macao', 'MO'], ['Macedonia, The Former Yugoslav Republic of', 'MK'], ['Madagascar', 'MG'], ['Malawi', 'MW'], ['Malaysia', 'MY'], ['Maldives', 'MV'], ['Mali', 'ML'], ['Malta', 'MT'], ['Marshall Islands', 'MH'], ['Martinique', 'MQ'], ['Mauritania', 'MR'], ['Mauritius', 'MU'], ['Mayotte', 'YT'], ['Mexico', 'MX'], ['Micronesia, Federated States of', 'FM'], ['Moldova, Republic of', 'MD'], ['Monaco', 'MC'], ['Mongolia', 'MN'], ['Montenegro', 'ME'], ['Montserrat', 'MS'], ['Morocco', 'MA'], ['Mozambique', 'MZ'], ['Myanmar', 'MM'], ['Namibia', 'NA'], ['Nauru', 'NR'], ['Nepal', 'NP'], ['Netherlands', 'NL'], ['New Caledonia', 'NC'], ['New Zealand', 'NZ'], ['Nicaragua', 'NI'], ['Niger', 'NE'], ['Nigeria', 'NG'], ['Niue', 'NU'], ['Norfolk Island', 'NF'], ['Northern Mariana Islands', 'MP'], ['Norway', 'NO'], ['Oman', 'OM'], ['Pakistan', 'PK'], ['Palau', 'PW'], ['Palestinian Territory, Occupied', 'PS'], ['Panama', 'PA'], ['Papua New Guinea', 'PG'], ['Paraguay', 'PY'], ['Peru', 'PE'], ['Philippines', 'PH'], ['Pitcairn', 'PN'], ['Poland', 'PL'], ['Portugal', 'PT'], ['Puerto Rico', 'PR'], ['Qatar', 'QA'], ['Reunion', 'RE'], ['Romania', 'RO'], ['Russian Federation', 'RU'], ['Rwanda', 'RW'], ['Saint Barthelemy', 'BL'], ['Saint Helena, Ascension and Tristan da Cunha', 'SH'], ['Saint Kitts and Nevis', 'KN'], ['Saint Lucia', 'LC'], ['Saint Martin (French part)', 'MF'], ['Saint Pierre and Miquelon', 'PM'], ['Saint Vincent and the Grenadines', 'VC'], ['Samoa', 'WS'], ['San Marino', 'SM'], ['Sao Tome and Principe', 'ST'], ['Saudi Arabia', 'SA'], ['Senegal', 'SN'], ['Serbia', 'RS'], ['Seychelles', 'SC'], ['Sierra Leone', 'SL'], ['Singapore', 'SG'], ['Sint Maarten (Dutch part)', 'SX'], ['Slovakia', 'SK'], ['Slovenia', 'SI'], ['Solomon Islands', 'SB'], ['Somalia', 'SO'], ['South Africa', 'ZA'], ['South Georgia and the South Sandwich Islands', 'GS'], ['South Sudan', 'SS'], ['Spain', 'ES'], ['Sri Lanka', 'LK'], ['Sudan', 'SD'], ['Suriname', 'SR'], ['Svalbard and Jan Mayen', 'SJ'], ['Swaziland', 'SZ'], ['Sweden', 'SE'], ['Switzerland', 'CH'], ['Syrian Arab Republic', 'SY'], ['Taiwan, Province of China', 'TW'], ['Tajikistan', 'TJ'], ['Tanzania, United Republic of', 'TZ'], ['Thailand', 'TH'], ['Timor-Leste', 'TL'], ['Togo', 'TG'], ['Tokelau', 'TK'], ['Tonga', 'TO'], ['Trinidad and Tobago', 'TT'], ['Tunisia', 'TN'], ['Turkey', 'TR'], ['Turkmenistan', 'TM'], ['Turks and Caicos Islands', 'TC'], ['Tuvalu', 'TV'], ['Uganda', 'UG'], ['Ukraine', 'UA'], ['United Arab Emirates', 'AE'], ['United Kingdom', 'GB'], ['United States', 'US'], ['United States Minor Outlying Islands', 'UM'], ['Uruguay', 'UY'], ['Uzbekistan', 'UZ'], ['Vanuatu', 'VU'], ['Venezuela, Bolivarian Republic of', 'VE'], ['Viet Nam', 'VN'], ['Virgin Islands, British', 'VG'], ['Virgin Islands, U.S.', 'VI'], ['Wallis and Futuna', 'WF'], ['Western Sahara', 'EH'], ['Yemen', 'YE'], ['Zambia', 'ZM'], ['Zimbabwe', 'ZW'] ].sort unless const_defined?("COUNTRIES") COUNTRIES_HASH = { :AF => 'Afghanistan', :AX => 'Aland Islands', :AL => 'Albania', :DZ => 'Algeria', :AS => 'American Samoa', :AD => 'Andorra', :AO => 'Angola', :AI => 'Anguilla', :AQ => 'Antarctica', :AG => 'Antigua and Barbuda', :AR => 'Argentina', :AM => 'Armenia', :AW => 'Aruba', :AU => 'Australia', :AT => 'Austria', :AZ => 'Azerbaijan', :BS => 'Bahamas', :BH => 'Bahrain', :BD => 'Bangladesh', :BB => 'Barbados', :BY => 'Belarus', :BE => 'Belgium', :BZ => 'Belize', :BJ => 'Benin', :BM => 'Bermuda', :BT => 'Bhutan', :BO => 'Bolivia, Plurinational State of', :BQ => 'Bonaire, Sint Eustatius and Saba', :BA => 'Bosnia and Herzegovina', :BW => 'Botswana', :BV => 'Bouvet Island', :BR => 'Brazil', :IO => 'British Indian Ocean Territory', :BN => 'Brunei Darussalam', :BG => 'Bulgaria', :BF => 'Burkina Faso', :BI => 'Burundi', :KH => 'Cambodia', :CM => 'Cameroon', :CA => 'Canada', :CV => 'Cape Verde', :KY => 'Cayman Islands', :CF => 'Central African Republic', :TD => 'Chad', :CL => 'Chile', :CN => 'China', :CX => 'Christmas Island', :CC => 'Cocos (Keeling) Islands', :CO => 'Colombia', :KM => 'Comoros', :CG => 'Congo', :CD => 'Congo, the Democratic Republic of the', :CK => 'Cook Islands', :CR => 'Costa Rica', :CI => 'Cote d\'Ivoire', :HR => 'Croatia', :CU => 'Cuba', :CW => 'Curacao', :CY => 'Cyprus', :CZ => 'Czech Republic', :DK => 'Denmark', :DJ => 'Djibouti', :DM => 'Dominica', :DO => 'Dominican Republic', :EC => 'Ecuador', :EG => 'Egypt', :SV => 'El Salvador', :GQ => 'Equatorial Guinea', :ER => 'Eritrea', :EE => 'Estonia', :ET => 'Ethiopia', :FK => 'Falkland Islands (Malvinas)', :FO => 'Faroe Islands', :FJ => 'Fiji', :FI => 'Finland', :FR => 'France', :GF => 'French Guiana', :PF => 'French Polynesia', :TF => 'French Southern Territories', :GA => 'Gabon', :GM => 'Gambia', :GE => 'Georgia', :DE => 'Germany', :GH => 'Ghana', :GI => 'Gibraltar', :GR => 'Greece', :GL => 'Greenland', :GD => 'Grenada', :GP => 'Guadeloupe', :GU => 'Guam', :GT => 'Guatemala', :GG => 'Guernsey', :GN => 'Guinea', :GW => 'Guinea-Bissau', :GY => 'Guyana', :HT => 'Haiti', :HM => 'Heard Island and McDonald Islands', :VA => 'Holy See (Vatican City State)', :HN => 'Honduras', :HK => 'Hong Kong', :HU => 'Hungary', :IS => 'Iceland', :IN => 'India', :ID => 'Indonesia', :IR => 'Iran, Islamic Republic of', :IQ => 'Iraq', :IE => 'Ireland', :IM => 'Isle of Man', :IL => 'Israel', :IT => 'Italy', :JM => 'Jamaica', :JP => 'Japan', :JE => 'Jersey', :JO => 'Jordan', :KZ => 'Kazakhstan', :KE => 'Kenya', :KI => 'Kiribati', :KP => 'Korea, Democratic People\'s Republic of', :KR => 'Korea, Republic of', :XK => 'Kosovo', :KW => 'Kuwait', :KG => 'Kyrgyzstan', :LA => 'Lao People\'s Democratic Republic', :LV => 'Latvia', :LB => 'Lebanon', :LS => 'Lesotho', :LR => 'Liberia', :LY => 'Libya', :LI => 'Liechtenstein', :LT => 'Lithuania', :LU => 'Luxembourg', :MO => 'Macao', :MK => 'Macedonia, The Former Yugoslav Republic of', :MG => 'Madagascar', :MW => 'Malawi', :MY => 'Malaysia', :MV => 'Maldives', :ML => 'Mali', :MT => 'Malta', :MH => 'Marshall Islands', :MQ => 'Martinique', :MR => 'Mauritania', :MU => 'Mauritius', :YT => 'Mayotte', :MX => 'Mexico', :FM => 'Micronesia, Federated States of', :MD => 'Moldova, Republic of', :MC => 'Monaco', :MN => 'Mongolia', :ME => 'Montenegro', :MS => 'Montserrat', :MA => 'Morocco', :MZ => 'Mozambique', :MM => 'Myanmar', :NA => 'Namibia', :NR => 'Nauru', :NP => 'Nepal', :NL => 'Netherlands', :NC => 'New Caledonia', :NZ => 'New Zealand', :NI => 'Nicaragua', :NE => 'Niger', :NG => 'Nigeria', :NU => 'Niue', :NF => 'Norfolk Island', :MP => 'Northern Mariana Islands', :NO => 'Norway', :OM => 'Oman', :PK => 'Pakistan', :PW => 'Palau', :PS => 'Palestinian Territory, Occupied', :PA => 'Panama', :PG => 'Papua New Guinea', :PY => 'Paraguay', :PE => 'Peru', :PH => 'Philippines', :PN => 'Pitcairn', :PL => 'Poland', :PT => 'Portugal', :PR => 'Puerto Rico', :QA => 'Qatar', :RE => 'Reunion', :RO => 'Romania', :RU => 'Russian Federation', :RW => 'Rwanda', :BL => 'Saint Barthelemy', :SH => 'Saint Helena, Ascension and Tristan da Cunha', :KN => 'Saint Kitts and Nevis', :LC => 'Saint Lucia', :MF => 'Saint Martin (French part)', :PM => 'Saint Pierre and Miquelon', :VC => 'Saint Vincent and the Grenadines', :WS => 'Samoa', :SM => 'San Marino', :ST => 'Sao Tome and Principe', :SA => 'Saudi Arabia', :SN => 'Senegal', :RS => 'Serbia', :SC => 'Seychelles', :SL => 'Sierra Leone', :SG => 'Singapore', :SX => 'Sint Maarten (Dutch part)', :SK => 'Slovakia', :SI => 'Slovenia', :SB => 'Solomon Islands', :SO => 'Somalia', :ZA => 'South Africa', :GS => 'South Georgia and the South Sandwich Islands', :SS => 'South Sudan', :ES => 'Spain', :LK => 'Sri Lanka', :SD => 'Sudan', :SR => 'Suriname', :SJ => 'Svalbard and Jan Mayen', :SZ => 'Swaziland', :SE => 'Sweden', :CH => 'Switzerland', :SY => 'Syrian Arab Republic', :TW => 'Taiwan, Province of China', :TJ => 'Tajikistan', :TZ => 'Tanzania, United Republic of', :TH => 'Thailand', :TL => 'Timor-Leste', :TG => 'Togo', :TK => 'Tokelau', :TO => 'Tonga', :TT => 'Trinidad and Tobago', :TN => 'Tunisia', :TR => 'Turkey', :TM => 'Turkmenistan', :TC => 'Turks and Caicos Islands', :TV => 'Tuvalu', :UG => 'Uganda', :UA => 'Ukraine', :AE => 'United Arab Emirates', :GB => 'United Kingdom', :US => 'United States', :UM => 'United States Minor Outlying Islands', :UY => 'Uruguay', :UZ => 'Uzbekistan', :VU => 'Vanuatu', :VE => 'Venezuela, Bolivarian Republic of', :VN => 'Viet Nam', :VG => 'Virgin Islands, British', :VI => 'Virgin Islands, U.S.', :WF => 'Wallis and Futuna', :EH => 'Western Sahara', :YE => 'Yemen', :ZM => 'Zambia', :ZW => 'Zimbabwe', :WW => 'Worldwide' } end def country_name(code) return "" if code.blank? return COUNTRIES_HASH[code.to_sym] || code end class InstanceTag def to_country_select_tag(priority_countries, options, html_options) html_options = html_options.stringify_keys add_default_name_and_id(html_options) value = value(object) content_tag("select", add_options( country_options_for_select(value, priority_countries), options, value ), html_options ) end end class FormBuilder def country_select(method, priority_countries = nil, options = {}, html_options = {}) @template.country_select(@object_name, method, priority_countries, options.merge(:object => @object), html_options) end end end end