2014-10-13 12:28:00 -04:00
|
|
|
define [
|
2016-08-17 12:34:17 -04:00
|
|
|
"base",
|
|
|
|
"directives/creditCards"
|
2018-04-16 05:52:33 -04:00
|
|
|
"libs/recurly-4.8.5"
|
2014-10-13 12:28:00 -04:00
|
|
|
], (App)->
|
|
|
|
|
2018-08-15 15:11:58 -04:00
|
|
|
App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, abTestManager, $http, sixpack, event_tracking, ccUtils, ipCookie)->
|
2014-12-22 07:55:29 -05:00
|
|
|
throw new Error("Recurly API Library Missing.") if typeof recurly is "undefined"
|
2016-10-13 08:47:05 -04:00
|
|
|
|
2014-10-13 12:28:00 -04:00
|
|
|
$scope.currencyCode = MultiCurrencyPricing.currencyCode
|
|
|
|
$scope.plans = MultiCurrencyPricing.plans
|
2018-04-12 17:11:52 -04:00
|
|
|
$scope.planCode = window.plan_code
|
2018-08-15 15:11:58 -04:00
|
|
|
$scope.plansVariant = ipCookie('plansVariant')
|
2014-10-13 12:28:00 -04:00
|
|
|
|
2014-11-24 11:21:03 -05:00
|
|
|
$scope.switchToStudent = ()->
|
2016-10-13 08:47:05 -04:00
|
|
|
currentPlanCode = window.plan_code
|
|
|
|
planCode = currentPlanCode.replace('collaborator', 'student')
|
2018-08-15 15:11:58 -04:00
|
|
|
event_tracking.sendMB 'subscription-form-switch-to-student', { plan: window.plan_code, variant: $scope.plansVariant }
|
2016-10-13 08:47:05 -04:00
|
|
|
window.location = "/user/subscription/new?planCode=#{planCode}¤cy=#{$scope.currencyCode}&cc=#{$scope.data.coupon}"
|
2014-12-18 12:48:23 -05:00
|
|
|
|
2018-08-15 15:11:58 -04:00
|
|
|
event_tracking.sendMB "subscription-form", { plan : window.plan_code, variant: $scope.plansVariant }
|
2014-12-22 10:07:55 -05:00
|
|
|
|
2016-08-24 06:02:53 -04:00
|
|
|
$scope.paymentMethod =
|
|
|
|
value: "credit_card"
|
2014-12-22 10:51:50 -05:00
|
|
|
|
2014-12-18 12:48:23 -05:00
|
|
|
$scope.data =
|
2014-12-28 12:16:21 -05:00
|
|
|
first_name: ""
|
|
|
|
last_name: ""
|
|
|
|
postal_code: ""
|
|
|
|
address1 : ""
|
|
|
|
address2 : ""
|
2015-01-19 15:27:01 -05:00
|
|
|
state:""
|
2014-12-28 12:16:21 -05:00
|
|
|
city:""
|
2015-01-07 08:16:19 -05:00
|
|
|
country:window.countryCode
|
2015-02-02 12:18:06 -05:00
|
|
|
coupon: window.couponCode
|
2018-04-16 05:10:25 -04:00
|
|
|
|
|
|
|
$scope.validation = {}
|
2014-12-22 10:07:55 -05:00
|
|
|
|
2014-12-28 12:16:21 -05:00
|
|
|
$scope.processing = false
|
|
|
|
|
2018-04-13 11:29:01 -04:00
|
|
|
recurly.configure
|
|
|
|
publicKey: window.recurlyApiKey
|
|
|
|
style:
|
|
|
|
all:
|
2018-04-13 12:32:20 -04:00
|
|
|
fontFamily: '"Open Sans", sans-serif',
|
|
|
|
fontSize: '16px',
|
2018-04-16 05:10:25 -04:00
|
|
|
fontColor: '#7a7a7a'
|
2018-04-13 11:29:01 -04:00
|
|
|
month:
|
2018-04-16 05:10:25 -04:00
|
|
|
placeholder: 'MM'
|
2018-04-13 11:29:01 -04:00
|
|
|
year:
|
2018-04-16 05:10:25 -04:00
|
|
|
placeholder: 'YY'
|
2018-04-13 11:29:01 -04:00
|
|
|
cvv:
|
2018-04-16 05:10:25 -04:00
|
|
|
placeholder: 'CVV'
|
|
|
|
|
2014-12-22 10:07:55 -05:00
|
|
|
|
2014-12-22 07:55:29 -05:00
|
|
|
pricing = recurly.Pricing()
|
|
|
|
window.pricing = pricing
|
2014-12-18 13:59:29 -05:00
|
|
|
|
2015-02-02 12:18:06 -05:00
|
|
|
initialPricing = pricing
|
|
|
|
.plan(window.plan_code, { quantity: 1 })
|
|
|
|
.address({country: $scope.data.country})
|
|
|
|
.tax({tax_code: 'digital', vat_number: ''})
|
|
|
|
.currency($scope.currencyCode)
|
|
|
|
.coupon($scope.data.coupon)
|
|
|
|
.done()
|
2014-12-22 10:51:50 -05:00
|
|
|
|
|
|
|
pricing.on "change", =>
|
|
|
|
$scope.planName = pricing.items.plan.name
|
2015-01-07 08:16:19 -05:00
|
|
|
$scope.price = pricing.price
|
2015-01-29 05:44:42 -05:00
|
|
|
$scope.trialLength = pricing.items.plan.trial?.length
|
2015-02-10 13:05:39 -05:00
|
|
|
$scope.monthlyBilling = pricing.items.plan.period.length == 1
|
2016-08-19 09:51:07 -04:00
|
|
|
|
2015-11-17 06:42:03 -05:00
|
|
|
if pricing.items?.coupon?.discount?.type == "percent"
|
|
|
|
basePrice = parseInt(pricing.price.base.plan.unit)
|
|
|
|
$scope.normalPrice = basePrice
|
2015-11-17 07:23:27 -05:00
|
|
|
if pricing.items.coupon.applies_for_months > 0 and pricing.items.coupon?.discount?.rate and pricing.items.coupon?.applies_for_months?
|
|
|
|
$scope.discountMonths = pricing.items.coupon?.applies_for_months
|
|
|
|
$scope.discountRate = pricing.items.coupon?.discount?.rate * 100
|
|
|
|
|
2015-11-17 06:42:03 -05:00
|
|
|
if pricing.price?.taxes[0]?.rate?
|
|
|
|
$scope.normalPrice += (basePrice * pricing.price.taxes[0].rate)
|
2014-12-22 10:51:50 -05:00
|
|
|
$scope.$apply()
|
|
|
|
|
2018-04-13 10:57:34 -04:00
|
|
|
|
|
|
|
|
2014-12-22 09:06:39 -05:00
|
|
|
$scope.applyCoupon = ->
|
|
|
|
pricing.coupon($scope.data.coupon).done()
|
2014-12-22 07:55:29 -05:00
|
|
|
|
2015-03-04 13:08:06 -05:00
|
|
|
$scope.applyVatNumber = ->
|
|
|
|
pricing.tax({tax_code: 'digital', vat_number: $scope.data.vat_number}).done()
|
|
|
|
|
2014-12-22 09:06:39 -05:00
|
|
|
$scope.changeCurrency = (newCurrency)->
|
|
|
|
$scope.currencyCode = newCurrency
|
|
|
|
pricing.currency(newCurrency).done()
|
2014-12-22 07:55:29 -05:00
|
|
|
|
2014-12-22 10:07:55 -05:00
|
|
|
|
2016-08-22 12:03:29 -04:00
|
|
|
$scope.inputHasError = inputHasError = (formItem) ->
|
|
|
|
if !formItem?
|
|
|
|
return false
|
|
|
|
|
|
|
|
return (formItem.$touched && formItem.$invalid)
|
|
|
|
|
|
|
|
$scope.isFormValid = isFormValid = (form) ->
|
2016-08-24 06:02:53 -04:00
|
|
|
if $scope.paymentMethod.value == 'paypal'
|
2016-08-23 08:36:54 -04:00
|
|
|
return $scope.data.country != ""
|
|
|
|
else
|
2018-04-16 05:10:25 -04:00
|
|
|
return form.$valid
|
2016-08-22 12:03:29 -04:00
|
|
|
|
2015-01-07 08:16:19 -05:00
|
|
|
$scope.updateCountry = ->
|
|
|
|
pricing.address({country:$scope.data.country}).done()
|
|
|
|
|
2016-08-22 12:03:29 -04:00
|
|
|
$scope.setPaymentMethod = setPaymentMethod = (method) ->
|
2016-08-24 06:02:53 -04:00
|
|
|
$scope.paymentMethod.value = method;
|
2016-08-22 12:03:29 -04:00
|
|
|
$scope.validation.errorFields = {}
|
|
|
|
$scope.genericError = ""
|
2014-12-18 12:48:23 -05:00
|
|
|
|
2014-12-22 10:51:50 -05:00
|
|
|
completeSubscription = (err, recurly_token_id) ->
|
2015-01-07 11:43:20 -05:00
|
|
|
$scope.validation.errorFields = {}
|
2014-12-23 06:04:54 -05:00
|
|
|
if err?
|
2016-08-23 04:59:46 -04:00
|
|
|
event_tracking.sendMB "subscription-error", err
|
2015-01-29 09:43:27 -05:00
|
|
|
# We may or may not be in a digest loop here depending on
|
|
|
|
# whether recurly could do validation locally, so do it async
|
|
|
|
$scope.$evalAsync () ->
|
2015-01-29 09:22:45 -05:00
|
|
|
$scope.processing = false
|
|
|
|
$scope.genericError = err.message
|
|
|
|
_.each err.fields, (field)-> $scope.validation.errorFields[field] = true
|
2014-12-23 06:04:54 -05:00
|
|
|
else
|
|
|
|
postData =
|
|
|
|
_csrf: window.csrfToken
|
|
|
|
recurly_token_id:recurly_token_id.id
|
|
|
|
subscriptionDetails:
|
2014-12-28 12:16:21 -05:00
|
|
|
currencyCode:pricing.items.currency
|
|
|
|
plan_code:pricing.items.plan.code
|
2015-03-04 12:50:24 -05:00
|
|
|
coupon_code:pricing.items?.coupon?.code || ""
|
2016-08-24 06:02:53 -04:00
|
|
|
isPaypal: $scope.paymentMethod.value == 'paypal'
|
2016-06-24 06:42:58 -04:00
|
|
|
address:
|
2016-06-27 04:44:40 -04:00
|
|
|
address1: $scope.data.address1
|
|
|
|
address2: $scope.data.address2
|
|
|
|
country: $scope.data.country
|
|
|
|
state: $scope.data.state
|
2016-06-27 05:38:10 -04:00
|
|
|
postal_code: $scope.data.postal_code
|
2016-07-12 12:33:24 -04:00
|
|
|
|
2016-08-10 12:29:43 -04:00
|
|
|
event_tracking.sendMB "subscription-form-submitted", {
|
2016-07-12 12:33:24 -04:00
|
|
|
currencyCode : postData.subscriptionDetails.currencyCode,
|
|
|
|
plan_code : postData.subscriptionDetails.plan_code,
|
|
|
|
coupon_code : postData.subscriptionDetails.coupon_code,
|
2018-08-15 15:11:58 -04:00
|
|
|
isPaypal : postData.subscriptionDetails.isPaypal,
|
|
|
|
variant : $scope.plansVariant
|
2016-07-12 12:33:24 -04:00
|
|
|
}
|
|
|
|
|
2016-08-19 09:51:07 -04:00
|
|
|
|
2014-12-23 06:04:54 -05:00
|
|
|
$http.post("/user/subscription/create", postData)
|
2017-06-20 11:04:06 -04:00
|
|
|
.then ()->
|
2018-08-15 15:11:58 -04:00
|
|
|
event_tracking.sendMB "subscription-submission-success", { variant: $scope.plansVariant }
|
2016-10-11 09:07:31 -04:00
|
|
|
window.location.href = "/user/subscription/thank-you"
|
2017-06-20 11:04:06 -04:00
|
|
|
.catch ()->
|
2015-01-29 09:22:45 -05:00
|
|
|
$scope.processing = false
|
2015-02-03 05:41:58 -05:00
|
|
|
$scope.genericError = "Something went wrong processing the request"
|
2014-12-18 13:59:29 -05:00
|
|
|
|
2014-12-22 10:51:50 -05:00
|
|
|
$scope.submit = ->
|
2014-12-28 12:16:21 -05:00
|
|
|
$scope.processing = true
|
2016-08-24 06:02:53 -04:00
|
|
|
if $scope.paymentMethod.value == 'paypal'
|
2014-12-22 10:51:50 -05:00
|
|
|
opts = { description: $scope.planName }
|
|
|
|
recurly.paypal opts, completeSubscription
|
|
|
|
else
|
|
|
|
recurly.token $scope.data, completeSubscription
|
|
|
|
|
|
|
|
|
2018-04-16 10:12:03 -04:00
|
|
|
$scope.countries = [
|
|
|
|
{code:'AF',name:'Afghanistan'},{code:'AL',name:'Albania'},{code:'DZ',name:'Algeria'},{code:'AS',name:'American Samoa'},
|
|
|
|
{code:'AD',name:'Andorra'},{code:'AO',name:'Angola'},{code:'AI',name:'Anguilla'},{code:'AQ',name:'Antarctica'},
|
|
|
|
{code:'AG',name:'Antigua and Barbuda'},{code:'AR',name:'Argentina'},{code:'AM',name:'Armenia'},{code:'AW',name:'Aruba'},
|
|
|
|
{code:'AC',name:'Ascension Island'},{code:'AU',name:'Australia'},{code:'AT',name:'Austria'},{code:'AZ',name:'Azerbaijan'},
|
|
|
|
{code:'BS',name:'Bahamas'},{code:'BH',name:'Bahrain'},{code:'BD',name:'Bangladesh'},{code:'BB',name:'Barbados'},
|
|
|
|
{code:'BE',name:'Belgium'},{code:'BZ',name:'Belize'},{code:'BJ',name:'Benin'},{code:'BM',name:'Bermuda'},
|
|
|
|
{code:'BT',name:'Bhutan'},{code:'BO',name:'Bolivia'},{code:'BA',name:'Bosnia and Herzegovina'},{code:'BW',name:'Botswana'},
|
|
|
|
{code:'BV',name:'Bouvet Island'},{code:'BR',name:'Brazil'},{code:'BQ',name:'British Antarctic Territory'},
|
|
|
|
{code:'IO',name:'British Indian Ocean Territory'},{code:'VG',name:'British Virgin Islands'},{code:'BN',name:'Brunei'},
|
|
|
|
{code:'BG',name:'Bulgaria'},{code:'BF',name:'Burkina Faso'},{code:'BI',name:'Burundi'},{code:'KH',name:'Cambodia'},
|
|
|
|
{code:'CM',name:'Cameroon'},{code:'CA',name:'Canada'},{code:'IC',name:'Canary Islands'},
|
|
|
|
{code:'CT',name:'Canton and Enderbury Islands'},{code:'CV',name:'Cape Verde'},{code:'KY',name:'Cayman Islands'},
|
|
|
|
{code:'CF',name:'Central African Republic'},{code:'EA',name:'Ceuta and Melilla'},{code:'TD',name:'Chad'},
|
|
|
|
{code:'CL',name:'Chile'},{code:'CN',name:'China'},{code:'CX',name:'Christmas Island'},{code:'CP',name:'Clipperton Island'},
|
|
|
|
{code:'CC',name:'Cocos [Keeling] Islands'},{code:'CO',name:'Colombia'},{code:'KM',name:'Comoros'},{code:'CD',name:'Congo [DRC]'},
|
|
|
|
{code:'CK',name:'Cook Islands'},{code:'CR',name:'Costa Rica'},{code:'HR',name:'Croatia'},{code:'CU',name:'Cuba'},
|
|
|
|
{code:'CY',name:'Cyprus'},{code:'CZ',name:'Czech Republic'},{code:'DK',name:'Denmark'},{code:'DG',name:'Diego Garcia'},
|
|
|
|
{code:'DJ',name:'Djibouti'},{code:'DM',name:'Dominica'},{code:'DO',name:'Dominican Republic'},
|
|
|
|
{code:'NQ',name:'Dronning Maud Land'},{code:'TL',name:'East Timor'},{code:'EC',name:'Ecuador'},{code:'EG',name:'Egypt'},
|
|
|
|
{code:'SV',name:'El Salvador'},{code:'EE',name:'Estonia'},{code:'ET',name:'Ethiopia'},
|
|
|
|
{code:'FK',name:'Falkland Islands [Islas Malvinas]'},{code:'FO',name:'Faroe Islands'},{code:'FJ',name:'Fiji'},
|
|
|
|
{code:'FI',name:'Finland'},{code:'FR',name:'France'},{code:'GF',name:'French Guiana'},{code:'PF',name:'French Polynesia'},
|
|
|
|
{code:'TF',name:'French Southern Territories'},{code:'FQ',name:'French Southern and Antarctic Territories'},
|
|
|
|
{code:'GA',name:'Gabon'},{code:'GM',name:'Gambia'},{code:'GE',name:'Georgia'},{code:'DE',name:'Germany'},
|
|
|
|
{code:'GH',name:'Ghana'},{code:'GI',name:'Gibraltar'},{code:'GR',name:'Greece'},{code:'GL',name:'Greenland'},
|
|
|
|
{code:'GD',name:'Grenada'},{code:'GP',name:'Guadeloupe'},{code:'GU',name:'Guam'},{code:'GT',name:'Guatemala'},
|
|
|
|
{code:'GG',name:'Guernsey'},{code:'GW',name:'Guinea-Bissau'},{code:'GY',name:'Guyana'},{code:'HT',name:'Haiti'},
|
|
|
|
{code:'HM',name:'Heard Island and McDonald Islands'},{code:'HN',name:'Honduras'},{code:'HK',name:'Hong Kong'},
|
|
|
|
{code:'HU',name:'Hungary'},{code:'IS',name:'Iceland'},{code:'IN',name:'India'},{code:'ID',name:'Indonesia'},
|
|
|
|
{code:'IE',name:'Ireland'},{code:'IM',name:'Isle of Man'},{code:'IL',name:'Israel'},{code:'IT',name:'Italy'},
|
|
|
|
{code:'JM',name:'Jamaica'},{code:'JP',name:'Japan'},{code:'JE',name:'Jersey'},{code:'JT',name:'Johnston Island'},
|
|
|
|
{code:'JO',name:'Jordan'},{code:'KZ',name:'Kazakhstan'},{code:'KE',name:'Kenya'},{code:'KI',name:'Kiribati'},
|
|
|
|
{code:'KW',name:'Kuwait'},{code:'KG',name:'Kyrgyzstan'},{code:'LA',name:'Laos'},{code:'LV',name:'Latvia'},
|
|
|
|
{code:'LS',name:'Lesotho'},{code:'LY',name:'Libya'},{code:'LI',name:'Liechtenstein'},{code:'LT',name:'Lithuania'},
|
|
|
|
{code:'LU',name:'Luxembourg'},{code:'MO',name:'Macau'},{code:'MK',name:'Macedonia [FYROM]'},{code:'MG',name:'Madagascar'},
|
|
|
|
{code:'MW',name:'Malawi'},{code:'MY',name:'Malaysia'},{code:'MV',name:'Maldives'},{code:'ML',name:'Mali'},
|
|
|
|
{code:'MT',name:'Malta'},{code:'MH',name:'Marshall Islands'},{code:'MQ',name:'Martinique'},{code:'MR',name:'Mauritania'},
|
|
|
|
{code:'MU',name:'Mauritius'},{code:'YT',name:'Mayotte'},{code:'FX',name:'Metropolitan France'},{code:'MX',name:'Mexico'},
|
|
|
|
{code:'FM',name:'Micronesia'},{code:'MI',name:'Midway Islands'},{code:'MD',name:'Moldova'},{code:'MC',name:'Monaco'},
|
|
|
|
{code:'MN',name:'Mongolia'},{code:'ME',name:'Montenegro'},{code:'MS',name:'Montserrat'},{code:'MA',name:'Morocco'},
|
|
|
|
{code:'MZ',name:'Mozambique'},{code:'NA',name:'Namibia'},{code:'NR',name:'Nauru'},{code:'NP',name:'Nepal'},
|
|
|
|
{code:'NL',name:'Netherlands'},{code:'AN',name:'Netherlands Antilles'},{code:'NT',name:'Neutral Zone'},
|
|
|
|
{code:'NC',name:'New Caledonia'},{code:'NZ',name:'New Zealand'},{code:'NI',name:'Nicaragua'},{code:'NE',name:'Niger'},
|
|
|
|
{code:'NG',name:'Nigeria'},{code:'NU',name:'Niue'},{code:'NF',name:'Norfolk Island'},{code:'VD',name:'North Vietnam'},
|
|
|
|
{code:'MP',name:'Northern Mariana Islands'},{code:'NO',name:'Norway'},{code:'OM',name:'Oman'},
|
|
|
|
{code:'QO',name:'Outlying Oceania'},{code:'PC',name:'Pacific Islands Trust Territory'},{code:'PK',name:'Pakistan'},
|
|
|
|
{code:'PW',name:'Palau'},{code:'PS',name:'Palestinian Territories'},{code:'PA',name:'Panama'},{code:'PZ',name:'Panama Canal Zone'},
|
|
|
|
{code:'PY',name:'Paraguay'},{code:'YD',name:'People's Democratic Republic of Yemen'},{code:'PE',name:'Peru'},
|
|
|
|
{code:'PH',name:'Philippines'},{code:'PN',name:'Pitcairn Islands'},{code:'PL',name:'Poland'},{code:'PT',name:'Portugal'},
|
|
|
|
{code:'PR',name:'Puerto Rico'},{code:'QA',name:'Qatar'},{code:'RO',name:'Romania'},{code:'RU',name:'Russia'},
|
|
|
|
{code:'RW',name:'Rwanda'},{code:'RE',name:'Réunion'},{code:'BL',name:'Saint Barthélemy'},
|
|
|
|
{code:'SH',name:'Saint Helena'},{code:'KN',name:'Saint Kitts and Nevis'},{code:'LC',name:'Saint Lucia'},
|
|
|
|
{code:'MF',name:'Saint Martin'},{code:'PM',name:'Saint Pierre and Miquelon'},{code:'VC',name:'Saint Vincent and the Grenadines'},
|
|
|
|
{code:'WS',name:'Samoa'},{code:'SM',name:'San Marino'},{code:'SA',name:'Saudi Arabia'},{code:'SN',name:'Senegal'},
|
|
|
|
{code:'RS',name:'Serbia'},{code:'CS',name:'Serbia and Montenegro'},{code:'SC',name:'Seychelles'},{code:'SL',name:'Sierra Leone'},
|
|
|
|
{code:'SG',name:'Singapore'},{code:'SK',name:'Slovakia'},{code:'SI',name:'Slovenia'},{code:'SB',name:'Solomon Islands'},
|
|
|
|
{code:'ZA',name:'South Africa'},{code:'GS',name:'South Georgia and the South Sandwich Islands'},{code:'KR',name:'South Korea'},
|
|
|
|
{code:'ES',name:'Spain'},{code:'LK',name:'Sri Lanka'},{code:'SR',name:'Suriname'},{code:'SJ',name:'Svalbard and Jan Mayen'},
|
|
|
|
{code:'SZ',name:'Swaziland'},{code:'SE',name:'Sweden'},{code:'CH',name:'Switzerland'},
|
|
|
|
{code:'ST',name:'São Tomé and Príncipe'},{code:'TW',name:'Taiwan'},{code:'TJ',name:'Tajikistan'},
|
|
|
|
{code:'TZ',name:'Tanzania'},{code:'TH',name:'Thailand'},{code:'TG',name:'Togo'},{code:'TK',name:'Tokelau'},{code:'TO',name:'Tonga'},
|
|
|
|
{code:'TT',name:'Trinidad and Tobago'},{code:'TA',name:'Tristan da Cunha'},{code:'TN',name:'Tunisia'},{code:'TR',name:'Turkey'},
|
|
|
|
{code:'TM',name:'Turkmenistan'},{code:'TC',name:'Turks and Caicos Islands'},{code:'TV',name:'Tuvalu'},
|
|
|
|
{code:'UM',name:'U.S. Minor Outlying Islands'},{code:'PU',name:'U.S. Miscellaneous Pacific Islands'},
|
|
|
|
{code:'VI',name:'U.S. Virgin Islands'},{code:'UG',name:'Uganda'},{code:'UA',name:'Ukraine'},{code:'AE',name:'United Arab Emirates'},
|
|
|
|
{code:'GB',name:'United Kingdom'},{code:'US',name:'United States'},{code:'UY',name:'Uruguay'},{code:'UZ',name:'Uzbekistan'},
|
|
|
|
{code:'VU',name:'Vanuatu'},{code:'VA',name:'Vatican City'},{code:'VE',name:'Venezuela'},{code:'VN',name:'Vietnam'},
|
|
|
|
{code:'WK',name:'Wake Island'},{code:'WF',name:'Wallis and Futuna'},{code:'EH',name:'Western Sahara'},{code:'YE',name:'Yemen'},
|
|
|
|
{code:'ZM',name:'Zambia'},{code:'AX',name:'Åland Islandscode:'}
|
2018-08-15 15:11:58 -04:00
|
|
|
]
|