{"version":3,"file":"main-w24EzogQ.js","sources":["../../src/app/options.js","../../src/app/utilities/OraDispatcher.js","../../src/app/constants/Constants.js","../../src/app/stores/Store.js","../../src/app/utilities/WidgetOptions.js","../../src/app/utilities/Http.js","../../src/app/utilities/LocalStorage.js","../../src/app/utilities/BasketService.js","../../src/app/utilities/BasketUtilities.js","../../src/app/stores/BasketStore.js","../../src/app/components/applywizard/deep-link-parser.js","../../src/app/components/applywizard/begin.jsx","../../src/app/utilities/AvailabilityService.js","../../src/app/utilities/Cookies.js","../../src/app/utilities/AdManagerService.js","../../src/app/actions/BasketActionCreators.js","../../src/app/components/applywizard/customer/customer-base.js","../../src/app/components/applywizard/press-enter-to-continue.jsx","../../src/app/components/common/form-group.jsx","../../src/app/components/common/react-onclickoutside.jsx","../../src/app/components/common/country_mobile_data.js","../../src/app/validators/Telephone.js","../../src/app/components/common/react-telephone-input.jsx","../../src/app/components/applywizard/navigation-buttons.jsx","../../src/app/components/common/loading.jsx","../../src/app/components/common/country-list.js","../../src/app/components/common/guess-user-country.js","../../src/app/components/applywizard/customer/customer.jsx","../../src/app/components/applywizard/student/student-base.js","../../src/app/components/common/nationality-list.js","../../src/app/stores/CourseStore.js","../../src/app/components/applywizard/student/student.jsx","../../src/app/components/applywizard/how-to-study.jsx","../../src/app/stores/AvailabilityStore.js","../../src/app/actions/AvailabilityActionCreators.js","../../src/app/stores/TimeZonesStore.js","../../src/app/components/applywizard/what-timezone.jsx","../../src/app/components/applywizard/region-pretty-name-lookup.js","../../src/app/components/applywizard/what-region.jsx","../../src/app/utilities/Ui.js","../../src/app/components/applywizard/course-session-picker.jsx","../../src/app/components/applywizard/what-course.jsx","../../src/app/stores/OptionsStore.js","../../src/app/components/common/react-fit-text.jsx","../../src/app/utilities/permute.js","../../src/app/components/optionspicker/options-picker.jsx","../../src/app/components/applywizard/what-session-options.jsx","../../src/app/utilities/QueryStringParser.js","../../src/app/stores/FiltersStore.js","../../src/app/utilities/SiteService.js","../../src/app/actions/SiteActionCreators.js","../../src/app/components/applywizard/what-site.jsx","../../src/app/actions/UpsellActionCreators.js","../../src/app/components/applywizard/upsells.jsx","../../src/app/components/applywizard/apply-summary.jsx","../../src/app/components/applywizard/what-next.jsx","../../src/app/components/checkout/checkout-pay.jsx","../../src/app/components/checkout/customer-form.jsx","../../src/app/stores/UserStore.js","../../src/app/utilities/AgentService.js","../../src/app/components/common/typeahead.jsx","../../src/app/components/checkout/agent-form.jsx","../../src/app/components/checkout/checkout-customer.jsx","../../src/app/components/checkout/card-icons.jsx","../../src/app/utilities/TermsAndConditionsService.js","../../src/app/actions/TermsAndConditionsCreators.js","../../src/app/utilities/BookingService.js","../../src/app/actions/CheckoutActionCreators.js","../../src/app/validators/common.js","../../src/app/validators/Customer.js","../../src/app/components/applywizard/billing.jsx","../../src/app/components/flywire/flywire-form.jsx","../../src/app/components/common/BaseCheckoutFlywireContainer.js","../../src/app/components/flywire/countdown-timer.jsx","../../src/app/components/applywizard/flywire.jsx","../../src/app/components/applywizard/no-courses-available.jsx","../../src/app/components/applywizard/step-indicator.jsx","../../src/app/components/applywizard/error-boundary.jsx","../../src/app/components/applywizard/apply-wizard.jsx","../../src/app/utilities/CourseService.js","../../src/app/actions/CourseActionCreators.js","../../src/app/utilities/CountryService.js","../../src/app/actions/CountryActionCreators.js","../../src/app/applywizard.jsx","../../src/app/entry-website.js"],"sourcesContent":["// attach to global namespace\r\nvar isLive = location &&\r\n(\r\n location.href.indexOf('www.oxford-royale.co.uk') > -1 ||\r\n location.href.indexOf('webadmin.oxford-royale.co.uk') > -1 ||\r\n location.href.indexOf('portal.oxford-royale.co.uk') > -1 ||\r\n location.href.indexOf('www.oxford-royale.com') > -1 ||\r\n location.href.indexOf('webadmin.oxford-royale.com') > -1 ||\r\n location.href.indexOf('portal.oxford-royale.com') > -1 ||\r\n (location.href.indexOf('apply.oxford-royale.com') > -1 && location.href.indexOf('flywire-test') === -1)\r\n);\r\nif (!global.OraWidgets) { global.OraWidgets = {}; }\r\nif (!global.OraWidgets.Options) { global.OraWidgets.Options = {}; }\r\nif (!global.OraWidgets.Options.minPartPaymentAmount) { global.OraWidgets.Options.minPartPaymentAmount = 500; }\r\nif (!global.OraWidgets.Options.apiEndpoint) {\r\n global.OraWidgets.Options.apiEndpoint = isLive ? 'https://api.oxford-royale.com' : 'https://localhost:44302';\r\n}\r\n\r\nif (!global.OraWidgets.Options.showOnline) { global.OraWidgets.Options.showOnline = false }\r\nif (!global.OraWidgets.Options.coursesPath) { global.OraWidgets.Options.coursesPath = \"/course\" }\r\nif (!global.OraWidgets.Options.applyUrl) { global.OraWidgets.Options.applyUrl = \"/apply\" }\r\nif (!global.OraWidgets.Options.checkoutUrl) { global.OraWidgets.Options.checkoutUrl = \"/checkout\" }\r\nif (!global.OraWidgets.Options.browseUrl) { global.OraWidgets.Options.browseUrl = \"/courses\" }\r\nif (!global.OraWidgets.Options.imagePath) { global.OraWidgets.Options.imagePath = \"https://az707692.vo.msecnd.net/cdn/images/\" }\r\nif (!global.OraWidgets.Options.googleRecaptchaSiteKey) { global.OraWidgets.Options.googleRecaptchaSiteKey = \"6LcxbioUAAAAALOhOY4OVtFkayyWkNDDzj4w0x2W\" }\r\nif (!global.OraWidgets.Options.stripeKey) { global.OraWidgets.Options.stripeKey = \"pk_test_oZZgPzFuYifWb9ZS2izdxlDp\" }\r\nif (!global.OraWidgets.Options.callBackUrl) { global.OraWidgets.Options.callBackUrl = isLive ? 'https://api.oxford-royale.com/Flywire/Callback' : \"https://flywire-api.ora-uat-website.com/Flywire/Callback\" }\r\nif (!global.OraWidgets.Options.applicationInsightsKey && location && (location.href.indexOf('www.oxford-royale.co.uk') > -1 || location.href.indexOf('www.oxford-royale.com') > -1 || location.href.indexOf('apply.oxford-royale.com') > -1)) { global.OraWidgets.Options.applicationInsightsKey = '80ec8bf1-6d8c-4f05-8fe6-addf2e258c67'; }\r\nif (!global.OraWidgets.Options.zenDeskSiteKey) { global.OraWidgets.Options.zenDeskSiteKey = \"6LcxbioUAAAAALOhOY4OVtFkayyWkNDDzj4w0x2W\" }\r\nif (!global.OraWidgets.Options.checkoutPrivacyNoticeTitle) { global.OraWidgets.Options.checkoutPrivacyNoticeTitle = \"How do we use your information?\" }\r\nif (!global.OraWidgets.Options.checkoutPrivacyNoticeBody) {\r\n global.OraWidgets.Options.checkoutPrivacyNoticeBody =\r\n \"

At Oxford Royale Academy, we do our best to help customers and students find the right course for them.

To assist us in doing that, we will store the information you enter into our Checkout form (excluding payment card information), and if you do not or are not able to complete your enrolment we will get in touch with you by email. If you object to this, please do not enter any information into the form.

For more information, please see our Privacy Notices. Thank you.

\";\r\n}\r\n\r\nif (!global.OraWidgets.Options.checkoutMarketingOptInText) { global.OraWidgets.Options.checkoutMarketingOptInText = \"Please tick this box if you would like to receive information about our courses in the future.\" }\r\nif (!global.OraWidgets.Options.checkoutMarketingOptInTextAdmin) { global.OraWidgets.Options.checkoutMarketingOptInTextAdmin = \"Please tick if the customer would like to receive updates and information regarding other courses, products and services from Oxford Royale Academy\" }\r\nif (!global.OraWidgets.Options.checkoutPrivacyPolicy) { global.OraWidgets.Options.checkoutPrivacyPolicy = \"

I accept the Privacy Notice

\" }\r\nif (!global.OraWidgets.Options.cjEnabled) { global.OraWidgets.Options.cjEnabled = false; }\r\nif (!global.OraWidgets.Options.cjType) { global.OraWidgets.Options.cjType = '414210'; }\r\nif (!global.OraWidgets.Options.cjCID) { global.OraWidgets.Options.cjCID = '1555537'; }\r\nif (!global.OraWidgets.Options.cjQueryName) { global.OraWidgets.Options.cjQueryName = 'cjevent'; }\r\nif (!global.OraWidgets.Options.cjCookieMaxAge) { global.OraWidgets.Options.cjCookieMaxAge = 31536000; } // 1 year\r\nif (!global.OraWidgets.Options.isAgentBasket) { global.OraWidgets.Options.isAgentBasket = false; }\r\nif (!global.OraWidgets.Options.paymentEnvironment) { global.OraWidgets.Options.paymentEnvironment = isLive ? \"prod\" : \"demo\"; }\r\nif (!global.OraWidgets.Options.defaultFlywireDestination) { global.OraWidgets.Options.defaultFlywireDestination = isLive ? 'ORR' : 'ORC'; }\r\nif (!global.OraWidgets.Options.flywirePendingMessageTitle) { global.OraWidgets.Options.flywirePendingMessageTitle = 'Thank you for arranging your payment. Your order currently has a status of Pending.'; }\r\nif (!global.OraWidgets.Options.flywirePendingMessageText) {\r\n global.OraWidgets.Options.flywirePendingMessageText = [\r\n 'When we have received the funds from our selected payment partner, Flywire, your order will be Confirmed and we will send you a Confirmation Email, a link to the ORA Portal, and a receipt.',\r\n 'Thank you for choosing Oxford Royale Academy.'\r\n ];\r\n}\r\nif (!global.OraWidgets.Options.flywireErrorMessageTitle) { global.OraWidgets.Options.flywireErrorMessageTitle = \"We're sorry, your payment was not successful.\"; }\r\nif (!global.OraWidgets.Options.flywireErrorMessageText) {\r\n global.OraWidgets.Options.flywireErrorMessageText =\r\n ['Please try again or contact us for assistance.'];\r\n}\r\nif (!global.OraWidgets.Options.ondemandLearningUrl) { global.OraWidgets.Options.ondemandLearningUrl = \"https://oraprep.learnupon.com/store\"; }\r\nif (!global.OraWidgets.Options.virtualTimeZones) {\r\n global.OraWidgets.Options.virtualTimeZones = [\r\n //{ Text: 'Western Hemisphere', Value: 'Western Hemisphere', Offset: '+0' },\r\n { Text: 'Eastern Hemisphere', Value: 'Eastern Hemisphere', Offset: '+11' }\r\n ];\r\n}\r\nif (!global.OraWidgets.Options.showTimesInTimezone) { global.OraWidgets.Options.showTimesInTimezone = false; }\r\nif (!global.OraWidgets.Options.injectCss) {\r\n global.OraWidgets.Options.injectCss = location.href.indexOf('flywire') > -1;\r\n}\r\nif (global.OraWidgets.Options.payTotalDiscount !== false) {\r\n global.OraWidgets.Options.payTotalDiscount = 5;\r\n}","import { Dispatcher } from 'flux';\r\n\r\nexport default new Dispatcher();","import keyMirror from \"keymirror\";\r\n\r\nexport const DATE_FORMAT = \"DD/MM/YYYY\";\r\nexport const ActionTypes = keyMirror({\r\n // Sites\r\n GET_ALL_SITES: null,\r\n\r\n // Courses\r\n GET_COURSE: null,\r\n GET_COURSES: null,\r\n\r\n // Course Types\r\n GET_ALL_COURSE_TYPES: null,\r\n\r\n // Countries\r\n GET_ALL_COUNTRIES: null,\r\n\r\n // Region Session Groups\r\n GET_REGION_SESSION_GROUPS: null,\r\n\r\n // Terms and Conditions\r\n GET_ALL_TERMS_AND_CONDITIONS: null,\r\n\r\n // Agents\r\n GET_ALL_AGENTS: null,\r\n\r\n /* Availability */\r\n GET_TIMEZONES: null,\r\n GET_AVAILABILITY: null,\r\n GET_COURSE_SUGGESTIONS: null,\r\n BEGIN_COURSE_SUGGESTIONS: null,\r\n GET_AGENT_AVAILABILITY: null,\r\n SELECTION_CHOSEN: null,\r\n SELECTION_CLEARED: null,\r\n GET_OPTIONS: null,\r\n CHOOSE_OPTION: null,\r\n CLEAR_OPTIONS: null,\r\n DATES_UPDATED: null,\r\n SELECT_REGION: null,\r\n DESELECT_REGION: null,\r\n\r\n /* Basket */\r\n GET_LINEITEM_STARTED: null,\r\n GET_LINEITEM_FAILURE: null,\r\n GET_LINEITEM_OPTIONS_SUCCESS: null,\r\n GET_LINEITEM_DATA_SUCCESS: null,\r\n ADD_COURSE: null,\r\n REMOVE_COURSE: null,\r\n REPLACE_COURSE: null,\r\n UPDATE_STUDENT: null,\r\n UPDATE_CUSTOMER: null,\r\n CHOOSE_STUDENT: null,\r\n CHOOSE_CUSTOMER: null,\r\n LOAD_BASKET: null,\r\n CLEAR_BASKET: null,\r\n ADDED_UPSELL: null,\r\n DISCOUNTS_FETCHED: null,\r\n\r\n // Filters\r\n UPDATE_FILTER: null,\r\n CLEAR_FILTERS: null,\r\n\r\n // Search\r\n SEARCH_BEGIN: null,\r\n SEARCH_SUCCESS: null,\r\n\r\n // Reservations\r\n MAKE_RESERVATION_STARTED: null,\r\n MAKE_RESERVATION_SUCCESS: null,\r\n MAKE_RESERVATION_FAILURE: null,\r\n MAKE_BOOKING_STARTED: null,\r\n MAKE_BOOKING_SUCCESS: null,\r\n\r\n // Enquiries\r\n BEGIN_ENQUIRY: null,\r\n SEND_ENQUIRY_START: null,\r\n SEND_ENQUIRY_SENT: null,\r\n\r\n // upsells\r\n SEND_UPSELL_REQUEST_BEGIN: null,\r\n SEND_UPSELL_REQUEST_SUCCESS: null,\r\n SEND_UPSELL_REQUEST_FAILURE: null,\r\n\r\n // USERS\r\n WHO_AM_I_SUCCESS: null,\r\n\r\n // Payment\r\n SEND_PAYMENT_STARTED: null,\r\n SEND_PAYMENT_SUCCESS: null,\r\n SEND_PAYMENT_FAILURE: null,\r\n\r\n POLL_PAYMENT_START: null,\r\n POLL_PAYMENT_FINISHED: null,\r\n\r\n CREATE_PAYMENT_INTENT_SUCCESS: null,\r\n});\r\n","import indexOf from 'lodash/indexOf';\r\n\r\nfunction Store() {\r\n this.listeners = [];\r\n}\r\n\r\n// listener registration\r\nStore.prototype.addChangeListener = function(callback) {\r\n this.listeners.push(callback);\r\n};\r\n\r\n// listener de-registration\r\nStore.prototype.removeChangeListener = function(callback) {\r\n if (indexOf(this.listeners, callback) !== -1) {\r\n this.listeners.splice(indexOf(this.listeners, callback), 1);\r\n }\r\n};\r\n\r\n// telling components there's a change with an optional context for those stores that require context\r\nStore.prototype.emitChange = function(context) {\r\n for (var i = 0; i < this.listeners.length; i++) {\r\n this.listeners[i](context);\r\n }\r\n}\r\n\r\nexport default Store;","export default {\r\n apiEndpoint: function() { return global.OraWidgets.Options.apiEndpoint; }\r\n};","// check for jQuery jQuery\r\nif (!jQuery) {\r\n throw \"Ora Widgets require jQuery to be defined\";\r\n}\r\n\r\n// make sure credentials are sent with requests\r\njQuery.ajaxPrefilter(function (options, originalOptions, jqXhr) {\r\n if (options.url.indexOf(global.OraWidgets.Options.apiEndpoint) > -1) {\r\n if (options.xhrFields) {\r\n options.xhrFields.withCredentials = true;\r\n } else {\r\n options.xhrFields = { withCredentials: true };\r\n }\r\n }\r\n});\r\n\r\nfunction get(url, dataType) {\r\n return ajax({\r\n url: url,\r\n method: 'GET',\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction post(url, data, dataType) {\r\n return ajax({\r\n url: url,\r\n method: 'POST',\r\n data: data,\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction put(url, data, dataType) {\r\n return ajax({\r\n url: url,\r\n method: 'PUT',\r\n data: data,\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction del(url) {\r\n return ajax({\r\n url: url,\r\n method: 'DELETE'\r\n });\r\n}\r\n\r\nfunction ajax(options) {\r\n standardiseRequest(options);\r\n return jQuery.ajax(options).fail(handleError);\r\n}\r\n\r\nfunction getQ(url, dataType) {\r\n return queue({\r\n url: url,\r\n method: 'GET',\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction postQ(url, data, dataType) {\r\n return queue({\r\n url: url,\r\n method: 'POST',\r\n data: data,\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction putQ(url, data, dataType) {\r\n return queue({\r\n url: url,\r\n method: 'PUT',\r\n data: data,\r\n dataType: dataType\r\n });\r\n}\r\n\r\nfunction delQ(url) {\r\n return queue({\r\n url: url,\r\n method: 'DELETE'\r\n });\r\n}\r\n\r\n// inspired (COPIED) from https://github.com/Foliotek/AjaxQ/blob/master/ajaxq.js\r\nvar queues = {};\r\nvar activeRequests = {};\r\n\r\nfunction queue(options, queueName) {\r\n if (!queueName) {\r\n queueName = '__default__';\r\n }\r\n\r\n standardiseRequest(options);\r\n var deferred = jQuery.Deferred(),\r\n promise = deferred.promise();\r\n\r\n promise.success = promise.done;\r\n promise.error = promise.fail;\r\n promise.complete = promise.always;\r\n\r\n // Check whether options are to be evaluated at call time or not.\r\n var deferredOpts = typeof options === 'function';\r\n\r\n // Create a deep copy of the arguments, and enqueue this request.\r\n var clonedOptions = !deferredOpts ? jQuery.extend(true, {}, options) : null;\r\n enqueue(function () {\r\n // Send off the ajax request now that the item has been removed from the queue\r\n var jqXhr = jQuery.ajax.apply(global, [deferredOpts ? options() : clonedOptions]);\r\n\r\n // set a reasonable timeout\r\n if (jqXhr.timeout)\r\n jqXhr.timeout(10000);\r\n\r\n // Notify the returned deferred object with the correct context when the jqXHR is done or fails\r\n // Note that 'always' will automatically be fired once one of these are called: http://api.jquery.com/category/deferred-object/.\r\n jqXhr.done(function () {\r\n deferred.resolve.apply(this, arguments);\r\n });\r\n\r\n jqXhr.fail(function () {\r\n deferred.reject.apply(this, arguments);\r\n });\r\n\r\n jqXhr.always(dequeue); // make sure to dequeue the next request AFTER the done and fail callbacks are fired\r\n\r\n return jqXhr;\r\n });\r\n\r\n return promise.fail(handleError);\r\n\r\n // If there is no queue, create an empty one and instantly process this item.\r\n // Otherwise, just add this item onto it for later processing.\r\n function enqueue(cb) {\r\n if (!queues[queueName]) {\r\n queues[queueName] = [];\r\n var xhr = cb();\r\n activeRequests[queueName] = xhr;\r\n }\r\n else {\r\n queues[queueName].push(cb);\r\n }\r\n }\r\n\r\n // Remove the next callback from the queue and fire it off.\r\n // If the queue was empty (this was the last item), delete it from memory so the next one can be instantly processed.\r\n function dequeue() {\r\n if (!queues[queueName]) {\r\n return;\r\n }\r\n var nextCallback = queues[queueName].shift();\r\n if (nextCallback) {\r\n var xhr = nextCallback();\r\n activeRequests[queueName] = xhr;\r\n }\r\n else {\r\n delete queues[queueName];\r\n delete activeRequests[queueName];\r\n }\r\n }\r\n}\r\n\r\nfunction standardiseRequest(options) {\r\n if (!options || !options.hasOwnProperty('dataType') || !options.dataType) {\r\n options.dataType = 'json';\r\n }\r\n}\r\n\r\nvar lastError;\r\nfunction handleError(response) {\r\n if (response.status == 401 && window.location.href.indexOf('/Opportunity')) {\r\n return; // swallow these as we allow unauthed access\r\n }\r\n\r\n if (!lastError || (new Date()).getTime() - lastError.getTime() > 10000) {\r\n lastError = new Date();\r\n console.error('There was an un-anticipated error. Please refresh the browser and check that your recent edits have worked');\r\n }\r\n}\r\n\r\nvar isQueueRunning = function (qname) {\r\n return (queues.hasOwnProperty(qname) && queues[qname].length > 0) || activeRequests.hasOwnProperty(qname);\r\n};\r\n\r\n\r\nvar isAnyQueueRunning = function () {\r\n for (var i in queues) {\r\n if (queues.hasOwnProperty(i)) {\r\n if (isQueueRunning(i)) return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\njQuery(global).on('beforeunload', function () {\r\n if ((jQuery.active || isAnyQueueRunning()) && window.location.href.indexOf('www.oxford-royale.co.uk') === -1 && window.location.href.indexOf('www.oxford-royale.com') === -1) {\r\n return 'There are items being saved. Please click cancel and wait a few seconds before trying to leave the page';\r\n }\r\n});\r\n\r\nexport default {\r\n get: get,\r\n post: post,\r\n put: put,\r\n 'delete': del,\r\n ajax: ajax,\r\n getQ: getQ,\r\n postQ: postQ,\r\n putQ: putQ,\r\n deleteQ: delQ,\r\n queue: queue\r\n};","export default {\r\n getItem: function (key) {\r\n var expiry = JSON.parse(global.localStorage.getItem('wa_ttl') || 'false');\r\n if (expiry && expiry < new Date().getTime()) {\r\n global.localStorage.clear();\r\n return null;\r\n }\r\n\r\n return global.localStorage.getItem(key);\r\n },\r\n\r\n setItem: function (key, value) {\r\n var now = new Date();\r\n var expiry = now.getTime() + (1000 * 60 * 60 * 24 * 31); // 31 days sliding expiry\r\n global.localStorage.setItem('wa_ttl', JSON.stringify(expiry));\r\n global.localStorage.setItem(key, value);\r\n }\r\n};","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport map from 'lodash/map';\r\nimport storage from '../utilities/LocalStorage.js';\r\n\r\nfunction resolvedPromise() {\r\n var dfd = global.jQuery.Deferred();\r\n dfd.resolve(null); // basket store checks against null as to whether to update basket identifier\r\n return dfd.promise();\r\n}\r\n\r\nfunction getRequestData(customer, courses, basketIdentifier) {\r\n var data = {\r\n CustomerFirstName: customer.FirstName,\r\n CustomerSurname: customer.LastName,\r\n CustomerEmailAddress: customer.Email,\r\n CustomerMobile: customer.Mobile,\r\n CustomerTitle: customer.Title,\r\n SerializedBasket: JSON.stringify({\r\n version: '2.0.0',\r\n customer: customer,\r\n courses: courses\r\n })\r\n };\r\n\r\n if (basketIdentifier) {\r\n data.BasketIdentifier = basketIdentifier;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nvar lastBasketData = storage.getItem('__ora_widget_lastbasket') || '';\r\nvar lastDiscountRequestData = storage.getItem('__ora_widget_lastdiscountrequestdata') || '';\r\n\r\nexport default {\r\n getDiscounts: function (customer, courses, basketIdentifier) {\r\n var coursesAsJson = JSON.stringify(courses);\r\n if ((lastDiscountRequestData.length === 0 && isEmpty(courses))\r\n || (coursesAsJson === lastDiscountRequestData)) {\r\n // no change\r\n return resolvedPromise();\r\n }\r\n \r\n lastDiscountRequestData = coursesAsJson;\r\n if (global.localStorage) {\r\n storage.setItem('__ora_widget_lastdiscountrequestdata', lastDiscountRequestData);\r\n }\r\n\r\n var requestData = getRequestData(customer, courses, basketIdentifier);\r\n return http.postQ(options.apiEndpoint() + '/Basket/Discounts', requestData);\r\n },\r\n\r\n getUpsellOptions: function (courses) {\r\n var requestData = getRequestData({}, courses);\r\n return http.post(options.apiEndpoint() + '/Upsell/Options', requestData);\r\n },\r\n\r\n saveBasket: function (customer, courses, basketId, basketIdentifier) {\r\n if (lastBasketData.length === 0 && isEmpty(customer) && isEmpty(courses)) {\r\n // no change\r\n return resolvedPromise();\r\n }\r\n\r\n var requestData = getRequestData(customer, courses, basketIdentifier);\r\n var requestDataAsJson = JSON.stringify(requestData);\r\n if (requestDataAsJson === lastBasketData) {\r\n return resolvedPromise();\r\n }\r\n\r\n lastBasketData = requestDataAsJson;\r\n if (global.localStorage) {\r\n storage.setItem('__ora_widget_lastbasket', lastBasketData);\r\n }\r\n\r\n // MOVED to basket identifier now so no need to worry about basketid as well\r\n if (basketId) {\r\n requestData.BasketId = basketId;\r\n }\r\n\r\n if (global.OraWidgets.Options.isAgentBasket) {\r\n requestData.IsAgentBasket = true;\r\n }\r\n\r\n return http.postQ(options.apiEndpoint() + '/Basket', requestData);\r\n },\r\n\r\n getLineItemData: function (courseId, sessionIds, regionId) {\r\n var query = 'courseId=' + courseId;\r\n if (regionId) {\r\n query += '®ionId=' + regionId;\r\n }\r\n\r\n query += '&' + map(sessionIds,\r\n function(sessionId) {\r\n return 'sessionIds=' + sessionId;\r\n }).join('&');\r\n return http.get(options.apiEndpoint() + '/availability/item?' + query);\r\n }\r\n};","function upgradeBasket(basket) {\r\n copyAndDeleteProp(basket, 'courses', 'Courses');\r\n\r\n // map over to PascalCase if necessary\r\n for (var key in basket.Courses) {\r\n if (basket.Courses.hasOwnProperty(key)) {\r\n copyAndDeleteProp(basket.Courses[key], 'course', 'Course');\r\n copyAndDeleteProp(basket.Courses[key], 'itemId', 'ItemId');\r\n copyAndDeleteProp(basket.Courses[key], 'intensity', 'Intensity');\r\n copyAndDeleteProp(basket.Courses[key], 'options', 'Options');\r\n copyAndDeleteProp(basket.Courses[key], 'selectedRegions', 'SelectedRegions');\r\n copyAndDeleteProp(basket.Courses[key], 'region', 'Region');\r\n copyAndDeleteProp(basket.Courses[key], 'student', 'Student');\r\n\r\n if (basket.Courses[key].Course.hasOwnProperty('Type') &&\r\n !basket.Courses[key].Course.hasOwnProperty('CourseType')) {\r\n basket.Courses[key].Course.CourseType = basket.Courses[key].Course.Type;\r\n }\r\n\r\n if (basket.Courses[key].SelectedRegions &&\r\n basket.Courses[key].SelectedRegions.length &&\r\n !basket.Courses[key].Region) {\r\n basket.Courses[key].Region = basket.Courses[key].SelectedRegions[0];\r\n }\r\n\r\n // TODO: maybe change price mapping for old baskets?\r\n if (basket.Courses[key].hasOwnProperty('Price') && \r\n basket.Courses[key].Price.hasOwnProperty('Price')) {\r\n basket.Courses[key].Price = basket.Courses[key].Price.Price;\r\n }\r\n }\r\n }\r\n\r\n return basket;\r\n}\r\n\r\nfunction copyAndDeleteProp(obj, from, to) {\r\n if (obj.hasOwnProperty(from) && !obj.hasOwnProperty(to)) {\r\n obj[to] = obj[from];\r\n delete obj[from];\r\n }\r\n}\r\n\r\nfunction StudentEquals(left, right) {\r\n if (!left || !right) return false;\r\n return left.FirstName == right.FirstName\r\n && left.LastName == right.LastName\r\n && left.Gender == right.Gender\r\n && left.DateOfBirth && left.DateOfBirth.isSame(right.DateOfBirth)\r\n && (left.Nationality ? left.Nationality.NationalityId : -1 ) == (right.Nationality ? right.Nationality.NationalityId : -2);\r\n}\r\n\r\nexport default { \r\n upgradeBasket: upgradeBasket,\r\n studentEquals: StudentEquals\r\n};","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport create from 'lodash/create';\r\nimport assign from 'lodash/assign';\r\nimport omitBy from 'lodash/omitBy';\r\nimport forEach from 'lodash/forEach';\r\nimport map from 'lodash/map';\r\nimport mapValues from 'lodash/mapValues';\r\nimport pick from 'lodash/pick';\r\nimport size from 'lodash/size';\r\nimport every from 'lodash/every';\r\nimport some from 'lodash/some';\r\nimport reduce from 'lodash/reduce';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport find from 'lodash/find';\r\nimport filter from 'lodash/filter';\r\nimport min from 'lodash/min';\r\nimport uniq from 'lodash/uniq';\r\nimport debounce from 'lodash/debounce';\r\nimport clone from 'lodash/clone';\r\nimport Store from './Store.js';\r\nimport moment from 'moment';\r\nimport BasketService from '../utilities/BasketService.js';\r\nimport BasketUtilities from '../utilities/BasketUtilities.js';\r\nimport storage from '../utilities/LocalStorage.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nvar courses = {}; // keeps track of courses added to the basket\r\nvar students = {};\r\nvar prices = []; // price cache, so that upon adding a new course to the basket if we have a price we can use that // TODO: maybe change name/structure?\r\nvar customer = {};\r\nvar discounts = [];\r\nvar lineItems = {}; // keeps track of lineitem data (with pricing) coming back from the api\r\nvar isReserving = false;\r\nvar isConfirming = false;\r\nvar isConfirmed = false;\r\nvar isPollingPaymentStatus = false;\r\nvar isUpsellSearching = false;\r\nvar countries = [];\r\nvar reservation, reservationFailureResponse;\r\nvar paymentIntentStatus, paymentIntentFailureResponse, paymentIntentId, stripeClientSecret;\r\nvar order = undefined;\r\nvar termsAndConditions;\r\nvar upsells = [];\r\nvar options = { };\r\nvar basketIdentifier = uuidv4();\r\nvar referralSecret = null;\r\nvar successRedirectUri;\r\nvar paymentStatusEnum = { Created: 1, Success: 2, Fail: 3 };\r\n\r\n// when adding courses we go ask the api for the data\r\nvar isFetchingCourseData = false;\r\nvar courseOptionsData = {}; // if it's an options based course we don't add the course, instead we assign it here so that any components can show it\r\n\r\nfunction reset() {\r\n courses = {}; // keeps track of courses added to the basket\r\n students = {}; // keeps track of student data for each item\r\n prices = [];\r\n customer = {};\r\n lineItems = {};\r\n discounts = [];\r\n isReserving = false;\r\n reservation = undefined;\r\n reservationFailureResponse = undefined;\r\n isPollingPaymentStatus = false;\r\n paymentIntentStatus = undefined;\r\n paymentIntentFailureResponse = undefined;\r\n paymentIntentId = undefined;\r\n stripeClientSecret = undefined;\r\n termsAndConditions = undefined;\r\n basketIdentifier = uuidv4();\r\n referralSecret = null;\r\n order = undefined;\r\n}\r\n\r\nfunction BasketStore() {\r\n Store.call(this);\r\n\r\n // load items from localstorage\r\n deserialize();\r\n updateBasketCookie();\r\n notifyApi();\r\n}\r\n\r\nBasketStore.prototype = create(Store.prototype, {\r\n 'constructor': BasketStore,\r\n\r\n getIsFetchingCourseData: function() {\r\n return isFetchingCourseData;\r\n },\r\n\r\n getCourseOptionsData: function (context) {\r\n if (!courseOptionsData.hasOwnProperty(context)) {\r\n return false;\r\n }\r\n\r\n return courseOptionsData[context];\r\n },\r\n\r\n numberOfItems: function () {\r\n return size(courses);\r\n },\r\n\r\n getUpsellOptions: function(lineItem) {\r\n return options[lineItem.ItemId];\r\n },\r\n\r\n isUpsellSearching: function() {\r\n return isUpsellSearching;\r\n },\r\n\r\n hasUpsell: function (lineItemOption) {\r\n for (var i = 0; i < upsells.length; i++) {\r\n if (upsells[i] === lineItemOption) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getCourses: function () {\r\n return courses;\r\n },\r\n\r\n getCourseByItemId: function (itemId) {\r\n if (courses.hasOwnProperty(itemId)) {\r\n return courses[itemId];\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getDiscounts: function() {\r\n return discounts;\r\n },\r\n\r\n getBasketTotals: function () {\r\n var totalExcludingDiscounts = 0;\r\n var totalIncludingCourseDiscounts = 0;\r\n var deposit = 0;\r\n\r\n forEach(courses,\r\n function (lineItem) {\r\n totalExcludingDiscounts += lineItem.PriceExcludingDiscount;\r\n totalIncludingCourseDiscounts += lineItem.PriceIncludingDiscount;\r\n deposit += lineItem.Deposit;\r\n });\r\n \r\n var totalIncludingBasketDiscounts = totalExcludingDiscounts;\r\n forEach(discounts,\r\n function (discount) {\r\n totalIncludingBasketDiscounts -= discount.Discount.Amount;\r\n });\r\n\r\n return { totalIncludingBasketDiscounts: totalIncludingBasketDiscounts, totalIncludingCourseDiscounts: totalIncludingCourseDiscounts, totalExcludingDiscounts: totalExcludingDiscounts, deposit: deposit };\r\n },\r\n\r\n //getPrice: function (course, intensity, options) {\r\n // var price = getPriceObject(course, intensity, options);\r\n // if (!price) {\r\n // return false;\r\n // }\r\n\r\n // return price.price;\r\n //},\r\n\r\n //getStudent: function (itemId) {\r\n // if (!students.hasOwnProperty(itemId)) {\r\n // students[itemId] = {};\r\n // }\r\n\r\n // return students[itemId];\r\n //},\r\n\r\n getLineItem: function(courseId, sessionIds, regionId) {\r\n var key = lineItemKeyMaker(courseId, sessionIds, regionId);\r\n return lineItems[key];\r\n },\r\n\r\n getCustomer: function () {\r\n return clone(customer);\r\n },\r\n\r\n isReserving: function () {\r\n return isReserving;\r\n },\r\n\r\n isConfirming: function () {\r\n return isConfirming;\r\n },\r\n\r\n isConfirmed: function () {\r\n return isConfirmed;\r\n },\r\n\r\n getReservation: function () {\r\n return reservation;\r\n },\r\n\r\n getStripeClientSecret: function () {\r\n return stripeClientSecret;\r\n },\r\n\r\n getPaymentIntentId: function () {\r\n return paymentIntentId;\r\n },\r\n\r\n getReservationFailureResponse: function () {\r\n return reservationFailureResponse;\r\n },\r\n\r\n getCountries: function () {\r\n return countries;\r\n },\r\n\r\n getBasketIdentifier: function() {\r\n return basketIdentifier;\r\n },\r\n\r\n getReferralSecret: function() {\r\n return referralSecret;\r\n },\r\n\r\n getBasketIdentifierAndSecret: function () {\r\n return {\r\n basketIdentifier: basketIdentifier,\r\n secret: referralSecret\r\n }\r\n },\r\n\r\n getApplicableTermsAndConditions: function () {\r\n if (typeof termsAndConditions == \"undefined\") {\r\n return false;\r\n }\r\n\r\n var applicableTermsAndConditions = [];\r\n forEach(courses, function (courseItem) {\r\n forEach(termsAndConditions, function (termsAndConditionsDocument) {\r\n // first we must match on course type\r\n var courseTypePropertyMatches = find(termsAndConditionsDocument.Properties, function (documentProperty) {\r\n return documentProperty.Key === 'CourseType' && documentProperty.Value * 1 === courseItem.Course.CourseType.CourseTypeId;\r\n });\r\n\r\n if (courseTypePropertyMatches) {\r\n // do we match on the dates\r\n var effectiveFrom = moment.utc(find(termsAndConditionsDocument.Properties, function (documentProperty) {\r\n return documentProperty.Key === 'EffectiveFrom';\r\n }).Value, 'DD/MM/YYYY');\r\n var effectiveTo = moment.utc(find(termsAndConditionsDocument.Properties, function (documentProperty) {\r\n return documentProperty.Key === 'EffectiveTo';\r\n }).Value, 'DD/MM/YYYY');\r\n\r\n if (courseItem.Course.CourseType.AvailabilityModel === 0) {\r\n // session based - get the min from date from the options and use that\r\n var date = moment.utc(min(courseItem.Options, function (option) {\r\n return moment.utc(option.Session.From).unix();\r\n }).Session.From);\r\n } else if (courseItem.Course.CourseType.AvailabilityModel === 1) {\r\n // dates based\r\n var date = moment.utc(courseItem.Options[0].StartDate);\r\n } else if (courseItem.Course.CourseType.AvailabilityModel === 2) {\r\n // not based on dates - check based on todays date\r\n var date = moment.utc();\r\n }\r\n\r\n if ((date.isSame(effectiveFrom) || date.isAfter(effectiveFrom)) && (date.isSame(effectiveTo) || date.isBefore(effectiveTo))) {\r\n applicableTermsAndConditions.push(termsAndConditionsDocument);\r\n }\r\n }\r\n });\r\n });\r\n\r\n return uniq(applicableTermsAndConditions, 'DocumentId');\r\n },\r\n\r\n getPaymentIntentStatus: function () {\r\n return paymentIntentStatus;\r\n },\r\n\r\n getPaymentIntentFailureReason: function () {\r\n return paymentIntentFailureResponse;\r\n },\r\n\r\n getOrder: function() {\r\n return order;\r\n },\r\n\r\n getRedirectUri: function () {\r\n return successRedirectUri;\r\n },\r\n\r\n hasPaymentIntentPollingStarted: function () {\r\n return paymentIntentStatus !== undefined && paymentIntentStatus !== null;\r\n },\r\n\r\n isPaymentIntentCreated: function () {\r\n return isPollingPaymentStatus || paymentIntentStatus === paymentStatusEnum.Created;\r\n },\r\n\r\n isPaymentIntentSucceeded: function () {\r\n return paymentIntentStatus === paymentStatusEnum.Success;\r\n },\r\n\r\n isPaymentIntentFailed: function () {\r\n return paymentIntentStatus === paymentStatusEnum.Fail;\r\n },\r\n\r\n notifyApi: notifyApi\r\n});\r\n\r\nfunction lineItemKeyMaker(courseId, sessionIds, regionId) {\r\n var keyBits = [];\r\n keyBits.push(courseId + '');\r\n if (sessionIds) {\r\n keyBits.push(sessionIds.join(','));\r\n } else {\r\n keyBits.push('NOPE');\r\n }\r\n\r\n if (regionId) {\r\n keyBits.push(regionId + '');\r\n } else {\r\n keyBits.push('NOPE');\r\n }\r\n\r\n return keyBits.join('|');\r\n}\r\n\r\nfunction isPriceMatch(course, intensity, options, region, price) { // TODO: maybe change method slightly?\r\n return price.courseId === course.CourseId\r\n && price.intensityId === intensity.IntensityId\r\n && ((price.regionId === 0 && region == null) || (region && price.regionId == region.RegionId))\r\n && (course.CourseType.AvailabilityModel === 2\r\n || every(options, function (option) {\r\n return some(price.options, function (myOption) {\r\n return (option.Session && myOption.sessionId === option.Session.SessionId)\r\n || (option.StartDate && myOption.startDate == option.StartDate);\r\n });\r\n }));\r\n}\r\n\r\nfunction getPriceObject(course, intensity, options, region) { // TODO: maybe change method slightly?\r\n var candidatePrices = filter(prices, function (price) {\r\n return isPriceMatch(course, intensity, options, region, price);\r\n });\r\n\r\n if (candidatePrices.length === 0) {\r\n return false;\r\n } else if (candidatePrices.length > 1) {\r\n throw \"Argh, found too many matching prices\";\r\n }\r\n\r\n // if it's expired we remove from the prices and return false\r\n var price = candidatePrices[0];\r\n if (price.expires < new Date().getTime()) {\r\n prices = filter(prices, function (otherPrice) {\r\n return otherPrice !== price;\r\n });\r\n\r\n return false;\r\n }\r\n\r\n return price;\r\n}\r\n\r\nfunction serialize() {\r\n if (!global.localStorage || global.OraWidgets.Options.IsStorageDisabled) {\r\n return;\r\n }\r\n\r\n storage.setItem('__ora_widget_courses', JSON.stringify(courses));\r\n storage.setItem('__ora_widget_prices', JSON.stringify(prices));\r\n storage.setItem('__ora_widget_customer', JSON.stringify(customer));\r\n storage.setItem('__ora_widget_discounts', JSON.stringify(discounts));\r\n storage.setItem('__ora_widget_basket_identifier', JSON.stringify(basketIdentifier));\r\n storage.setItem('__ora_widget_referral_secret', JSON.stringify(referralSecret));\r\n}\r\n\r\nfunction copyAndDeleteProp(obj, from, to) {\r\n if (obj.hasOwnProperty(from) && !obj.hasOwnProperty(to)) {\r\n obj[to] = obj[from];\r\n delete obj[from];\r\n }\r\n}\r\n\r\nfunction deserialize() {\r\n if (!global.localStorage || global.OraWidgets.Options.IsStorageDisabled) {\r\n return;\r\n }\r\n\r\n courses = mapValues(JSON.parse(storage.getItem('__ora_widget_courses')) || {},\r\n function(item) {\r\n copyAndDeleteProp(item, 'course', 'Course');\r\n copyAndDeleteProp(item, 'itemId', 'ItemId');\r\n copyAndDeleteProp(item, 'intensity', 'Intensity');\r\n copyAndDeleteProp(item, 'options', 'Options');\r\n copyAndDeleteProp(item, 'selectedRegions', 'SelectedRegions');\r\n copyAndDeleteProp(item, 'student', 'Student');\r\n if (item.Student && item.Student.DateOfBirth) {\r\n // in the WA version dates can be DD/MM/YYYY with any part missing e.g. 05// so we don't want to parse them as moment\r\n var serialized = item.Student.DateOfBirth;\r\n item.Student.DateOfBirth = moment.utc(item.Student.DateOfBirth, moment.ISO_8601); \r\n if (!item.Student.DateOfBirth.isValid()) {\r\n item.Student.DateOfBirth = serialized;\r\n }\r\n }\r\n\r\n return item;\r\n });\r\n\r\n // to prevent issues with old baskets having no course type\r\n var shouldResetBasket = false;\r\n\r\n forEach(courses, function(course) {\r\n if (!course.Course.CourseType) {\r\n shouldResetBasket = true;\r\n return;\r\n }\r\n });\r\n\r\n if (shouldResetBasket) {\r\n reset();\r\n serialize();\r\n return;\r\n }\r\n\r\n // TODO: maybe change name/structure?\r\n prices = filter(JSON.parse(storage.getItem('__ora_widget_prices')) || [], function (price) {\r\n return price.expires > (new Date().getTime());\r\n });\r\n\r\n customer = JSON.parse(storage.getItem('__ora_widget_customer')) || {};\r\n discounts = JSON.parse(storage.getItem('__ora_widget_discounts')) || [];\r\n basketIdentifier = JSON.parse(storage.getItem('__ora_widget_basket_identifier'));\r\n if (!basketIdentifier) { \r\n // generate new one and save in local storage for later\r\n basketIdentifier = uuidv4();\r\n storage.setItem('__ora_widget_basket_identifier', JSON.stringify(basketIdentifier));\r\n }\r\n \r\n referralSecret = JSON.parse(storage.getItem('__ora_widget_referral_secret')) || null;\r\n}\r\n\r\nfunction notifyApi() {\r\n if (!OraWidgets.Options.IsApiStorageDisabled) {\r\n BasketService.saveBasket(customer, courses, OraWidgets.Options.BasketId, basketIdentifier).then(function (data) {\r\n if (data != undefined && data != null) {\r\n basketIdentifier = data.BasketIdentifier;\r\n referralSecret = data.ReferralSecret;\r\n }\r\n });\r\n }\r\n}\r\n\r\nvar debouncedNotifyApi = debounce(notifyApi, 1000);\r\n\r\nvar searchId = 0;\r\nfunction getDiscounts() {\r\n searchId++;\r\n BasketService.getDiscounts(customer, courses, basketIdentifier)\r\n .done((function createResponseFunc(mySearchId) {\r\n return function (response) {\r\n if (mySearchId !== searchId) {\r\n return;\r\n }\r\n\r\n if (response != undefined && response != null) {\r\n discounts = response;\r\n basketStore.emitChange();\r\n setTimeout(serialize, 1); // record in localStorage\r\n }\r\n };\r\n })(searchId));\r\n}\r\n\r\nvar debouncedGetDiscounts = debounce(getDiscounts, 1000, { leading: true });\r\n\r\nvar basketStore = new BasketStore();\r\nbasketStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.GET_LINEITEM_DATA_SUCCESS:\r\n var key = lineItemKeyMaker(payload.courseId, payload.sessionIds, payload.regionId);\r\n lineItems[key] = payload.lineItem;\r\n break;\r\n\r\n case ActionTypes.GET_LINEITEM_STARTED:\r\n isFetchingCourseData = true;\r\n break;\r\n\r\n case ActionTypes.GET_LINEITEM_OPTIONS_SUCCESS:\r\n isFetchingCourseData = false;\r\n courseOptionsData[payload.context] = payload;\r\n break;\r\n\r\n case ActionTypes.ADD_COURSE:\r\n isFetchingCourseData = false;\r\n var newItemId = payload.itemId ? payload.itemId : getNextItemId() + '_';\r\n var newCourse = {};\r\n\r\n newCourse[newItemId] = {\r\n ItemId: newItemId,\r\n ParentItemId: payload.parentItemId,\r\n Course: payload.lineItem.Course,\r\n Intensity: payload.lineItem.Intensity,\r\n Options: payload.lineItem.Options,\r\n Region: payload.lineItem.Region,\r\n Student: payload.student || {},\r\n PriceExcludingDiscount: payload.lineItem.PriceExcludingDiscount,\r\n PriceIncludingDiscount: payload.lineItem.PriceIncludingDiscount,\r\n Deposit: payload.lineItem.Deposit,\r\n TimeZone: payload.lineItem.TimeZone\r\n };\r\n \r\n courses = assign({}, courses, newCourse);\r\n delete courseOptionsData[payload.context];\r\n websiteGetDiscounts();\r\n break;\r\n\r\n case ActionTypes.REMOVE_COURSE:\r\n if (courses.hasOwnProperty(payload.itemId)) {\r\n courses = omitBy(courses,\r\n function(course, id) {\r\n return id == payload.itemId || course.ParentItemId == payload.itemId;\r\n });\r\n }\r\n\r\n websiteGetDiscounts();\r\n break;\r\n\r\n case ActionTypes.REPLACE_COURSE:\r\n if (courses.hasOwnProperty(payload.itemId)) {\r\n courses[payload.itemId] = {\r\n ItemId: payload.itemId,\r\n Course: payload.lineItem.Course,\r\n Intensity: payload.lineItem.Intensity,\r\n Options: payload.lineItem.Options,\r\n Region: payload.lineItem.Region,\r\n Student: payload.student || {},\r\n PriceExcludingDiscount: payload.lineItem.PriceExcludingDiscount,\r\n PriceIncludingDiscount: payload.lineItem.PriceIncludingDiscount,\r\n Deposit: payload.lineItem.Deposit,\r\n TimeZone: payload.lineItem.TimeZone\r\n };\r\n }\r\n\r\n break;\r\n\r\n case ActionTypes.UPDATE_STUDENT:\r\n // update the student within the course\r\n courses = mapValues(courses, function (course, itemId) {\r\n if (itemId === payload.itemId\r\n || course.ParentItemId === payload.itemId) {\r\n var propChange = {};\r\n propChange[payload.property] = payload.value;\r\n var update = assign({}, course.Student, propChange);\r\n return assign({}, course, { Student: update });\r\n }\r\n\r\n return course;\r\n });\r\n\r\n // update the students within the upsell options\r\n if (options && options[payload.itemId] && options[payload.itemId].Options) {\r\n forEach(options[payload.itemId].Options,\r\n function(lineItemOption) {\r\n forEach(lineItemOption.Options,\r\n function(option) {\r\n if (option.LineItem.ItemId === payload.itemId) {\r\n option.LineItem.Student[payload.property] = payload.value;\r\n }\r\n });\r\n });\r\n }\r\n\r\n break;\r\n\r\n case ActionTypes.CHOOSE_STUDENT:\r\n var currentStudent = assign({}, courses[payload.itemId].Student);\r\n\r\n // update the student for the course\r\n courses = mapValues(courses, function (course, itemId) {\r\n if (itemId === payload.itemId\r\n || BasketUtilities.studentEquals(course.Student, currentStudent)) {\r\n var update = assign({}, course.Student, payload.person);\r\n return assign({}, course, { Student: update });\r\n }\r\n\r\n return course;\r\n });\r\n\r\n // update the students within the upsell options\r\n if (options && options[payload.itemId] && options[payload.itemId].Options) {\r\n forEach(options[payload.itemId].Options,\r\n function (lineItemOption) {\r\n forEach(lineItemOption.Options,\r\n function (option) {\r\n if (option.LineItem.ItemId === payload.itemId) {\r\n option.LineItem.Student = payload.person;\r\n }\r\n });\r\n });\r\n }\r\n\r\n websiteGetDiscounts();\r\n break;\r\n\r\n case ActionTypes.UPDATE_CUSTOMER:\r\n customer[payload.property] = payload.value;\r\n\r\n break;\r\n\r\n case ActionTypes.CHOOSE_CUSTOMER:\r\n customer = assign({}, customer, payload.person);\r\n customer.ConfirmEmail = customer.Email;\r\n\r\n break;\r\n\r\n case ActionTypes.MAKE_RESERVATION_STARTED:\r\n reservationFailureResponse = undefined;\r\n reservation = undefined;\r\n isReserving = true;\r\n\r\n isPollingPaymentStatus = false;\r\n paymentIntentStatus = undefined;\r\n paymentIntentFailureResponse = undefined;\r\n order = undefined;\r\n break;\r\n\r\n case ActionTypes.MAKE_RESERVATION_SUCCESS:\r\n reservation = payload.reservation;\r\n paymentIntentId = reservation.PaymentIntentId;\r\n isReserving = false;\r\n if (!payload.makePayment) {\r\n alert('The reservation was successfully made');\r\n reset();\r\n }\r\n break;\r\n\r\n case ActionTypes.MAKE_RESERVATION_FAILURE:\r\n reservationFailureResponse = payload.response;\r\n isReserving = false;\r\n break;\r\n\r\n case ActionTypes.GET_ALL_COUNTRIES:\r\n countries = payload.countries;\r\n break;\r\n \r\n case ActionTypes.GET_ALL_TERMS_AND_CONDITIONS:\r\n termsAndConditions = payload.termsAndConditions;\r\n break;\r\n\r\n case ActionTypes.MAKE_BOOKING_STARTED:\r\n isConfirming = true;\r\n break;\r\n\r\n case ActionTypes.MAKE_BOOKING_SUCCESS:\r\n isConfirmed = true;\r\n isConfirming = false;\r\n break;\r\n\r\n case ActionTypes.CLEAR_BASKET:\r\n // reset everything\r\n reset();\r\n websiteGetDiscounts();\r\n break;\r\n\r\n case ActionTypes.LOAD_BASKET:\r\n reset();\r\n customer = payload.customer;\r\n if (payload.basketIdentifier != undefined && payload.basketIdentifier != null) {\r\n basketIdentifier = payload.basketIdentifier;\r\n }\r\n\r\n websiteGetDiscounts();\r\n break;\r\n\r\n case ActionTypes.ADDED_UPSELL:\r\n upsells.push(payload.lineItemOption);\r\n break;\r\n\r\n case ActionTypes.SEND_UPSELL_REQUEST_BEGIN:\r\n isUpsellSearching = true;\r\n break;\r\n\r\n case ActionTypes.SEND_UPSELL_REQUEST_FAILURE:\r\n isUpsellSearching = false;\r\n options = { \"dummy\": { Options: [] }};\r\n break;\r\n\r\n case ActionTypes.SEND_UPSELL_REQUEST_SUCCESS:\r\n isUpsellSearching = false;\r\n\r\n // we go through and replace the current line items in here with our versions from above\r\n // this keeps the data structure the same but also ensures we have prices!\r\n if (payload.options && payload.options.data && payload.options.data.Options) {\r\n forEach(payload.options.data.Options, function (lineItemOption) {\r\n forEach(lineItemOption.Options, function (option) {\r\n option.LineItem = basketStore.getCourseByItemId(option.LineItem.Key);\r\n });\r\n });\r\n }\r\n\r\n options[payload.options.itemId] = payload.options.data;\r\n break;\r\n \r\n case ActionTypes.CREATE_PAYMENT_INTENT_SUCCESS:\r\n paymentIntentId = payload.paymentIntentId;\r\n break;\r\n\r\n case ActionTypes.POLL_PAYMENT_START:\r\n isPollingPaymentStatus = true;\r\n paymentIntentStatus = paymentStatusEnum.Created;\r\n break;\r\n \r\n case ActionTypes.POLL_PAYMENT_FINISHED:\r\n isPollingPaymentStatus = false;\r\n paymentIntentStatus = payload.paymentStatus;\r\n paymentIntentFailureResponse = payload.paymentFailureReason;\r\n successRedirectUri = payload.redirectUri;\r\n order = payload.order;\r\n break;\r\n\r\n case ActionTypes.DISCOUNTS_FETCHED:\r\n discounts = payload.discounts;\r\n break;\r\n \r\n default:\r\n return;\r\n }\r\n\r\n basketStore.emitChange();\r\n setTimeout(serialize, 1); // record in localStorage\r\n updateBasketCookie();\r\n if (!global.OraWidgets.IsWebsite) { // the website uses apply wizard which provides student info and courses all at once. This makes it simpler to calculate discounts so we don't send this all time\r\n debouncedGetDiscounts();\r\n }\r\n debouncedNotifyApi();\r\n});\r\n\r\nfunction websiteGetDiscounts() {\r\n if (global.OraWidgets.IsWebsite) { \r\n debouncedGetDiscounts();\r\n }\r\n}\r\n\r\nfunction updateBasketCookie() {\r\n // we set the cookie for 30 days as this checkout code does not exist \r\n // on the rest of the site so a session based cookie would fail when someone\r\n // re-visited the site and they did have a basket but hadn't hit the checkout/apply page yet\r\n if (!OraWidgets.Options.IsApiStorageDisabled) {\r\n document.cookie = 'hasBasket=' + (isEmpty(courses) ? 'false' : 'true') + ';max-age=2592000;path=/';\r\n }\r\n}\r\n\r\n// next item id function \r\n// we use milliseconds as this should be unique across tabs/windows for the same computer\r\nfunction getNextItemId() {\r\n return new Date().getTime();\r\n}\r\n\r\n// listen to storage events from other tabs and update if necessary\r\nif (window.addEventListener) {\r\n window.addEventListener('storage', updateBasketFromStorage, false);\r\n} else {\r\n window.attachEvent('onstorage', updateBasketFromStorage);\r\n}\r\n\r\nfunction updateBasketFromStorage() {\r\n deserialize();\r\n basketStore.emitChange();\r\n}\r\n\r\nexport default basketStore;","import assign from 'lodash/assign.js';\r\nimport find from 'lodash/find';\r\nimport filter from 'lodash/filter';\r\nimport map from 'lodash/map';\r\nimport some from 'lodash/some';\r\nimport maxBy from 'lodash/maxBy';\r\nimport flatMap from 'lodash/flatMap';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport sumBy from 'lodash/sumBy';\r\n\r\nimport BasketStore from '../../stores/BasketStore';\r\n\r\nfunction parseDeepLinks(courses, wizardState) {\r\n // ignore if we're already in a basket (they're adding a second course)\r\n if (BasketStore.numberOfItems() > 0) return {};\r\n\r\n // don't override if they've chosen their accommodation\r\n if (wizardState.Accommodation && Object.keys(wizardState.Accommodation).length > 0) return {};\r\n\r\n var deepLinks = getDeepLinkedCourseSlugs();\r\n if (!deepLinks) return {};\r\n\r\n var regionSlugs = deepLinks[0].split(\"-\");\r\n var courseSlugs = deepLinks[1] ? deepLinks[1].split(\"-\") : [];\r\n\r\n var courseCandidates = search(courses, regionSlugs, courseSlugs, deepLinks[0], deepLinks[1]);\r\n if (!courseCandidates) {\r\n return {};\r\n }\r\n\r\n var result = {};\r\n if (courseCandidates.course) {\r\n result.Course = assign({ IsPreselected: true }, courseCandidates.course);\r\n }\r\n \r\n if (courseCandidates.region) {\r\n result.Region = assign({ IsPreselected: true }, courseCandidates.region);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction getDeepLinkedCourseSlugs() {\r\n var intent = new URL(location).searchParams.get(\"intent\");\r\n if (!intent) return false;\r\n\r\n return intent.replace(/^\\/+/, '').split(\"/\").filter(s => s);\r\n}\r\n\r\nfunction search(courses, regionSlugs, courseSlugs, regionSlug, courseSlug) {\r\n\r\n \r\n // find the courses that have at least one site with a name like in the slug\r\n \r\n var bestRegionMatch = maxBy(\r\n filter(\r\n map(\r\n uniqBy(\r\n filter (\r\n flatMap(courses, function (course) { return course.Sites; }),\r\n function (site) { return site; }\r\n ),\r\n function (site) { return site.RegionId; }\r\n ),\r\n function (site) { return { site: site, score: sumBy(regionSlugs, slug => site.RegionName.toLowerCase().includes(slug) ? 1 : 0)} }\r\n ),\r\n function (regionPair) { return regionPair.score > 0; }\r\n ),\r\n function (regionPair) { return regionPair.score; }\r\n );\r\n\r\n if (!bestRegionMatch) {\r\n return false;\r\n }\r\n\r\n if (!some(courseSlugs)) {\r\n return {\r\n region: bestRegionMatch.site\r\n }\r\n }\r\n \r\n // hand match their slugs\r\n var slugsToCourse = {\r\n 'architecture-design': ['Architecture & Design']\r\n , 'business-innovation-and-entrepreneurship-summer-school-in-london': ['Inventing the Future: Business, Innovation & Entrepreneurship']\r\n , 'business-innovation-entrepreneurship-16-18': ['Inventing the Future: Business, Innovation & Entrepreneurship']\r\n , 'business-innovation-entrepreneurship-13-15': ['Explore Business, Innovation & Entrepreneurship']\r\n , 'business-innovation-and-entrepreneurship-summer-school-in-berkeley': ['Inventing the Future: Business, Innovation & Entrepreneurship']\r\n , 'explore-business-innovation-and-entrepreneurship-summer-school-in-yale': ['Explore Business, Innovation & Entrepreneurship']\r\n , 'business-enterprise': ['Inventing the Future: Business, Innovation & Entrepreneurship']\r\n , 'curing-the-future-medicine': ['Curing the Future: Medicine & Disease']\r\n , 'engineering': ['Designing Tomorrow: Engineering & Technology', 'Explore Engineering & Technology']\r\n , 'explore-engineering': ['Explore Engineering & Technology']\r\n , 'explore-medicine': ['Explore Medicine']\r\n , 'medicine-13-15': ['Explore Medicine']\r\n , 'medicine-16-18': ['Curing the Future: Medicine & Disease']\r\n , 'film-academy-13-18': ['Film Academy: Oxford Through The Lens for ages 13-15', 'Film Academy: Oxford Through The Lens for ages 16-18']\r\n , 'law': ['Law & Politics', 'Law & Trial Advocacy Academy']\r\n , 'learn-english': ['English as a Foreign Language (ages 13-15)', 'English as a Foreign Language (ages 16-18)']\r\n , 'mathematics': ['Mathematics']\r\n , 'philosophy-literature-and-modern-history': ['Philosophy, Literature and Modern History']\r\n , 'racing-extinction': ['Racing Extinction: Climate, Politics & Global Leadership for 13-15', 'Racing Extinction: Climate, Politics & Global Leadership for ages 16-18']\r\n };\r\n\r\n var possibleCourses = slugsToCourse.hasOwnProperty(courseSlug) ? slugsToCourse[courseSlug] : null;\r\n if (!possibleCourses) {\r\n possibleCourses = find(slugsToCourse, function (val, key) { return key.indexOf(courseSlug) === 0; }); \r\n }\r\n\r\n var bestCourseMatch;\r\n if (possibleCourses) {\r\n bestCourseMatch = find(courses, function (c) { return some(possibleCourses, function (courseName) { return c.Name === courseName; })});\r\n if (bestCourseMatch) {\r\n return {\r\n region: bestRegionMatch.site,\r\n course: bestCourseMatch\r\n };\r\n }\r\n } \r\n\r\n // OR find the course with the closest name in the same region\r\n bestCourseMatch = maxBy(\r\n filter(\r\n map(\r\n filter(\r\n courses, \r\n function (course) { return some(course.Sites, site => site.RegionId === bestRegionMatch.site.RegionId); }\r\n ),\r\n function (course) { return { \r\n course: course, \r\n score: sumBy(courseSlugs, function (slug) {\r\n if (course.Name.toLowerCase().includes(slug)) {\r\n if (/\\d+/.test(slug)) { // e.g. 13 in Ages 13-15\r\n return 1;\r\n } else {\r\n return 3; // prioritise 1 word match over 2 number matches\r\n }\r\n }\r\n return 0;\r\n })\r\n } \r\n }\r\n ),\r\n function(courseMatch) { return courseMatch.score > 0; }\r\n ),\r\n function (courseMatch) { return courseMatch.score; }\r\n );\r\n\r\n return {\r\n region: bestRegionMatch.site,\r\n course: bestCourseMatch ? bestCourseMatch.course : false,\r\n }\r\n}\r\n\r\nexport default parseDeepLinks;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\n\r\nvar Begin = createReactClass({ \r\n displayName: 'Begin',\r\n render: function() {\r\n var intentParams = new URL(location).searchParams.get(\"intent\"); // if exists, should be oxford-summer-school/course-slug\r\n var intentSplashImage = intentParams \r\n ? 'url(\"https://oxford-royale.com/Apply-' + intentParams.replace(/^\\/+/, '').split(\"/\")[0] + '.jpg\")'\r\n : 'url(\"https://www.oxford-royale.com/Apply-Cover-Image-sm.jpg\")'; \r\n\r\n return
\r\n\r\n
\r\n
\r\n
\r\n
\r\n

Welcome!

\r\n

You're just a few questions away from a life-changing educational experience.

\r\n

Complete our application form
to secure your place

\r\n

(takes 5 minutes to complete)

\r\n

\r\n \r\n

\r\n
\r\n
;\r\n },\r\n handleClick: function() {\r\n this.props.wizard.set({\r\n HasStartedWizard: true,\r\n });\r\n this.props.wizard.nextQuestion();\r\n },\r\n isValid: function() {\r\n return true;\r\n }\r\n});\r\n\r\nexport default Begin;","import widgetOptions from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n getCourseAvailability: function (courseId, agentId) {\r\n // TODO fix for agents\r\n return http.get(widgetOptions.apiEndpoint() + '/availability?courseId=' + courseId);\r\n },\r\n\r\n getAgentAvailability: function (courseId, agentId) {\r\n // TODO Fix\r\n return http.get(widgetOptions.apiEndpoint() + '/Course/' + courseId + '/AgentAvailability?agentId=' + agentId);\r\n },\r\n\r\n sendEnquiry: function(customer, course, intensity, options, message, regions) {\r\n return http.post(widgetOptions.apiEndpoint() + '/Course/' + course.CourseId + '/Enquiry', {\r\n customer: customer,\r\n course: course,\r\n intensity: intensity,\r\n options: options,\r\n message: message,\r\n regions: regions\r\n });\r\n },\r\n\r\n sendNotifyRequest: function(course, intensity, options, region, emailAddress, phoneNumber, studentName, studentGender) {\r\n return http.post(widgetOptions.apiEndpoint() + '/NotifyRequest', {\r\n course: course,\r\n intensity: intensity,\r\n options: options,\r\n region: region,\r\n emailAddress: emailAddress,\r\n phoneNUmber: phoneNumber,\r\n studentName: studentName,\r\n studentGender: studentGender\r\n });\r\n },\r\n\r\n getTimeZones: function(course, sessions) {\r\n return http.get(widgetOptions.apiEndpoint() +\r\n '/availability/timezones?courseId=' +\r\n course.CourseId +\r\n sessions.map(function (s) { return \"&sessionIds=\" + s.SessionId; }).join(\"\"));\r\n },\r\n\r\n getOptions: function(course, sessions, regionId) {\r\n return http.get(widgetOptions.apiEndpoint() +\r\n '/Availability/Item?courseId=' +\r\n course.CourseId +\r\n sessions.map(function(s) { return \"&sessionIds=\" + s.SessionId; }).join(\"\") +\r\n \"®ionId=\" +\r\n regionId);\r\n }\r\n};","export default {\r\n get: function(key) {\r\n var b = document.cookie.match('(^|[^;]+)\\\\s*' + key + '\\\\s*=\\\\s*([^;]+)');\r\n return b ? b.pop() : '';\r\n }\r\n};","import map from 'lodash/map';\r\nimport forEach from 'lodash/forEach';\r\nimport Cookies from './Cookies.js';\r\n\r\nfunction injectCJPixel(slimOrder) {\r\n if (!global.OraWidgets.Options.cjEnabled) {\r\n return;\r\n }\r\n\r\n var src = 'https://www.emjcd.com/u?';\r\n src += 'TYPE=' + global.OraWidgets.Options.cjType;\r\n src += '&CID=' + global.OraWidgets.Options.cjCID;\r\n src += '&OID=' + slimOrder.OrderId;\r\n src += '&CURRENCY=GBP';\r\n src += '&METHOD=IMG';\r\n var cjEvent = Cookies.get('cj');\r\n if (cjEvent) {\r\n src += '&CJEVENT=' + cjEvent;\r\n }\r\n\r\n forEach(slimOrder.Products,\r\n function(product, idx) {\r\n var queryIdx = idx + 1;\r\n src += '&ITEM' + queryIdx + '=' + product.Id;\r\n src += '&AMT' + queryIdx + '=' + product.Deposit;\r\n src += '&QTY' + queryIdx + '=1';\r\n });\r\n\r\n var img = '';\r\n window.jQuery(document.body).append(img);\r\n}\r\n\r\nfunction sendGTMPurchaseTag(slimOrder, redirectUri) {\r\n var tagToPush = {\r\n 'event': 'purchase',\r\n 'enhanced_conversion_data': {\r\n \"email\": slimOrder.CustomerEmailAddress\r\n },\r\n 'ecommerce': {\r\n 'purchase': {\r\n 'actionField': {\r\n 'id': slimOrder.OrderId + '',\r\n 'affiliation': location.href.indexOf('portal.oxford-royale.co.uk') > -1 || location.href.indexOf('portal.oxford-royale.com') > -1 ? 'Draft Order' : 'Online',\r\n 'revenue': slimOrder.Total + '',\r\n 'tax': slimOrder.VatAmount + ''\r\n },\r\n 'products': map(slimOrder.Products,\r\n function(product) {\r\n return {\r\n 'name': product.Name,\r\n 'id': product.Id,\r\n 'price': product.Price,\r\n 'brand': product.Brand,\r\n 'category': product.Category,\r\n 'variant': product.Variant,\r\n 'quantity': product.Quantity\r\n };\r\n })\r\n }\r\n }\r\n };\r\n\r\n // regardless we redirect away in 5 seconds (assumes there's something informative for the user to read)\r\n setTimeout(function () {\r\n if (global.localStorage) {\r\n // now we clear the basket, set this to true so the basket store doesn't deserialize (and therefore re-render everything and get fooked)\r\n global.OraWidgets.Options.IsStorageDisabled = true;\r\n global.localStorage.clear();\r\n }\r\n\r\n global.location.href = redirectUri;\r\n }, 5000);\r\n\r\n window.dataLayer = window.dataLayer || [];\r\n dataLayer.push(tagToPush);\r\n}\r\n\r\n\r\nexport default {\r\n purchaseTag: function (slimOrder, redirectUri) {\r\n injectCJPixel(slimOrder);\r\n sendGTMPurchaseTag(slimOrder, redirectUri);\r\n },\r\n\r\n //productImpressionsTag: function (event, category, action, label, products) {\r\n // window.dataLayer = window.dataLayer || [];\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label,\r\n // 'ecommerce': {\r\n // 'currencyCode': 'GBP',\r\n // 'impressions': []\r\n // }\r\n // };\r\n\r\n // products.forEach(function (value, index, array) {\r\n // tagToPush.ecommerce.impressions.push({\r\n // 'name': value.name,\r\n // 'id': value.id,\r\n // 'category': value.category,\r\n // 'variant': value.variant, \r\n // 'list': 'Search Results', \r\n // 'position': value.positionInSearch \r\n // });\r\n // });\r\n\r\n // dataLayer.push(tagToPush);\r\n //},\r\n\r\n\r\n //productClicksTag: function (event, category, action, label, actionField, product, positionInSearch) {\r\n // window.dataLayer = window.dataLayer || [];\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label,\r\n // 'ecommerce': {\r\n // 'click': {\r\n // 'actionField': { 'list': actionField },\r\n // 'products': [{\r\n // 'name': product.name,\r\n // 'id': product.id,\r\n // 'category': product.category,\r\n // 'variant': product.variant, \r\n // 'position': positionInSearch \r\n // }]\r\n // }\r\n // }\r\n // };\r\n\r\n // dataLayer.push(tagToPush);\r\n //},\r\n\r\n sessionOptionsTag: function(courseId, courseName, courseTypeName, region) {\r\n window.dataLayer = window.dataLayer || [];\r\n dataLayer.push({\r\n event: 'view_item_list',\r\n item_list_id: 'apply_session_options',\r\n item_list_name: 'Apply Session Options',\r\n items: [\r\n {\r\n item_id: courseId,\r\n item_name: courseName,\r\n affiliation: 'Online',\r\n item_category: courseTypeName,\r\n item_list_id: 'apply_session_options',\r\n item_list_name: 'Apply Session Options',\r\n item_category2: region\r\n }\r\n ]\r\n });\r\n },\r\n\r\n bookTag: function(courseId, courseName, courseTypeName, region, intensity, price, sessions) {\r\n window.dataLayer = window.dataLayer || [];\r\n dataLayer.push({\r\n event: 'add_to_cart',\r\n currency: 'GBP',\r\n value: price,\r\n items: [\r\n {\r\n item_id: courseId,\r\n item_name: courseName,\r\n affiliation: 'Online',\r\n item_category: courseTypeName,\r\n item_category2: region,\r\n item_category3: intensity,\r\n item_category4: sessions,\r\n currency: 'GBP',\r\n price: price\r\n }\r\n ]\r\n });\r\n },\r\n\r\n beginCheckoutTag: function(price, courses) {\r\n window.dataLayer = window.dataLayer || [];\r\n dataLayer.push({\r\n event: 'begin_checkout',\r\n currency: 'GBP',\r\n value: price,\r\n items: [map(courses,\r\n function(course) {\r\n return {\r\n item_id: course.Course.CourseId,\r\n item_name: course.Course.Name,\r\n affiliation: 'Online',\r\n item_category: course.Course.CourseType.Name,\r\n item_category2: course.Region ? course.Region.RegionName : null,\r\n item_category3: course.Intensity ? course.Intensity.Name : null,\r\n item_category4: course.Options && course.Options.length && course.Options[0].Session\r\n ? map(course.Options, function (o) { return o.Session.Name; }).join(',')\r\n : null,\r\n currency: 'GBP',\r\n price: course.PriceIncludingDiscount\r\n };\r\n })]\r\n });\r\n },\r\n\r\n\r\n //productDetailsTag: function (event, category, action, label, product) {\r\n // window.dataLayer = window.dataLayer || [];\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label,\r\n // 'ecommerce': {\r\n // 'detail': {\r\n // 'products': [{\r\n // 'name': product.name, \r\n // 'id': product.id, \r\n // 'category': product.category, \r\n // 'variant': product.variant \r\n // }]\r\n // }\r\n // }\r\n // };\r\n\r\n // dataLayer.push(tagToPush);\r\n //},\r\n\r\n\r\n //addToCartTag: function (event, category, action, label, product, callback) {\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label,\r\n // 'ecommerce': {\r\n // 'currencyCode': 'GBP',\r\n // 'add': {\r\n // 'products': [{\r\n // 'name': product.name,\r\n // 'id': product.id,\r\n // 'price': product.price,\r\n // 'brand': product.options,\r\n // 'category': product.category,\r\n // 'variant': product.variant,\r\n // 'quantity': product.quantity\r\n // }]\r\n // }\r\n // }\r\n // };\r\n\r\n // var gtmLoaded = window.hasOwnProperty('google_tag_manager');\r\n // if (!gtmLoaded) {\r\n // if (callback) {\r\n // callback();\r\n // }\r\n // } else {\r\n // tagToPush['eventCallback'] = callback;\r\n // tagToPush['eventTimeout'] = 1000;\r\n // }\r\n\r\n // window.dataLayer = window.dataLayer || [];\r\n // dataLayer.push(tagToPush);\r\n //},\r\n\r\n\r\n removeFromCartTag: function (event, category, action, label, product) {\r\n window.dataLayer = window.dataLayer || [];\r\n var tagToPush = {\r\n 'event': event,\r\n 'eventCategory': category,\r\n 'eventAction': action,\r\n 'eventLabel': label,\r\n 'ecommerce': {\r\n 'remove': {\r\n 'products': [{\r\n 'name': product.name,\r\n 'id': product.id, \r\n 'price': product.price,\r\n 'brand': product.options, \r\n 'category': product.category, \r\n 'variant': product.variant, \r\n 'quantity': product.quantity\r\n }]\r\n }\r\n }\r\n };\r\n\r\n dataLayer.push(tagToPush);\r\n },\r\n\r\n\r\n //checkoutTag: function (event, category, action, label, gaVpv, actionField, products) {\r\n // window.dataLayer = window.dataLayer || [];\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label,\r\n // 'enhanced': 1,\r\n // 'ga_vpv': {\r\n // 'page': gaVpv.page,\r\n // 'title': gaVpv.title\r\n // },\r\n // 'ecommerce': {\r\n // 'currencyCode': 'GBP',\r\n // 'checkout': {\r\n // 'actionField': {\r\n // 'step': actionField.step,\r\n // 'option': actionField.option //Omit or set as empty string if not needed\r\n // },\r\n // 'products': []\r\n // }\r\n // }\r\n // };\r\n\r\n // products.forEach(function (value, index, array) {\r\n // tagToPush.ecommerce.checkout.products.push({\r\n // 'name': value.name, \r\n // 'id': value.id, \r\n // 'price': value.price, \r\n // 'brand': value.options, \r\n // 'category': value.category, \r\n // 'variant': value.variant, \r\n // 'quantity': value.quantity \r\n // });\r\n // });\r\n\r\n // dataLayer.push(tagToPush);\r\n //},\r\n\r\n\r\n //searchResultsTag: function (event, category, action, label) {\r\n // window.dataLayer = window.dataLayer || [];\r\n // var tagToPush = {\r\n // 'event': event,\r\n // 'eventCategory': category,\r\n // 'eventAction': action,\r\n // 'eventLabel': label\r\n // };\r\n\r\n // dataLayer.push(tagToPush);\r\n //}\r\n};","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport BasketStore from '../stores/BasketStore.js';\r\nimport AvailabilityService from '../utilities/AvailabilityService.js';\r\nimport AdManagerService from '../utilities/AdManagerService.js';\r\nimport BasketService from '../utilities/BasketService.js';\r\nimport forOwn from 'lodash/forOwn';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport flatten from 'lodash/flatten';\r\n\r\nfunction addCourse(course, intensity, options, region, student, priceExcludingDiscount, priceIncludingDiscount, deposit, timeZone, itemId, parentItemId) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.ADD_COURSE,\r\n lineItem: {\r\n Course: course,\r\n Intensity: intensity,\r\n Options: options,\r\n Region: region,\r\n PriceExcludingDiscount: priceExcludingDiscount,\r\n PriceIncludingDiscount: priceIncludingDiscount,\r\n Deposit: deposit,\r\n TimeZone: timeZone\r\n },\r\n student: student,\r\n itemId: itemId,\r\n parentItemId: parentItemId\r\n });\r\n}\r\n\r\nexport default {\r\n addCourseWithOptions: function(options, courseOptionsData) {\r\n courseOptionsData.lineItem.Options = options;\r\n Dispatcher.dispatch({\r\n type: ActionTypes.ADD_COURSE,\r\n lineItem: courseOptionsData.lineItem,\r\n context: courseOptionsData.context\r\n });\r\n\r\n if (courseOptionsData.callback) {\r\n courseOptionsData.callback();\r\n }\r\n },\r\n\r\n addCourse: addCourse,\r\n\r\n addCourseWithTimeZone: function (timezone, courseOptionsData) {\r\n courseOptionsData.lineItem.TimeZone = timezone;\r\n Dispatcher.dispatch({\r\n type: ActionTypes.ADD_COURSE,\r\n lineItem: courseOptionsData.lineItem,\r\n context: courseOptionsData.context\r\n });\r\n\r\n if (courseOptionsData.callback) {\r\n courseOptionsData.callback();\r\n }\r\n },\r\n\r\n addCourseUsingIds: function(courseId, sessionIds, regionId, student, context, callback) {\r\n //var isCurrentlyEmpty = BasketStore.numberOfItems() === 0;\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_LINEITEM_STARTED\r\n });\r\n\r\n BasketService.getLineItemData(courseId, sessionIds, regionId)\r\n .done(function (response) {\r\n response.Course.Type = response.Course.CourseType; // some things refer to Type\r\n if (response.Course.HasCourseBreakdown || response.Course.CourseType.StudyMethod === 1) {\r\n // we're going to let them choose their options\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_LINEITEM_OPTIONS_SUCCESS,\r\n lineItem: response,\r\n student: student,\r\n context: context,\r\n callback: callback\r\n });\r\n } else {\r\n // add the course straight away\r\n Dispatcher.dispatch({\r\n type: ActionTypes.ADD_COURSE,\r\n lineItem: response,\r\n student: student\r\n });\r\n }\r\n\r\n (callback || function () { })();\r\n })\r\n .fail(function () {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_LINEITEM_FAILURE,\r\n student: student,\r\n callback: callback\r\n });\r\n });\r\n\r\n //if (isCurrentlyEmpty) {\r\n // BasketService.recordNewBasket();\r\n //}\r\n\r\n //// GTM\r\n //var event = 'addToCart';\r\n //var eventCategory = 'ecommerce';\r\n //var eventAction = 'add to cart';\r\n //var productVariant = regions && regions.length ? regions[0].Name : null;\r\n //var productOptions = flatten(map(options,\r\n // function (sessionOption) {\r\n // if (!sessionOption.Options) {\r\n // return [];\r\n // }\r\n\r\n // return map(sessionOption.Options,\r\n // function(option) {\r\n // return option.CourseOption.Name;\r\n // });\r\n // })).join('|');\r\n //var product = { id: course.CourseId, name: course.Name, price: null, options: productOptions, category: course.Type.Name, variant: productVariant, quantity: 1 };\r\n\r\n //AdManagerService.addToCartTag(event, eventCategory, eventAction, product.name, product, callback);\r\n },\r\n\r\n removeCourse: function (itemId) {\r\n var item = BasketStore.getCourseByItemId(itemId);\r\n var courseType, course, courseId;\r\n if (item) {\r\n courseType = item.Course.CourseType.Name;\r\n course = item.Course.Name;\r\n courseId = item.Course.CourseId;\r\n }\r\n\r\n Dispatcher.dispatch({\r\n type: ActionTypes.REMOVE_COURSE,\r\n itemId: itemId\r\n });\r\n\r\n // Log GTM\r\n var event = 'removeFromCart';\r\n var eventCategory = 'ecommerce';\r\n var eventAction = 'remove from cart';\r\n var productVariant = item.Region ? item.Region.Name : null;\r\n var productOptions = flatten(map(item.Options,\r\n function (sessionOption) {\r\n if (!sessionOption.Options) {\r\n return [];\r\n }\r\n\r\n return map(sessionOption.Options,\r\n function (option) {\r\n return option.CourseOption.Name;\r\n });\r\n })).join('|');\r\n\r\n var product = {\r\n id: courseId,\r\n name: course,\r\n price: null,\r\n options: productOptions,\r\n category: courseType,\r\n variant: productVariant,\r\n quantity: 1\r\n };\r\n \r\n AdManagerService.removeFromCartTag(event, eventCategory, eventAction, product.name, product);\r\n },\r\n\r\n removeSession: function (itemId, lineItem, sessionOption) {\r\n var options =\r\n filter(\r\n lineItem.Options,\r\n function (otherSessionOption) {\r\n return sessionOption !== otherSessionOption;\r\n });\r\n\r\n var sessionIds = map(\r\n options,\r\n function (sessionOption) {\r\n return sessionOption.Session.SessionId;\r\n });\r\n\r\n BasketService.getLineItemData(\r\n lineItem.Course.CourseId,\r\n sessionIds,\r\n lineItem.Region.RegionId)\r\n .done(function (response) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.REPLACE_COURSE,\r\n itemId: itemId,\r\n lineItem: {\r\n Course: response.Course,\r\n Intensity: response.Intensity,\r\n Options: options,\r\n Region: response.Region,\r\n PriceExcludingDiscount: response.PriceExcludingDiscount,\r\n PriceIncludingDiscount: response.PriceIncludingDiscount,\r\n Deposit: response.Deposit\r\n },\r\n student: lineItem.Student\r\n });\r\n });\r\n },\r\n\r\n getLineItemData: function (courseId, sessionIds, regionId) {\r\n var cachedLineItem = BasketStore.getLineItem(courseId, sessionIds, regionId);\r\n if (cachedLineItem) {\r\n // yes, issue another dispatch so that any views get notified of the new request finishing\r\n setTimeout(function () {\r\n dispatchedGetLineItemDataSuccess(cachedLineItem);\r\n },\r\n 1);\r\n } else {\r\n BasketService.getLineItemData(courseId, sessionIds, regionId)\r\n .done(function (response) {\r\n response.Course.Type = response.Course.CourseType;\r\n dispatchedGetLineItemDataSuccess(response);\r\n });\r\n }\r\n\r\n\r\n function dispatchedGetLineItemDataSuccess(lineItem) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_LINEITEM_DATA_SUCCESS,\r\n lineItem: lineItem,\r\n courseId: courseId,\r\n sessionIds: sessionIds,\r\n regionId: regionId\r\n });\r\n }\r\n },\r\n\r\n updateStudent: function (itemId, property, value) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.UPDATE_STUDENT,\r\n itemId: itemId,\r\n property: property,\r\n value: value\r\n });\r\n },\r\n\r\n chooseStudent: function (itemId, person) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.CHOOSE_STUDENT,\r\n person: person,\r\n itemId: itemId\r\n });\r\n },\r\n\r\n updateCustomer: function (property, value) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.UPDATE_CUSTOMER,\r\n property: property,\r\n value: value\r\n });\r\n },\r\n\r\n chooseCustomer: function (person) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.CHOOSE_CUSTOMER,\r\n person: person\r\n });\r\n },\r\n\r\n loadBasket: function (customer, courses, basketIdentifier) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.LOAD_BASKET,\r\n customer: customer,\r\n basketIdentifier: basketIdentifier\r\n });\r\n\r\n forOwn(courses, function (course) {\r\n var region = course.Region;\r\n if (!region && course.SelectedRegions && course.SelectedRegions.length) {\r\n region = course.SelectedRegions[0];\r\n }\r\n\r\n addCourse(course.Course, course.Intensity, course.Options, region, course.Student, course.PriceExcludingDiscount, course.PriceIncludingDiscount, course.Deposit, course.TimeZone, course.ItemId, course.ParentItemId);\r\n });\r\n },\r\n\r\n clearBasket: function() {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.CLEAR_BASKET\r\n });\r\n },\r\n\r\n recordExtension: function (lineItemOption) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.ADDED_UPSELL,\r\n lineItemOption: lineItemOption\r\n });\r\n }\r\n};\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport clone from 'lodash/clone';\r\nimport BasketActionCreators from '../../../actions/BasketActionCreators.js';\r\n\r\nexport default {\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function() {\r\n return {\r\n firstInput: React.createRef()\r\n }\r\n },\r\n\r\n componentDidMount: function() {\r\n if (this.state.firstInput.current) this.state.firstInput.current.focus();\r\n },\r\n\r\n updateCustomer: function(event) {\r\n this.updateCustomerProp(event.target.name, event.target.value);\r\n },\r\n\r\n updateCustomerProp: function(prop, value) {\r\n var customer = clone(this.props.wizard.state.Customer);\r\n customer[prop] = value;\r\n this.props.wizard.set({ Customer: customer });\r\n if (this.state.hasValidated) {\r\n this.isValid();\r\n }\r\n\r\n // sync changes to the customer basket so that abandoned baskets and opps work as expected\r\n if (['FirstName', 'LastName', 'Mobile', 'Email'].indexOf(prop) > -1) {\r\n BasketActionCreators.updateCustomer(prop, value);\r\n }\r\n },\r\n\r\n isNonEmptyProp: function(prop) {\r\n return !!this.props.wizard.state.Customer[prop];\r\n },\r\n\r\n hasEnteredProp: function(prop) {\r\n return this.props.wizard.state.Customer.hasOwnProperty(prop);\r\n }\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\n\r\nvar ENTER = 13;\r\n\r\nvar pressEnter = createReactClass({\r\n displayName: 'Press Enter',\r\n props: {\r\n wizard: PropTypes.object,\r\n onEnter: PropTypes.func,\r\n showPressEnter: PropTypes.bool,\r\n },\r\n\r\n getDefaultProps: function() {\r\n return {\r\n showPressEnter: true\r\n };\r\n },\r\n\r\n clickHandler: function() {\r\n if (this.props.onEnter) {\r\n this.props.onEnter();\r\n }\r\n\r\n this.props.wizard.nextQuestion();\r\n },\r\n\r\n componentDidMount: function() {\r\n if (this.props.showPressEnter) {\r\n document.addEventListener(\"keydown\", this.handleEnterKey);\r\n }\r\n },\r\n\r\n componentWillUnmount: function() {\r\n if (this.props.showPressEnter) {\r\n document.removeEventListener(\"keydown\", this.handleEnterKey);\r\n }\r\n },\r\n\r\n handleEnterKey: function(e) {\r\n if (e.which === ENTER) {\r\n if (e.target.tagName === \"SELECT\") return; // don't want to go next on this\r\n\r\n this.clickHandler();\r\n }\r\n },\r\n\r\n render: function() {\r\n return false; // I used to render something, now I just attach a click handler\r\n }\r\n});\r\n\r\nexport default pressEnter;\r\n","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport isArray from 'lodash/isarray';\r\n\r\nvar FormGroup = createReactClass({\r\n propTypes: {\r\n label: PropTypes.string,\r\n description: PropTypes.string,\r\n state: PropTypes.oneOf(['valid', 'invalid']),\r\n validationMessage: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.array\r\n ])\r\n },\r\n\r\n getDefaultProps: function() {\r\n return {\r\n state: 'valid',\r\n validationMessage: ''\r\n };\r\n },\r\n\r\n render: function() {\r\n var desc = this.props.description ?
{this.props.description}
: false;\r\n var validation = this.props.state == 'invalid' ?
{isArray(this.props.validationMessage) ? (this.props.validationMessage.length ? this.props.validationMessage[0] : '') : (!!this.props.validationMessage ? this.props.validationMessage : 'This field is required')}
: false;\r\n var className = classNames(\r\n { 'has-error': this.props.state == 'invalid'},\r\n { 'form-group': true }\r\n );\r\n return (\r\n
\r\n {this.props.label && }\r\n
\r\n {this.props.children}\r\n
\r\n {validation}\r\n {desc}\r\n
\r\n\t\t);\r\n }\r\n});\r\n\r\nexport default FormGroup;","\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\n// Use a parallel array because we can't use\r\n// objects as keys, they get toString-coerced\r\nvar registeredComponents = [];\r\nvar handlers = [];\r\n\r\nvar IGNORE_CLASS = 'ignore-react-onclickoutside';\r\n\r\nvar isSourceFound = function (source, localNode) {\r\n if (source === localNode) {\r\n return true;\r\n }\r\n // SVG elements do not technically reside in the rendered DOM, so\r\n // they do not have classList directly, but they offer a link to their\r\n // corresponding element, which can have classList. This extra check is for\r\n // that case.\r\n // See: http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGUseElement\r\n // Discussion: https://github.com/Pomax/react-onclickoutside/pull/17\r\n if (source.correspondingElement) {\r\n return source.correspondingElement.classList.contains(IGNORE_CLASS);\r\n }\r\n return source.classList.contains(IGNORE_CLASS);\r\n};\r\n\r\nexport default {\r\n componentDidMount: function () {\r\n if (typeof this.handleClickOutside !== \"function\")\r\n throw new Error(\"Component lacks a handleClickOutside(event) function for processing outside click events.\");\r\n\r\n var fn = this.__outsideClickHandler = (function (localNode, eventHandler) {\r\n return function (evt) {\r\n evt.stopPropagation();\r\n var source = evt.target;\r\n var found = false;\r\n // If source=local then this event came from \"somewhere\"\r\n // inside and should be ignored. We could handle this with\r\n // a layered approach, too, but that requires going back to\r\n // thinking in terms of Dom node nesting, running counter\r\n // to React's \"you shouldn't care about the DOM\" philosophy.\r\n while (source.parentNode) {\r\n found = isSourceFound(source, localNode);\r\n if (found) return;\r\n source = source.parentNode;\r\n }\r\n // If element is in detached DOM, consider it not clicked\r\n // outside as it can't be known whether it was outside.\r\n if (source !== document) return;\r\n eventHandler(evt);\r\n }\r\n }(ReactDOM.findDOMNode(this), this.handleClickOutside));\r\n\r\n var pos = registeredComponents.length;\r\n registeredComponents.push(this);\r\n handlers[pos] = fn;\r\n\r\n // If there is a truthy disableOnClickOutside property for this\r\n // component, don't immediately start listening for outside events.\r\n if (!this.props.disableOnClickOutside) {\r\n this.enableOnClickOutside();\r\n }\r\n },\r\n\r\n componentWillUnmount: function () {\r\n this.disableOnClickOutside();\r\n this.__outsideClickHandler = false;\r\n var pos = registeredComponents.indexOf(this);\r\n if (pos > -1) {\r\n if (handlers[pos]) {\r\n // clean up so we don't leak memory\r\n handlers.splice(pos, 1);\r\n registeredComponents.splice(pos, 1);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Can be called to explicitly enable event listening\r\n * for clicks and touches outside of this element.\r\n */\r\n enableOnClickOutside: function () {\r\n var fn = this.__outsideClickHandler;\r\n if (document != null) {\r\n document.addEventListener(\"mousedown\", fn);\r\n document.addEventListener(\"touchstart\", fn);\r\n }\r\n },\r\n\r\n /**\r\n * Can be called to explicitly disable event listening\r\n * for clicks and touches outside of this element.\r\n */\r\n disableOnClickOutside: function () {\r\n var fn = this.__outsideClickHandler;\r\n if (document != null) {\r\n document.removeEventListener(\"mousedown\", fn);\r\n document.removeEventListener(\"touchstart\", fn);\r\n }\r\n }\r\n};","'use strict';\r\n\r\n// So each country array has the following information:\r\n// [\r\n// Country name,\r\n// iso2 code,\r\n// International dial code,\r\n// Format (if available),\r\n// Order (if >1 country with same dial code),\r\n// Area codes (if >1 country with same dial code)\r\n// ]\r\nvar allCountries = [\r\n [\r\n 'Afghanistan (‫افغانستان‬‎)',\r\n 'af',\r\n '93'\r\n ],\r\n [\r\n 'Albania (Shqipëri)',\r\n 'al',\r\n '355'\r\n ],\r\n [\r\n 'Algeria (‫الجزائر‬‎)',\r\n 'dz',\r\n '213'\r\n ],\r\n [\r\n 'American Samoa',\r\n 'as',\r\n '1684'\r\n ],\r\n [\r\n 'Andorra',\r\n 'ad',\r\n '376'\r\n ],\r\n [\r\n 'Angola',\r\n 'ao',\r\n '244'\r\n ],\r\n [\r\n 'Anguilla',\r\n 'ai',\r\n '1264'\r\n ],\r\n [\r\n 'Antigua and Barbuda',\r\n 'ag',\r\n '1268'\r\n ],\r\n [\r\n 'Argentina',\r\n 'ar',\r\n '54'\r\n ],\r\n [\r\n 'Armenia (Հայաստան)',\r\n 'am',\r\n '374'\r\n ],\r\n [\r\n 'Aruba',\r\n 'aw',\r\n '297'\r\n ],\r\n [\r\n 'Australia',\r\n 'au',\r\n '61',\r\n '+.. ... ... ...'\r\n ],\r\n [\r\n 'Austria (Österreich)',\r\n 'at',\r\n '43'\r\n ],\r\n [\r\n 'Azerbaijan (Azərbaycan)',\r\n 'az',\r\n '994'\r\n ],\r\n [\r\n 'Bahamas',\r\n 'bs',\r\n '1242'\r\n ],\r\n [\r\n 'Bahrain (‫البحرين‬‎)',\r\n 'bh',\r\n '973'\r\n ],\r\n [\r\n 'Bangladesh (বাংলাদেশ)',\r\n 'bd',\r\n '880'\r\n ],\r\n [\r\n 'Barbados',\r\n 'bb',\r\n '1246'\r\n ],\r\n [\r\n 'Belarus (Беларусь)',\r\n 'by',\r\n '375'\r\n ],\r\n [\r\n 'Belgium (België)',\r\n 'be',\r\n '32',\r\n '+.. ... .. .. ..'\r\n ],\r\n [\r\n 'Belize',\r\n 'bz',\r\n '501'\r\n ],\r\n [\r\n 'Benin (Bénin)',\r\n 'bj',\r\n '229'\r\n ],\r\n [\r\n 'Bermuda',\r\n 'bm',\r\n '1441'\r\n ],\r\n [\r\n 'Bhutan (འབྲུག)',\r\n 'bt',\r\n '975'\r\n ],\r\n [\r\n 'Bolivia',\r\n 'bo',\r\n '591'\r\n ],\r\n [\r\n 'Bosnia and Herzegovina (Босна и Херцеговина)',\r\n 'ba',\r\n '387'\r\n ],\r\n [\r\n 'Botswana',\r\n 'bw',\r\n '267'\r\n ],\r\n [\r\n 'Brazil (Brasil)',\r\n 'br',\r\n '55'\r\n ],\r\n [\r\n 'British Indian Ocean Territory',\r\n 'io',\r\n '246'\r\n ],\r\n [\r\n 'British Virgin Islands',\r\n 'vg',\r\n '1284'\r\n ],\r\n [\r\n 'Brunei',\r\n 'bn',\r\n '673'\r\n ],\r\n [\r\n 'Bulgaria (България)',\r\n 'bg',\r\n '359'\r\n ],\r\n [\r\n 'Burkina Faso',\r\n 'bf',\r\n '226'\r\n ],\r\n [\r\n 'Burundi (Uburundi)',\r\n 'bi',\r\n '257'\r\n ],\r\n [\r\n 'Cambodia (កម្ពុជា)',\r\n 'kh',\r\n '855'\r\n ],\r\n [\r\n 'Cameroon (Cameroun)',\r\n 'cm',\r\n '237'\r\n ],\r\n [\r\n 'Canada',\r\n 'ca',\r\n '1',\r\n '+. (...) ...-....',\r\n 1,\r\n ['204', '236', '249', '250', '289', '306', '343', '365', '387', '403', '416', '418', '431', '437', '438', '450', '506', '514', '519', '548', '579', '581', '587', '604', '613', '639', '647', '672', '705', '709', '742', '778', '780', '782', '807', '819', '825', '867', '873', '902', '905']\r\n ],\r\n [\r\n 'Cape Verde (Kabu Verdi)',\r\n 'cv',\r\n '238'\r\n ],\r\n [\r\n 'Caribbean Netherlands',\r\n 'bq',\r\n '599',\r\n '',\r\n 1\r\n ],\r\n [\r\n 'Cayman Islands',\r\n 'ky',\r\n '1345'\r\n ],\r\n [\r\n 'Central African Republic (République centrafricaine)',\r\n 'cf',\r\n '236'\r\n ],\r\n [\r\n 'Chad (Tchad)',\r\n 'td',\r\n '235'\r\n ],\r\n [\r\n 'Chile',\r\n 'cl',\r\n '56'\r\n ],\r\n [\r\n 'China (中国)',\r\n 'cn',\r\n '86',\r\n '+.. ..-........'\r\n ],\r\n [\r\n 'Colombia',\r\n 'co',\r\n '57'\r\n ],\r\n [\r\n 'Comoros (‫جزر القمر‬‎)',\r\n 'km',\r\n '269'\r\n ],\r\n [\r\n 'Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)',\r\n 'cd',\r\n '243'\r\n ],\r\n [\r\n 'Congo (Republic) (Congo-Brazzaville)',\r\n 'cg',\r\n '242'\r\n ],\r\n [\r\n 'Cook Islands',\r\n 'ck',\r\n '682'\r\n ],\r\n [\r\n 'Costa Rica',\r\n 'cr',\r\n '506',\r\n '+... ....-....'\r\n ],\r\n [\r\n 'Côte d’Ivoire',\r\n 'ci',\r\n '225'\r\n ],\r\n [\r\n 'Croatia (Hrvatska)',\r\n 'hr',\r\n '385'\r\n ],\r\n [\r\n 'Cuba',\r\n 'cu',\r\n '53'\r\n ],\r\n [\r\n 'Curaçao',\r\n 'cw',\r\n '599',\r\n '',\r\n 0\r\n ],\r\n [\r\n 'Cyprus (Κύπρος)',\r\n 'cy',\r\n '357'\r\n ],\r\n [\r\n 'Czech Republic (Česká republika)',\r\n 'cz',\r\n '420'\r\n ],\r\n [\r\n 'Denmark (Danmark)',\r\n 'dk',\r\n '45',\r\n '+.. .. .. .. ..'\r\n ],\r\n [\r\n 'Djibouti',\r\n 'dj',\r\n '253'\r\n ],\r\n [\r\n 'Dominica',\r\n 'dm',\r\n '1767'\r\n ],\r\n [\r\n 'Dominican Republic (República Dominicana)',\r\n 'do',\r\n '1',\r\n '',\r\n 2,\r\n ['809', '829', '849']\r\n ],\r\n [\r\n 'Ecuador',\r\n 'ec',\r\n '593'\r\n ],\r\n [\r\n 'Egypt (‫مصر‬‎)',\r\n 'eg',\r\n '20'\r\n ],\r\n [\r\n 'El Salvador',\r\n 'sv',\r\n '503',\r\n '+... ....-....'\r\n ],\r\n [\r\n 'Equatorial Guinea (Guinea Ecuatorial)',\r\n 'gq',\r\n '240'\r\n ],\r\n [\r\n 'Eritrea',\r\n 'er',\r\n '291'\r\n ],\r\n [\r\n 'Estonia (Eesti)',\r\n 'ee',\r\n '372'\r\n ],\r\n [\r\n 'Ethiopia',\r\n 'et',\r\n '251'\r\n ],\r\n [\r\n 'Falkland Islands (Islas Malvinas)',\r\n 'fk',\r\n '500'\r\n ],\r\n [\r\n 'Faroe Islands (Føroyar)',\r\n 'fo',\r\n '298'\r\n ],\r\n [\r\n 'Fiji',\r\n 'fj',\r\n '679'\r\n ],\r\n [\r\n 'Finland (Suomi)',\r\n 'fi',\r\n '358',\r\n '+... .. ... .. ..'\r\n ],\r\n [\r\n 'France',\r\n 'fr',\r\n '33',\r\n '+.. . .. .. .. ..'\r\n ],\r\n [\r\n 'French Guiana (Guyane française)',\r\n 'gf',\r\n '594'\r\n ],\r\n [\r\n 'French Polynesia (Polynésie française)',\r\n 'pf',\r\n '689'\r\n ],\r\n [\r\n 'Gabon',\r\n 'ga',\r\n '241'\r\n ],\r\n [\r\n 'Gambia',\r\n 'gm',\r\n '220'\r\n ],\r\n [\r\n 'Georgia (საქართველო)',\r\n 'ge',\r\n '995'\r\n ],\r\n [\r\n 'Germany (Deutschland)',\r\n 'de',\r\n '49',\r\n '+.. ... .......'\r\n ],\r\n [\r\n 'Ghana (Gaana)',\r\n 'gh',\r\n '233'\r\n ],\r\n [\r\n 'Gibraltar',\r\n 'gi',\r\n '350'\r\n ],\r\n [\r\n 'Greece (Ελλάδα)',\r\n 'gr',\r\n '30'\r\n ],\r\n [\r\n 'Greenland (Kalaallit Nunaat)',\r\n 'gl',\r\n '299'\r\n ],\r\n [\r\n 'Grenada',\r\n 'gd',\r\n '1473'\r\n ],\r\n [\r\n 'Guadeloupe',\r\n 'gp',\r\n '590',\r\n '',\r\n 0\r\n ],\r\n [\r\n 'Guam',\r\n 'gu',\r\n '1671'\r\n ],\r\n [\r\n 'Guatemala',\r\n 'gt',\r\n '502',\r\n '+... ....-....'\r\n ],\r\n [\r\n 'Guinea (Guinée)',\r\n 'gn',\r\n '224'\r\n ],\r\n [\r\n 'Guinea-Bissau (Guiné Bissau)',\r\n 'gw',\r\n '245'\r\n ],\r\n [\r\n 'Guyana',\r\n 'gy',\r\n '592'\r\n ],\r\n [\r\n 'Haiti',\r\n 'ht',\r\n '509',\r\n '+... ....-....'\r\n ],\r\n [\r\n 'Honduras',\r\n 'hn',\r\n '504'\r\n ],\r\n [\r\n 'Hong Kong (香港)',\r\n 'hk',\r\n '852',\r\n '+... .... ....'\r\n ],\r\n [\r\n 'Hungary (Magyarország)',\r\n 'hu',\r\n '36'\r\n ],\r\n [\r\n 'Iceland (Ísland)',\r\n 'is',\r\n '354',\r\n '+... ... ....'\r\n ],\r\n [\r\n 'India (भारत)',\r\n 'in',\r\n '91',\r\n '+.. .....-.....'\r\n ],\r\n [\r\n 'Indonesia',\r\n 'id',\r\n '62'\r\n ],\r\n [\r\n 'Iran (‫ایران‬‎)',\r\n 'ir',\r\n '98'\r\n ],\r\n [\r\n 'Iraq (‫العراق‬‎)',\r\n 'iq',\r\n '964'\r\n ],\r\n [\r\n 'Ireland',\r\n 'ie',\r\n '353',\r\n '+... .. .......'\r\n ],\r\n [\r\n 'Israel (‫ישראל‬‎)',\r\n 'il',\r\n '972'\r\n ],\r\n [\r\n 'Italy (Italia)',\r\n 'it',\r\n '39',\r\n '+.. ... ......',\r\n 0\r\n ],\r\n [\r\n 'Jamaica',\r\n 'jm',\r\n '1876'\r\n ],\r\n [\r\n 'Japan (日本)',\r\n 'jp',\r\n '81',\r\n '+.. ... .. ....'\r\n ],\r\n [\r\n 'Jordan (‫الأردن‬‎)',\r\n 'jo',\r\n '962'\r\n ],\r\n [\r\n 'Kazakhstan (Казахстан)',\r\n 'kz',\r\n '7',\r\n '+. ... ...-..-..',\r\n 1\r\n ],\r\n [\r\n 'Kenya',\r\n 'ke',\r\n '254'\r\n ],\r\n [\r\n 'Kiribati',\r\n 'ki',\r\n '686'\r\n ],\r\n [\r\n 'Kuwait (‫الكويت‬‎)',\r\n 'kw',\r\n '965'\r\n ],\r\n [\r\n 'Kyrgyzstan (Кыргызстан)',\r\n 'kg',\r\n '996'\r\n ],\r\n [\r\n 'Laos (ລາວ)',\r\n 'la',\r\n '856'\r\n ],\r\n [\r\n 'Latvia (Latvija)',\r\n 'lv',\r\n '371'\r\n ],\r\n [\r\n 'Lebanon (‫لبنان‬‎)',\r\n 'lb',\r\n '961'\r\n ],\r\n [\r\n 'Lesotho',\r\n 'ls',\r\n '266'\r\n ],\r\n [\r\n 'Liberia',\r\n 'lr',\r\n '231'\r\n ],\r\n [\r\n 'Libya (‫ليبيا‬‎)',\r\n 'ly',\r\n '218'\r\n ],\r\n [\r\n 'Liechtenstein',\r\n 'li',\r\n '423'\r\n ],\r\n [\r\n 'Lithuania (Lietuva)',\r\n 'lt',\r\n '370'\r\n ],\r\n [\r\n 'Luxembourg',\r\n 'lu',\r\n '352'\r\n ],\r\n [\r\n 'Macau (澳門)',\r\n 'mo',\r\n '853'\r\n ],\r\n [\r\n 'Macedonia (FYROM) (Македонија)',\r\n 'mk',\r\n '389'\r\n ],\r\n [\r\n 'Madagascar (Madagasikara)',\r\n 'mg',\r\n '261'\r\n ],\r\n [\r\n 'Malawi',\r\n 'mw',\r\n '265'\r\n ],\r\n [\r\n 'Malaysia',\r\n 'my',\r\n '60',\r\n '+.. ..-....-....'\r\n ],\r\n [\r\n 'Maldives',\r\n 'mv',\r\n '960'\r\n ],\r\n [\r\n 'Mali',\r\n 'ml',\r\n '223'\r\n ],\r\n [\r\n 'Malta',\r\n 'mt',\r\n '356'\r\n ],\r\n [\r\n 'Marshall Islands',\r\n 'mh',\r\n '692'\r\n ],\r\n [\r\n 'Martinique',\r\n 'mq',\r\n '596'\r\n ],\r\n [\r\n 'Mauritania (‫موريتانيا‬‎)',\r\n 'mr',\r\n '222'\r\n ],\r\n [\r\n 'Mauritius (Moris)',\r\n 'mu',\r\n '230'\r\n ],\r\n [\r\n 'Mexico (México)',\r\n 'mx',\r\n '52'\r\n ],\r\n [\r\n 'Micronesia',\r\n 'fm',\r\n '691'\r\n ],\r\n [\r\n 'Moldova (Republica Moldova)',\r\n 'md',\r\n '373'\r\n ],\r\n [\r\n 'Monaco',\r\n 'mc',\r\n '377'\r\n ],\r\n [\r\n 'Mongolia (Монгол)',\r\n 'mn',\r\n '976'\r\n ],\r\n [\r\n 'Montenegro (Crna Gora)',\r\n 'me',\r\n '382'\r\n ],\r\n [\r\n 'Montserrat',\r\n 'ms',\r\n '1664'\r\n ],\r\n [\r\n 'Morocco (‫المغرب‬‎)',\r\n 'ma',\r\n '212'\r\n ],\r\n [\r\n 'Mozambique (Moçambique)',\r\n 'mz',\r\n '258'\r\n ],\r\n [\r\n 'Myanmar (Burma) (မြန်မာ)',\r\n 'mm',\r\n '95'\r\n ],\r\n [\r\n 'Namibia (Namibië)',\r\n 'na',\r\n '264'\r\n ],\r\n [\r\n 'Nauru',\r\n 'nr',\r\n '674'\r\n ],\r\n [\r\n 'Nepal (नेपाल)',\r\n 'np',\r\n '977'\r\n ],\r\n [\r\n 'Netherlands (Nederland)',\r\n 'nl',\r\n '31',\r\n '+.. .. ........'\r\n ],\r\n [\r\n 'New Caledonia (Nouvelle-Calédonie)',\r\n 'nc',\r\n '687'\r\n ],\r\n [\r\n 'New Zealand',\r\n 'nz',\r\n '64',\r\n '+.. ...-...-....'\r\n ],\r\n [\r\n 'Nicaragua',\r\n 'ni',\r\n '505'\r\n ],\r\n [\r\n 'Niger (Nijar)',\r\n 'ne',\r\n '227'\r\n ],\r\n [\r\n 'Nigeria',\r\n 'ng',\r\n '234'\r\n ],\r\n [\r\n 'Niue',\r\n 'nu',\r\n '683'\r\n ],\r\n [\r\n 'Norfolk Island',\r\n 'nf',\r\n '672'\r\n ],\r\n [\r\n 'North Korea (조선 민주주의 인민 공화국)',\r\n 'kp',\r\n '850'\r\n ],\r\n [\r\n 'Northern Mariana Islands',\r\n 'mp',\r\n '1670'\r\n ],\r\n [\r\n 'Norway (Norge)',\r\n 'no',\r\n '47',\r\n '+.. ... .. ...'\r\n ],\r\n [\r\n 'Oman (‫عُمان‬‎)',\r\n 'om',\r\n '968'\r\n ],\r\n [\r\n 'Pakistan (‫پاکستان‬‎)',\r\n 'pk',\r\n '92',\r\n '+.. ...-.......'\r\n ],\r\n [\r\n 'Palau',\r\n 'pw',\r\n '680'\r\n ],\r\n [\r\n 'Palestine (‫فلسطين‬‎)',\r\n 'ps',\r\n '970'\r\n ],\r\n [\r\n 'Panama (Panamá)',\r\n 'pa',\r\n '507'\r\n ],\r\n [\r\n 'Papua New Guinea',\r\n 'pg',\r\n '675'\r\n ],\r\n [\r\n 'Paraguay',\r\n 'py',\r\n '595'\r\n ],\r\n [\r\n 'Peru (Perú)',\r\n 'pe',\r\n '51'\r\n ],\r\n [\r\n 'Philippines',\r\n 'ph',\r\n '63',\r\n '+.. ... ....'\r\n ],\r\n [\r\n 'Poland (Polska)',\r\n 'pl',\r\n '48',\r\n '+.. ...-...-...'\r\n ],\r\n [\r\n 'Portugal',\r\n 'pt',\r\n '351'\r\n ],\r\n [\r\n 'Puerto Rico',\r\n 'pr',\r\n '1',\r\n '',\r\n 3,\r\n ['787', '939']\r\n ],\r\n [\r\n 'Qatar (‫قطر‬‎)',\r\n 'qa',\r\n '974'\r\n ],\r\n [\r\n 'Réunion (La Réunion)',\r\n 're',\r\n '262'\r\n ],\r\n [\r\n 'Romania (România)',\r\n 'ro',\r\n '40'\r\n ],\r\n [\r\n 'Russia (Россия)',\r\n 'ru',\r\n '7',\r\n '+. ... ...-..-..',\r\n 0\r\n ],\r\n [\r\n 'Rwanda',\r\n 'rw',\r\n '250'\r\n ],\r\n [\r\n 'Saint Barthélemy (Saint-Barthélemy)',\r\n 'bl',\r\n '590',\r\n '',\r\n 1\r\n ],\r\n [\r\n 'Saint Helena',\r\n 'sh',\r\n '290'\r\n ],\r\n [\r\n 'Saint Kitts and Nevis',\r\n 'kn',\r\n '1869'\r\n ],\r\n [\r\n 'Saint Lucia',\r\n 'lc',\r\n '1758'\r\n ],\r\n [\r\n 'Saint Martin (Saint-Martin (partie française))',\r\n 'mf',\r\n '590',\r\n '',\r\n 2\r\n ],\r\n [\r\n 'Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)',\r\n 'pm',\r\n '508'\r\n ],\r\n [\r\n 'Saint Vincent and the Grenadines',\r\n 'vc',\r\n '1784'\r\n ],\r\n [\r\n 'Samoa',\r\n 'ws',\r\n '685'\r\n ],\r\n [\r\n 'San Marino',\r\n 'sm',\r\n '378'\r\n ],\r\n [\r\n 'São Tomé and Príncipe (São Tomé e Príncipe)',\r\n 'st',\r\n '239'\r\n ],\r\n [\r\n 'Saudi Arabia (‫المملكة العربية السعودية‬‎)',\r\n 'sa',\r\n '966'\r\n ],\r\n [\r\n 'Senegal (Sénégal)',\r\n 'sn',\r\n '221'\r\n ],\r\n [\r\n 'Serbia (Србија)',\r\n 'rs',\r\n '381'\r\n ],\r\n [\r\n 'Seychelles',\r\n 'sc',\r\n '248'\r\n ],\r\n [\r\n 'Sierra Leone',\r\n 'sl',\r\n '232'\r\n ],\r\n [\r\n 'Singapore',\r\n 'sg',\r\n '65',\r\n '+.. ....-....'\r\n ],\r\n [\r\n 'Sint Maarten',\r\n 'sx',\r\n '1721'\r\n ],\r\n [\r\n 'Slovakia (Slovensko)',\r\n 'sk',\r\n '421'\r\n ],\r\n [\r\n 'Slovenia (Slovenija)',\r\n 'si',\r\n '386'\r\n ],\r\n [\r\n 'Solomon Islands',\r\n 'sb',\r\n '677'\r\n ],\r\n [\r\n 'Somalia (Soomaaliya)',\r\n 'so',\r\n '252'\r\n ],\r\n [\r\n 'South Africa',\r\n 'za',\r\n '27'\r\n ],\r\n [\r\n 'South Korea (대한민국)',\r\n 'kr',\r\n '82'\r\n ],\r\n [\r\n 'South Sudan (‫جنوب السودان‬‎)',\r\n 'ss',\r\n '211'\r\n ],\r\n [\r\n 'Spain (España)',\r\n 'es',\r\n '34',\r\n '+.. ... ... ...'\r\n ],\r\n [\r\n 'Sri Lanka (ශ්‍රී ලංකාව)',\r\n 'lk',\r\n '94'\r\n ],\r\n [\r\n 'Sudan (‫السودان‬‎)',\r\n 'sd',\r\n '249'\r\n ],\r\n [\r\n 'Suriname',\r\n 'sr',\r\n '597'\r\n ],\r\n [\r\n 'Swaziland',\r\n 'sz',\r\n '268'\r\n ],\r\n [\r\n 'Sweden (Sverige)',\r\n 'se',\r\n '46',\r\n '+.. .. ... .. ..'\r\n ],\r\n [\r\n 'Switzerland (Schweiz)',\r\n 'ch',\r\n '41',\r\n '+.. .. ... .. ..'\r\n ],\r\n [\r\n 'Syria (‫سوريا‬‎)',\r\n 'sy',\r\n '963'\r\n ],\r\n [\r\n 'Taiwan (台灣)',\r\n 'tw',\r\n '886'\r\n ],\r\n [\r\n 'Tajikistan',\r\n 'tj',\r\n '992'\r\n ],\r\n [\r\n 'Tanzania',\r\n 'tz',\r\n '255'\r\n ],\r\n [\r\n 'Thailand (ไทย)',\r\n 'th',\r\n '66'\r\n ],\r\n [\r\n 'Timor-Leste',\r\n 'tl',\r\n '670'\r\n ],\r\n [\r\n 'Togo',\r\n 'tg',\r\n '228'\r\n ],\r\n [\r\n 'Tokelau',\r\n 'tk',\r\n '690'\r\n ],\r\n [\r\n 'Tonga',\r\n 'to',\r\n '676'\r\n ],\r\n [\r\n 'Trinidad and Tobago',\r\n 'tt',\r\n '1868'\r\n ],\r\n [\r\n 'Tunisia (‫تونس‬‎)',\r\n 'tn',\r\n '216'\r\n ],\r\n [\r\n 'Turkey (Türkiye)',\r\n 'tr',\r\n '90',\r\n '+.. ... ... .. ..'\r\n ],\r\n [\r\n 'Turkmenistan',\r\n 'tm',\r\n '993'\r\n ],\r\n [\r\n 'Turks and Caicos Islands',\r\n 'tc',\r\n '1649'\r\n ],\r\n [\r\n 'Tuvalu',\r\n 'tv',\r\n '688'\r\n ],\r\n [\r\n 'U.S. Virgin Islands',\r\n 'vi',\r\n '1340'\r\n ],\r\n [\r\n 'Uganda',\r\n 'ug',\r\n '256'\r\n ],\r\n [\r\n 'Ukraine (Україна)',\r\n 'ua',\r\n '380'\r\n ],\r\n [\r\n 'United Arab Emirates (‫الإمارات العربية المتحدة‬‎)',\r\n 'ae',\r\n '971'\r\n ],\r\n [\r\n 'United Kingdom',\r\n 'gb',\r\n '44',\r\n '+.. .... ......'\r\n ],\r\n [\r\n 'United States',\r\n 'us',\r\n '1',\r\n '+. (...) ...-....',\r\n 0\r\n ],\r\n [\r\n 'Uruguay',\r\n 'uy',\r\n '598'\r\n ],\r\n [\r\n 'Uzbekistan (Oʻzbekiston)',\r\n 'uz',\r\n '998'\r\n ],\r\n [\r\n 'Vanuatu',\r\n 'vu',\r\n '678'\r\n ],\r\n [\r\n 'Vatican City (Città del Vaticano)',\r\n 'va',\r\n '39',\r\n '+.. .. .... ....',\r\n 1\r\n ],\r\n [\r\n 'Venezuela',\r\n 've',\r\n '58'\r\n ],\r\n [\r\n 'Vietnam (Việt Nam)',\r\n 'vn',\r\n '84'\r\n ],\r\n [\r\n 'Wallis and Futuna',\r\n 'wf',\r\n '681'\r\n ],\r\n [\r\n 'Yemen (‫اليمن‬‎)',\r\n 'ye',\r\n '967'\r\n ],\r\n [\r\n 'Zambia',\r\n 'zm',\r\n '260'\r\n ],\r\n [\r\n 'Zimbabwe',\r\n 'zw',\r\n '263'\r\n ]\r\n];\r\n\r\n// we will build this in the loop below\r\nvar allCountryCodes = {};\r\nvar addCountryCode = function (iso2, dialCode, priority) {\r\n if (!(dialCode in allCountryCodes)) {\r\n allCountryCodes[dialCode] = [];\r\n }\r\n var index = priority || 0;\r\n allCountryCodes[dialCode][index] = iso2;\r\n};\r\n\r\n// loop over all of the countries above\r\n// allCountries2 = _.map(allCountries, function(country) {\r\n// return {\r\n// name: country[0],\r\n// iso2: country[1],\r\n// dialCode: country[2],\r\n// format: country[3],\r\n// hasAreaCodes: country.length > 4\r\n// }\r\n// });\r\n\r\nfor (var i = 0; i < allCountries.length; i++) {\r\n // countries\r\n var c = allCountries[i];\r\n allCountries[i] = {\r\n name: c[0],\r\n iso2: c[1],\r\n dialCode: c[2],\r\n priority: c[4] || 0\r\n };\r\n // format\r\n if (c[3]) {\r\n allCountries[i].format = c[3];\r\n }\r\n\r\n // area codes\r\n if (c[5]) {\r\n allCountries[i].hasAreaCodes = true;\r\n for (var j = 0; j < c[5].length; j++) {\r\n // full dial code is country code + dial code\r\n var dialCode = c[2] + c[5][j];\r\n addCountryCode(c[1], dialCode);\r\n }\r\n }\r\n\r\n // dial codes\r\n addCountryCode(c[1], c[2], c[4]);\r\n}\r\n\r\nexport default {\r\n allCountries: allCountries,\r\n allCountryCodes: allCountryCodes\r\n};","import countryData from '../components/common/country_mobile_data';\r\nimport some from 'lodash/some';\r\nimport startsWith from 'lodash/startsWith';\r\n\r\nexport default function (inputNumber) {\r\n if (!inputNumber) {\r\n return false;\r\n }\r\n\r\n if (inputNumber.length < 7) {\r\n return false;\r\n }\r\n\r\n var countries = countryData.allCountries;\r\n return some(countries, function (country) {\r\n return startsWith(inputNumber, country.dialCode) || startsWith(country.dialCode, inputNumber);\r\n });\r\n};"," 'use strict';\r\n\r\n// TODO - fix the onlyContries props. Currently expects that as an array of country object, but users should be able to send in array of country isos\r\n\r\nimport find from 'lodash/find';\r\n\r\nimport reduce from 'lodash/reduce';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport any from 'lodash/some';\r\nimport findIndex from 'lodash/findIndex';\r\nimport first from 'lodash/first';\r\nimport tail from 'lodash/tail';\r\nimport debounce from 'lodash/debounce';\r\nimport memoize from 'lodash/memoize';\r\n\r\n// import lodash string methods\r\nimport trim from 'lodash/trim';\r\n\r\nimport startsWith from 'lodash/startsWith';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport onClickOutside from './react-onclickoutside.jsx';\r\nimport classNames from 'classnames';\r\nimport countryData from './country_mobile_data';\r\nvar allCountries = countryData.allCountries;\r\n\r\nimport validateNumber from '../../validators/Telephone.js';\r\n\r\nif (typeof document !== 'undefined') {\r\n var isModernBrowser = Boolean(document.createElement('input').setSelectionRange);\r\n} else {\r\n var isModernBrowser = true;\r\n}\r\n\r\nvar keys = {\r\n UP: 38,\r\n DOWN: 40,\r\n RIGHT: 39,\r\n LEFT: 37,\r\n ENTER: 13,\r\n ESC: 27,\r\n PLUS: 43,\r\n A: 65,\r\n Z: 90,\r\n SPACE: 32\r\n};\r\n\r\nvar ReactTelephoneInput = createReactClass({\r\n mixins: [onClickOutside],\r\n getInitialState: function() {\r\n var inputNumber = this.props.value || '';\r\n var selectedCountryGuess = this.guessSelectedCountry(inputNumber.replace(/\\D/g, ''));\r\n var selectedCountryGuessIndex = findIndex(allCountries, selectedCountryGuess);\r\n var formattedNumber = this.formatNumber(inputNumber.replace(/\\D/g, ''), selectedCountryGuess ? selectedCountryGuess.format : null);\r\n var preferredCountries = [];\r\n\r\n preferredCountries = filter(allCountries, function(country) {\r\n return any(this.props.preferredCountries, function(preferredCountry) {\r\n return preferredCountry === country.iso2;\r\n });\r\n }.bind(this));\r\n\r\n return {\r\n preferredCountries: preferredCountries,\r\n selectedCountry: selectedCountryGuess,\r\n highlightCountryIndex: selectedCountryGuessIndex,\r\n formattedNumber: formattedNumber,\r\n showDropDown: false,\r\n queryString: '',\r\n freezeSelection: false,\r\n debouncedQueryStingSearcher: debounce(this.searchCountry, 100)\r\n };\r\n },\r\n propTypes: {\r\n value: PropTypes.string,\r\n autoFormat: PropTypes.bool,\r\n defaultCountry: PropTypes.string,\r\n onlyCountries: PropTypes.arrayOf(PropTypes.object),\r\n preferredCountries: PropTypes.arrayOf(PropTypes.object),\r\n onChange: PropTypes.func,\r\n onEnterKeyPress: PropTypes.func,\r\n focusOnLoad: PropTypes.bool\r\n },\r\n getDefaultProps: function () {\r\n return {\r\n value: '',\r\n autoFormat: true,\r\n onlyCountries: allCountries,\r\n defaultCountry: allCountries[1].iso2,\r\n showValidation: true,\r\n isValid: validateNumber,\r\n flagsImagePath: 'flags.png',\r\n onEnterKeyPress: function () {}\r\n };\r\n },\r\n getNumber: function () {\r\n return this.state.formattedNumber !== '+' ? this.state.formattedNumber : '';\r\n },\r\n getValue: function () {\r\n return this.getNumber();\r\n },\r\n componentDidMount: function () {\r\n document.addEventListener('keydown', this.handleKeydown);\r\n\r\n this._cursorToEnd(true);\r\n //if(typeof this.props.onChange === 'function') {\r\n // this.props.onChange(this.state.formattedNumber);\r\n //}\r\n\r\n if (this.props.focusOnLoad) {\r\n this.refs.numberInput.focus();\r\n }\r\n },\r\n componentWillUnmount: function () {\r\n document.removeEventListener('keydown', this.handleKeydown);\r\n },\r\n scrollTo: function (country, middle) {\r\n if(!country) {\r\n return;\r\n }\r\n\r\n var container = ReactDOM.findDOMNode(this.refs.flagDropdownList);\r\n\r\n if(!container) {\r\n return;\r\n }\r\n\r\n var containerHeight = container.offsetHeight;\r\n var containerOffset = container.getBoundingClientRect();\r\n var containerTop = containerOffset.top + document.body.scrollTop;\r\n var containerBottom = containerTop + containerHeight;\r\n\r\n var element = country;\r\n var elementOffset = element.getBoundingClientRect();\r\n\r\n var elementHeight = element.offsetHeight;\r\n var elementTop = elementOffset.top + document.body.scrollTop;\r\n var elementBottom = elementTop + elementHeight;\r\n var newScrollTop = elementTop - containerTop + container.scrollTop;\r\n var middleOffset = (containerHeight / 2) - (elementHeight / 2);\r\n\r\n if (elementTop < containerTop) {\r\n // scroll up\r\n if (middle) {\r\n newScrollTop -= middleOffset;\r\n }\r\n container.scrollTop = newScrollTop;\r\n } else if (elementBottom > containerBottom) {\r\n // scroll down\r\n if(middle) {\r\n newScrollTop += middleOffset;\r\n }\r\n var heightDifference = containerHeight - elementHeight;\r\n container.scrollTop = newScrollTop - heightDifference;\r\n }\r\n },\r\n formatNumber: function (text, pattern) {\r\n if(!text || text.length === 0) {\r\n return '+';\r\n }\r\n\r\n // for all strings with length less than 3, just return it (1, 2 etc.)\r\n // also return the same text if the selected country has no fixed format\r\n if((text && text.length < 2) || !pattern || !this.props.autoFormat) {\r\n return '+' + text;\r\n }\r\n\r\n var formattedObject = reduce(pattern, function(acc, character) {\r\n if(acc.remainingText.length === 0) {\r\n return acc;\r\n }\r\n\r\n if(character !== '.') {\r\n return {\r\n formattedText: acc.formattedText + character,\r\n remainingText: acc.remainingText\r\n };\r\n }\r\n\r\n return {\r\n formattedText: acc.formattedText + first(acc.remainingText),\r\n remainingText: tail(acc.remainingText)\r\n };\r\n }, {formattedText: '', remainingText: text.split('')});\r\n return formattedObject.formattedText + formattedObject.remainingText.join('');\r\n },\r\n\r\n // put the cursor to the end of the input (usually after a focus event)\r\n _cursorToEnd: function (skipFocus) {\r\n var input = ReactDOM.findDOMNode(this.refs.numberInput);\r\n if (skipFocus) {\r\n this.handleInputFocus();\r\n } else {\r\n input.focus();\r\n\r\n if (isModernBrowser) {\r\n var len = input.value.length;\r\n input.setSelectionRange(len, len);\r\n }\r\n }\r\n },\r\n // memoize results based on the first 5/6 characters. That is all that matters\r\n guessSelectedCountry: memoize(function(inputNumber) {\r\n var secondBestGuess = find(allCountries, function(country) { return country.iso2 == this.props.defaultCountry || country.iso2 == this.props.onlyCountries[0] }.bind(this));\r\n if(trim(inputNumber) !== '') {\r\n var bestGuess = reduce(this.props.onlyCountries, function(selectedCountry, country) {\r\n if(startsWith(inputNumber, country.dialCode)) {\r\n if(country.dialCode.length > selectedCountry.dialCode.length) {\r\n return country;\r\n }\r\n if(country.dialCode.length === selectedCountry.dialCode.length && country.priority < selectedCountry.priority) {\r\n return country;\r\n }\r\n }\r\n\r\n return selectedCountry;\r\n }.bind(this), {dialCode: '', priority: 10001});\r\n } else {\r\n return secondBestGuess;\r\n }\r\n\r\n if(!bestGuess.name) {\r\n return secondBestGuess;\r\n }\r\n\r\n return bestGuess;\r\n }),\r\n getElement: function (index) {\r\n return ReactDOM.findDOMNode(this.refs['flag_no_' + index]);\r\n },\r\n handleFlagDropdownClick: function () {\r\n // need to put the highlight on the current selected country if the dropdown is going to open up\r\n this.setState({\r\n showDropDown: !this.state.showDropDown,\r\n highlightCountry: find(this.props.onlyCountries, c => c == this.state.selectedCountry),\r\n highlightCountryIndex: findIndex(this.props.onlyCountries, c => c == this.state.selectedCountry)\r\n }, function() {\r\n // only need to scrool if the dropdown list is alive\r\n if(this.state.showDropDown) {\r\n this.scrollTo(this.getElement(this.state.highlightCountryIndex + this.state.preferredCountries.length));\r\n }\r\n });\r\n },\r\n handleInput: function (event) {\r\n var formattedNumber = '+', newSelectedCountry = this.state.selectedCountry, freezeSelection = this.state.freezeSelection;\r\n\r\n // if the input is the same as before, must be some special key like enter etc.\r\n if(event.target.value === this.state.formattedNumber) {\r\n return;\r\n }\r\n\r\n // ie hack\r\n if(event.preventDefault) {\r\n event.preventDefault();\r\n } else {\r\n event.returnValue = false;\r\n }\r\n\r\n if(event.target.value.length > 0) {\r\n // before entering the number in new format, lets check if the dial code now matches some other country\r\n var inputNumber = event.target.value.replace(/\\D/g, '');\r\n\r\n // we don't need to send the whole number to guess the country... only the first 6 characters are enough\r\n // the guess country function can then use memoization much more effectively since the set of input it gets has drastically reduced\r\n if(!this.state.freezeSelection || this.state.selectedCountry.dialCode.length > inputNumber.length) {\r\n newSelectedCountry = this.guessSelectedCountry(inputNumber.substring(0, 6));\r\n freezeSelection = false;\r\n }\r\n\r\n // let us remove all non numerals from the input\r\n formattedNumber = this.formatNumber(inputNumber, newSelectedCountry ? newSelectedCountry.format : null);\r\n }\r\n\r\n var caretPosition = event.target.selectionStart;\r\n var oldFormattedText = this.state.formattedNumber;\r\n var diff = formattedNumber.length - oldFormattedText.length;\r\n\r\n this.setState({\r\n formattedNumber: formattedNumber,\r\n freezeSelection: freezeSelection,\r\n selectedCountry: newSelectedCountry.dialCode.length > 0 ? newSelectedCountry : this.state.selectedCountry\r\n }, function() {\r\n if(isModernBrowser) {\r\n if(diff > 0) {\r\n caretPosition = caretPosition - diff;\r\n }\r\n\r\n if(caretPosition > 0 && oldFormattedText.length >= formattedNumber.length) {\r\n ReactDOM.findDOMNode(this.refs.numberInput).setSelectionRange(caretPosition, caretPosition);\r\n }\r\n }\r\n\r\n if(this.props.onChange) {\r\n this.props.onChange(this.state.formattedNumber);\r\n }\r\n });\r\n\r\n },\r\n handleInputClick: function () {\r\n this.setState({showDropDown: false});\r\n },\r\n\r\n updateCountry: function (countryIso2Code) {\r\n var currentSelectedCountry = this.state.selectedCountry;\r\n var nextSelectedCountry = find(this.props.onlyCountries, c => c.iso2 === countryIso2Code);\r\n if (!nextSelectedCountry) return;\r\n\r\n var newNumber = this.state.formattedNumber.replace(currentSelectedCountry.dialCode, nextSelectedCountry.dialCode);\r\n var formattedNumber = this.formatNumber(newNumber.replace(/\\D/g, ''), nextSelectedCountry.format);\r\n this.setState({\r\n selectedCountry: nextSelectedCountry,\r\n formattedNumber: formattedNumber\r\n });\r\n },\r\n\r\n handleFlagItemClick: function (country) {\r\n var currentSelectedCountry = this.state.selectedCountry;\r\n var nextSelectedCountry = find(this.props.onlyCountries, c => c.iso2 === country.iso2);\r\n\r\n // tiny optimization\r\n if(currentSelectedCountry.iso2 !== nextSelectedCountry.iso2) {\r\n // TODO - the below replacement is a bug. It will replace stuff from middle too\r\n var newNumber = this.state.formattedNumber.replace(currentSelectedCountry.dialCode, nextSelectedCountry.dialCode);\r\n var formattedNumber = this.formatNumber(newNumber.replace(/\\D/g, ''), nextSelectedCountry.format);\r\n\r\n this.setState({\r\n showDropDown: false,\r\n selectedCountry: nextSelectedCountry,\r\n freezeSelection: true,\r\n formattedNumber: formattedNumber\r\n }, function() {\r\n this._cursorToEnd();\r\n if(this.props.onChange) {\r\n this.props.onChange(formattedNumber);\r\n }\r\n });\r\n } else {\r\n this.setState({showDropDown: false});\r\n }\r\n },\r\n handleInputFocus: function () {\r\n // if the input is blank, insert dial code of the selected country\r\n if (ReactDOM.findDOMNode(this.refs.numberInput).value === '+') {\r\n this.setState({formattedNumber: '+' + this.state.selectedCountry.dialCode});\r\n }\r\n },\r\n _getHighlightCountryIndex: function (direction) {\r\n // had to write own function because underscore does not have findIndex. lodash has it\r\n var highlightCountryIndex = this.state.highlightCountryIndex + direction;\r\n\r\n if(highlightCountryIndex < 0\r\n || highlightCountryIndex >= (this.props.onlyCountries.length + this.state.preferredCountries.length)) {\r\n return highlightCountryIndex - direction;\r\n }\r\n\r\n return highlightCountryIndex;\r\n },\r\n // memoize search results... caching all the way\r\n _searchCountry: memoize(function(queryString) {\r\n if(!queryString || queryString.length === 0) {\r\n return null;\r\n }\r\n // don't include the preferred countries in search\r\n var probableCountries = filter(this.props.onlyCountries, function(country) {\r\n return startsWith(country.name.toLowerCase(), queryString.toLowerCase());\r\n }.bind(this));\r\n return probableCountries[0];\r\n }),\r\n searchCountry: function () {\r\n var probableCandidate = this._searchCountry(this.state.queryString) || this.props.onlyCountries[0];\r\n var probableCandidateIndex = findIndex(this.props.onlyCountries, probableCandidate) + this.state.preferredCountries.length;\r\n\r\n this.scrollTo(this.getElement(probableCandidateIndex), true);\r\n\r\n this.setState({\r\n queryString: '',\r\n highlightCountryIndex: probableCandidateIndex\r\n });\r\n },\r\n handleKeydown: function (event) {\r\n if(!this.state.showDropDown) {\r\n return;\r\n }\r\n\r\n // ie hack\r\n if(event.preventDefault) {\r\n event.preventDefault();\r\n } else {\r\n event.returnValue = false;\r\n }\r\n\r\n var self = this;\r\n function _moveHighlight(direction) {\r\n self.setState({\r\n highlightCountryIndex: self._getHighlightCountryIndex(direction)\r\n }, function() {\r\n self.scrollTo(self.getElement(this.state.highlightCountryIndex), true);\r\n });\r\n }\r\n\r\n switch(event.which) {\r\n case keys.DOWN:\r\n _moveHighlight(1);\r\n break;\r\n case keys.UP:\r\n _moveHighlight(-1);\r\n break;\r\n case keys.ENTER:\r\n this.handleFlagItemClick(this.props.onlyCountries[this.state.highlightCountryIndex], event);\r\n break;\r\n case keys.ESC:\r\n this.setState({showDropDown: false}, this._cursorToEnd);\r\n break;\r\n default:\r\n if((event.which >= keys.A && event.which <= keys.Z) || event.which === keys.SPACE) {\r\n this.setState({queryString: this.state.queryString + String.fromCharCode(event.which)},\r\n this.state.debouncedQueryStingSearcher);\r\n }\r\n }\r\n },\r\n handleInputKeyDown: function (event) {\r\n if(event.which === keys.ENTER) {\r\n this.props.onEnterKeyPress(event);\r\n }\r\n },\r\n handleClickOutside: function () {\r\n if(this.state.showDropDown) {\r\n this.setState({\r\n showDropDown: false\r\n });\r\n }\r\n },\r\n getCountryDropDownList: function () {\r\n\r\n var countryDropDownList = map(this.state.preferredCountries.concat(this.props.onlyCountries), function(country, index) {\r\n var itemClasses = classNames({\r\n country: true,\r\n preferred: country.iso2 === 'us' || country.iso2 === 'gb',\r\n active: country.iso2 === 'us',\r\n highlight: this.state.highlightCountryIndex === index\r\n });\r\n\r\n var inputFlagClasses = 'flag ' + country.iso2;\r\n\r\n return (\r\n \r\n
\r\n {country.name}\r\n {'+' + country.dialCode}\r\n \r\n );\r\n}.bind(this));\r\n\r\n var dashedLi = (
  • );\r\n // let's insert a dashed line in between preffered countries and the rest\r\n countryDropDownList.splice(this.state.preferredCountries.length, 0, dashedLi);\r\n\r\n var dropDownClasses = classNames({\r\n 'country-list': true,\r\n 'hide': !this.state.showDropDown\r\n});\r\n return (\r\n
      \r\n{countryDropDownList}\r\n
    \r\n );\r\n},\r\n getFlagStyle: function () {\r\n return {\r\n width: 16,\r\n height: 11,\r\n backgroundImage: 'url(' + this.props.flagsImagePath + ')'\r\n};\r\n},\r\n render: function () {\r\n var arrowClasses = classNames({\r\n 'arrow': true,\r\n 'up': this.state.showDropDown\r\n});\r\n var inputClasses = classNames({\r\n 'form-control': true,\r\n 'invalid-number': this.props.showValidation && !this.props.isValid(this.state.formattedNumber.replace(/\\D/g, '')),\r\n 'max-w-lg': true\r\n});\r\n\r\n var flagViewClasses = classNames({\r\n 'flag-dropdown': true,\r\n 'open-dropdown': this.state.showDropDown\r\n});\r\n\r\n var inputFlagClasses = 'flag ' + this.state.selectedCountry.iso2;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n{this.state.showDropDown ? this.getCountryDropDownList() : ''}\r\n
    \r\n
    \r\n );\r\n}\r\n});\r\n\r\nexport default ReactTelephoneInput;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport BasketStore from '../../stores/BasketStore';\r\n\r\nvar NavigationButtons = createReactClass({\r\n displayName: 'NavigationButtons',\r\n props: {\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n hideCancel: this.props.hideCancel || BasketStore.numberOfItems() == 0\r\n };\r\n },\r\n\r\n getDefaultProps: function () {\r\n return {\r\n hideBack: false,\r\n hideNext: false,\r\n backText: '❮ Back',\r\n nextText: 'Next ❯',\r\n cancelText: 'Cancel',\r\n onBack: null,\r\n onNext: null,\r\n onCancel: null,\r\n backClass: 'float-left',\r\n cancelClass: 'float-left',\r\n nextClass: 'float-right'\r\n }\r\n },\r\n\r\n next: function () {\r\n if (this.props.onNext) {\r\n this.props.onNext();\r\n } else {\r\n this.props.wizard.nextQuestion();\r\n }\r\n },\r\n\r\n back: function () {\r\n if (this.props.onBack) {\r\n this.props.onBack();\r\n } else {\r\n this.props.wizard.previousQuestion();\r\n }\r\n },\r\n\r\n cancel: function () {\r\n if (this.props.onCancel) {\r\n this.props.onCancel();\r\n } else {\r\n this.props.wizard.jumpToWhatNext(true);\r\n }\r\n },\r\n\r\n render: function() { \r\n\r\n return
    \r\n { \r\n this.props.hideNext \r\n ? false\r\n : \r\n }\r\n {\r\n this.props.hideBack \r\n ? false \r\n : \r\n }\r\n {\r\n this.state.hideCancel || this.props.wizard.state.CurrentComponentDisplayName == 'Billing'\r\n ? false \r\n : \r\n }\r\n
    ;\r\n }\r\n});\r\n\r\nexport default NavigationButtons;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\n\r\nvar Loading = createReactClass({\r\n render: function () {\r\n var cubeStyle = this.props.useDarkTheme ? { backgroundColor: 'white' } : {};\r\n var cubes = [];\r\n for (var i = 1; i <= 9; i++) {\r\n cubes.push(
    );\r\n }\r\n\r\n return
    \r\n
    \r\n
    \r\n {cubes}\r\n
    \r\n
    {this.props.loadingMessage || 'Loading...'}
    \r\n
    \r\n
    {this.props.children}
    \r\n
    ;\r\n }\r\n});\r\n\r\nexport default Loading;","// [ prodPk, name, iso2, iso3 ]\r\nvar countries = [\r\n[1, \"Afghanistan\", \"AF\", \"AFG\"],\r\n[2, \"Albania\", \"AL\", \"ALB\"],\r\n[3, \"Algeria\", \"DZ\", \"DZA\"],\r\n[4, \"American Samoa\", \"AS\", \"ASM\"],\r\n[5, \"Andorra\", \"AD\", \"AND\"],\r\n[6, \"Angola\", \"AO\", \"AGO\"],\r\n[7, \"Anguilla\", \"AI\", \"AIA\"],\r\n[8, \"Antarctica\", \"AQ\", \"ATA\"],\r\n[9, \"Antigua and Barbuda\", \"AG\", \"ATG\"],\r\n[10, \"Argentina\", \"AR\", \"ARG\"],\r\n[11, \"Armenia\", \"AM\", \"ARM\"],\r\n[12, \"Aruba\", \"AW\", \"ABW\"],\r\n[13, \"Australia\", \"AU\", \"AUS\"],\r\n[14, \"Austria\", \"AT\", \"AUT\"],\r\n[15, \"Azerbaijan\", \"AZ\", \"AZE\"],\r\n[16, \"Bahamas\", \"BS\", \"BHS\"],\r\n[17, \"Bahrain\", \"BH\", \"BHR\"],\r\n[18, \"Bangladesh\", \"BD\", \"BGD\"],\r\n[19, \"Barbados\", \"BB\", \"BRB\"],\r\n[20, \"Belarus\", \"BY\", \"BLR\"],\r\n[21, \"Belgium\", \"BE\", \"BEL\"],\r\n[22, \"Belize\", \"BZ\", \"BLZ\"],\r\n[23, \"Benin\", \"BJ\", \"BEN\"],\r\n[24, \"Bermuda\", \"BM\", \"BMU\"],\r\n[25, \"Bhutan\", \"BT\", \"BTN\"],\r\n[26, \"Bolivia\", \"BO\", \"BOL\"],\r\n[27, \"Bosnia and Herzegovina\", \"BA\", \"BIH\"],\r\n[28, \"Botswana\", \"BW\", \"BWA\"],\r\n[29, \"Bouvet Island\", \"BV\", \"BVT\"],\r\n[30, \"Brazil\", \"BR\", \"BRA\"],\r\n[31, \"British Indian Ocean Territory\", \"IO\", \"IOT\"],\r\n[32, \"Brunei Darussalam\", \"BN\", \"BRN\"],\r\n[33, \"Bulgaria\", \"BG\", \"BGR\"],\r\n[34, \"Burkina Faso\", \"BF\", \"BFA\"],\r\n[35, \"Burundi\", \"BI\", \"BDI\"],\r\n[36, \"Cambodia\", \"KH\", \"KHM\"],\r\n[37, \"Cameroon\", \"CM\", \"CMR\"],\r\n[38, \"Canada\", \"CA\", \"CAN\"],\r\n[39, \"Cape Verde\", \"CV\", \"CPV\"],\r\n[40, \"Cayman Islands\", \"KY\", \"CYM\"],\r\n[41, \"Central African Republic\", \"CF\", \"CAF\"],\r\n[42, \"Chad\", \"TD\", \"TCD\"],\r\n[43, \"Chile\", \"CL\", \"CHL\"],\r\n[44, \"China\", \"CN\", \"CHN\"],\r\n[45, \"Christmas Island\", \"CX\", \"CXR\"],\r\n[46, \"Cocos (Keeling) Islands\", \"CC\", \"CCK\"],\r\n[47, \"Colombia\", \"CO\", \"COL\"],\r\n[48, \"Comoros\", \"KM\", \"COM\"],\r\n[49, \"Congo\", \"CG\", \"COG\"],\r\n[50, \"Cook Islands\", \"CK\", \"COK\"],\r\n[51, \"Costa Rica\", \"CR\", \"CRI\"],\r\n[52, \"Cote D'Ivoire\", \"CI\", \"CIV\"],\r\n[53, \"Croatia\", \"HR\", \"HRV\"],\r\n[54, \"Cuba\", \"CU\", \"CUB\"],\r\n[55, \"Cyprus\", \"CY\", \"CYP\"],\r\n[56, \"Czech Republic\", \"CZ\", \"CZE\"],\r\n[57, \"Denmark\", \"DK\", \"DNK\"],\r\n[58, \"Djibouti\", \"DJ\", \"DJI\"],\r\n[59, \"Dominica\", \"DM\", \"DMA\"],\r\n[60, \"Dominican Republic\", \"DO\", \"DOM\"],\r\n[61, \"East Timor\", \"TP\", \"TMP\"],\r\n[62, \"Ecuador\", \"EC\", \"ECU\"],\r\n[63, \"Egypt\", \"EG\", \"EGY\"],\r\n[64, \"El Salvador\", \"SV\", \"SLV\"],\r\n[65, \"Equatorial Guinea\", \"GQ\", \"GNQ\"],\r\n[66, \"Eritrea\", \"ER\", \"ERI\"],\r\n[67, \"Estonia\", \"EE\", \"EST\"],\r\n[68, \"Ethiopia\", \"ET\", \"ETH\"],\r\n[69, \"Falkland Islands (Malvinas)\", \"FK\", \"FLK\"],\r\n[70, \"Faroe Islands\", \"FO\", \"FRO\"],\r\n[71, \"Fiji\", \"FJ\", \"FJI\"],\r\n[72, \"Finland\", \"FI\", \"FIN\"],\r\n[73, \"France\", \"FR\", \"FRA\"],\r\n[74, \"France, Metropolitan\", \"FX\", \"FXX\"],\r\n[75, \"French Guiana\", \"GF\", \"GUF\"],\r\n[76, \"French Polynesia\", \"PF\", \"PYF\"],\r\n[77, \"French Southern Territories\", \"TF\", \"ATF\"],\r\n[78, \"Gabon\", \"GA\", \"GAB\"],\r\n[79, \"Gambia\", \"GM\", \"GMB\"],\r\n[80, \"Georgia\", \"GE\", \"GEO\"],\r\n[81, \"Germany\", \"DE\", \"DEU\"],\r\n[82, \"Ghana\", \"GH\", \"GHA\"],\r\n[83, \"Gibraltar\", \"GI\", \"GIB\"],\r\n[84, \"Greece\", \"GR\", \"GRC\"],\r\n[85, \"Greenland\", \"GL\", \"GRL\"],\r\n[86, \"Grenada\", \"GD\", \"GRD\"],\r\n[87, \"Guadeloupe\", \"GP\", \"GLP\"],\r\n[88, \"Guam\", \"GU\", \"GUM\"],\r\n[89, \"Guatemala\", \"GT\", \"GTM\"],\r\n[90, \"Guinea\", \"GN\", \"GIN\"],\r\n[91, \"Guinea-bissau\", \"GW\", \"GNB\"],\r\n[92, \"Guyana\", \"GY\", \"GUY\"],\r\n[93, \"Haiti\", \"HT\", \"HTI\"],\r\n[94, \"Heard and Mc Donald Islands\", \"HM\", \"HMD\"],\r\n[95, \"Honduras\", \"HN\", \"HND\"],\r\n[96, \"Hong Kong\", \"HK\", \"HKG\"],\r\n[97, \"Hungary\", \"HU\", \"HUN\"],\r\n[98, \"Iceland\", \"IS\", \"ISL\"],\r\n[99, \"India\", \"IN\", \"IND\"],\r\n[100, \"Indonesia\", \"ID\", \"IDN\"],\r\n[101, \"Iran (Islamic Republic of)\", \"IR\", \"IRN\"],\r\n[102, \"Iraq\", \"IQ\", \"IRQ\"],\r\n[103, \"Ireland\", \"IE\", \"IRL\"],\r\n[104, \"Israel\", \"IL\", \"ISR\"],\r\n[105, \"Italy\", \"IT\", \"ITA\"],\r\n[106, \"Jamaica\", \"JM\", \"JAM\"],\r\n[107, \"Japan\", \"JP\", \"JPN\"],\r\n[108, \"Jordan\", \"JO\", \"JOR\"],\r\n[109, \"Kazakhstan\", \"KZ\", \"KAZ\"],\r\n[110, \"Kenya\", \"KE\", \"KEN\"],\r\n[111, \"Kiribati\", \"KI\", \"KIR\"],\r\n[112, \"Korea, Democratic People's Republic of\", \"KP\", \"PRK\"],\r\n[113, \"Korea, Republic of\", \"KR\", \"KOR\"],\r\n[114, \"Kuwait\", \"KW\", \"KWT\"],\r\n[115, \"Kyrgyzstan\", \"KG\", \"KGZ\"],\r\n[116, \"Lao People's Democratic Republic\", \"LA\", \"LAO\"],\r\n[117, \"Latvia\", \"LV\", \"LVA\"],\r\n[118, \"Lebanon\", \"LB\", \"LBN\"],\r\n[119, \"Lesotho\", \"LS\", \"LSO\"],\r\n[120, \"Liberia\", \"LR\", \"LBR\"],\r\n[121, \"Libya\", \"LY\", \"LBY\"],\r\n[122, \"Liechtenstein\", \"LI\", \"LIE\"],\r\n[123, \"Lithuania\", \"LT\", \"LTU\"],\r\n[124, \"Luxembourg\", \"LU\", \"LUX\"],\r\n[125, \"Macau\", \"MO\", \"MAC\"],\r\n[126, \"Macedonia\", \"MK\", \"MKD\"],\r\n[127, \"Madagascar\", \"MG\", \"MDG\"],\r\n[128, \"Malawi\", \"MW\", \"MWI\"],\r\n[129, \"Malaysia\", \"MY\", \"MYS\"],\r\n[130, \"Maldives\", \"MV\", \"MDV\"],\r\n[131, \"Mali\", \"ML\", \"MLI\"],\r\n[132, \"Malta\", \"MT\", \"MLT\"],\r\n[133, \"Marshall Islands\", \"MH\", \"MHL\"],\r\n[134, \"Martinique\", \"MQ\", \"MTQ\"],\r\n[135, \"Mauritania\", \"MR\", \"MRT\"],\r\n[136, \"Mauritius\", \"MU\", \"MUS\"],\r\n[137, \"Mayotte\", \"YT\", \"MYT\"],\r\n[138, \"Mexico\", \"MX\", \"MEX\"],\r\n[139, \"Micronesia, Federated States of\", \"FM\", \"FSM\"],\r\n[140, \"Moldova, Republic of\", \"MD\", \"MDA\"],\r\n[141, \"Monaco\", \"MC\", \"MCO\"],\r\n[142, \"Mongolia\", \"MN\", \"MNG\"],\r\n[143, \"Montserrat\", \"MS\", \"MSR\"],\r\n[144, \"Morocco\", \"MA\", \"MAR\"],\r\n[145, \"Mozambique\", \"MZ\", \"MOZ\"],\r\n[146, \"Myanmar\", \"MM\", \"MMR\"],\r\n[147, \"Namibia\", \"NA\", \"NAM\"],\r\n[148, \"Nauru\", \"NR\", \"NRU\"],\r\n[149, \"Nepal\", \"NP\", \"NPL\"],\r\n[150, \"Netherlands\", \"NL\", \"NLD\"],\r\n[151, \"Netherlands Antilles\", \"AN\", \"ANT\"],\r\n[152, \"New Caledonia\", \"NC\", \"NCL\"],\r\n[153, \"New Zealand\", \"NZ\", \"NZL\"],\r\n[154, \"Nicaragua\", \"NI\", \"NIC\"],\r\n[155, \"Niger\", \"NE\", \"NER\"],\r\n[156, \"Nigeria\", \"NG\", \"NGA\"],\r\n[157, \"Niue\", \"NU\", \"NIU\"],\r\n[158, \"Norfolk Island\", \"NF\", \"NFK\"],\r\n[159, \"Northern Mariana Islands\", \"MP\", \"MNP\"],\r\n[160, \"Norway\", \"NO\", \"NOR\"],\r\n[161, \"Oman\", \"OM\", \"OMN\"],\r\n[162, \"Pakistan\", \"PK\", \"PAK\"],\r\n[163, \"Palau\", \"PW\", \"PLW\"],\r\n[164, \"Panama\", \"PA\", \"PAN\"],\r\n[165, \"Papua New Guinea\", \"PG\", \"PNG\"],\r\n[166, \"Paraguay\", \"PY\", \"PRY\"],\r\n[167, \"Peru\", \"PE\", \"PER\"],\r\n[168, \"Philippines\", \"PH\", \"PHL\"],\r\n[169, \"Pitcairn\", \"PN\", \"PCN\"],\r\n[170, \"Poland\", \"PL\", \"POL\"],\r\n[171, \"Portugal\", \"PT\", \"PRT\"],\r\n[172, \"Puerto Rico\", \"PR\", \"PRI\"],\r\n[173, \"Qatar\", \"QA\", \"QAT\"],\r\n[174, \"Reunion\", \"RE\", \"REU\"],\r\n[175, \"Romania\", \"RO\", \"ROM\"],\r\n[176, \"Russian Federation\", \"RU\", \"RUS\"],\r\n[177, \"Rwanda\", \"RW\", \"RWA\"],\r\n[178, \"Saint Kitts and Nevis\", \"KN\", \"KNA\"],\r\n[179, \"Saint Lucia\", \"LC\", \"LCA\"],\r\n[180, \"Saint Vincent and the Grenadines\", \"VC\", \"VCT\"],\r\n[181, \"Samoa\", \"WS\", \"WSM\"],\r\n[182, \"San Marino\", \"SM\", \"SMR\"],\r\n[183, \"Sao Tome and Principe\", \"ST\", \"STP\"],\r\n[184, \"Saudi Arabia\", \"SA\", \"SAU\"],\r\n[185, \"Senegal\", \"SN\", \"SEN\"],\r\n[186, \"Seychelles\", \"SC\", \"SYC\"],\r\n[187, \"Sierra Leone\", \"SL\", \"SLE\"],\r\n[188, \"Singapore\", \"SG\", \"SGP\"],\r\n[189, \"Slovakia (Slovak Republic)\", \"SK\", \"SVK\"],\r\n[190, \"Slovenia\", \"SI\", \"SVN\"],\r\n[191, \"Solomon Islands\", \"SB\", \"SLB\"],\r\n[192, \"Somalia\", \"SO\", \"SOM\"],\r\n[193, \"South Africa\", \"ZA\", \"ZAF\"],\r\n[194, \"South Georgia and the South Sandwich Islands\", \"GS\", \"SGS\"],\r\n[195, \"Spain\", \"ES\", \"ESP\"],\r\n[196, \"Sri Lanka\", \"LK\", \"LKA\"],\r\n[197, \"St. Helena\", \"SH\", \"SHN\"],\r\n[198, \"St. Pierre and Miquelon\", \"PM\", \"SPM\"],\r\n[199, \"Sudan\", \"SD\", \"SDN\"],\r\n[200, \"Suriname\", \"SR\", \"SUR\"],\r\n[201, \"Svalbard and Jan Mayen Islands\", \"SJ\", \"SJM\"],\r\n[202, \"Swaziland\", \"SZ\", \"SWZ\"],\r\n[203, \"Sweden\", \"SE\", \"SWE\"],\r\n[204, \"Switzerland\", \"CH\", \"CHE\"],\r\n[205, \"Syrian Arab Republic\", \"SY\", \"SYR\"],\r\n[206, \"Taiwan\", \"TW\", \"TWN\"],\r\n[207, \"Tajikistan\", \"TJ\", \"TJK\"],\r\n[208, \"Tanzania, United Republic of\", \"TZ\", \"TZA\"],\r\n[209, \"Thailand\", \"TH\", \"THA\"],\r\n[210, \"Togo\", \"TG\", \"TGO\"],\r\n[211, \"Tokelau\", \"TK\", \"TKL\"],\r\n[212, \"Tonga\", \"TO\", \"TON\"],\r\n[213, \"Trinidad and Tobago\", \"TT\", \"TTO\"],\r\n[214, \"Tunisia\", \"TN\", \"TUN\"],\r\n[215, \"Turkey\", \"TR\", \"TUR\"],\r\n[216, \"Turkmenistan\", \"TM\", \"TKM\"],\r\n[217, \"Turks and Caicos Islands\", \"TC\", \"TCA\"],\r\n[218, \"Tuvalu\", \"TV\", \"TUV\"],\r\n[219, \"Uganda\", \"UG\", \"UGA\"],\r\n[220, \"Ukraine\", \"UA\", \"UKR\"],\r\n[221, \"United Arab Emirates\", \"AE\", \"ARE\"],\r\n[222, \"United Kingdom\", \"GB\", \"GBR\"],\r\n[223, \"United States\", \"US\", \"USA\"],\r\n[224, \"United States Minor Outlying Islands\", \"UM\", \"UMI\"],\r\n[225, \"Uruguay\", \"UY\", \"URY\"],\r\n[226, \"Uzbekistan\", \"UZ\", \"UZB\"],\r\n[227, \"Vanuatu\", \"VU\", \"VUT\"],\r\n[228, \"Vatican City State (Holy See)\", \"VA\", \"VAT\"],\r\n[229, \"Venezuela\", \"VE\", \"VEN\"],\r\n[230, \"Viet Nam\", \"VN\", \"VNM\"],\r\n[231, \"Virgin Islands (British)\", \"VG\", \"VGB\"],\r\n[232, \"Virgin Islands (U.S.)\", \"VI\", \"VIR\"],\r\n[233, \"Wallis and Futuna Islands\", \"WF\", \"WLF\"],\r\n[234, \"Western Sahara\", \"EH\", \"ESH\"],\r\n[235, \"Yemen\", \"YE\", \"YEM\"],\r\n[236, \"Yugoslavia\", \"YU\", \"YUG\"],\r\n[237, \"Zaire\", \"ZR\", \"ZAR\"],\r\n[238, \"Zambia\", \"ZM\", \"ZMB\"],\r\n[239, \"Zimbabwe\", \"ZW\", \"ZWE\"],\r\n[240, \"Serbia\", \"RS\", \"SRB\"],\r\n[241, \"Palestine\", \"PS\", \"PST\"],\r\n[242, \"Montenegro\", \"ME\", \"MNE\"]\r\n];\r\n\r\n// e.g { gb: {CountryId: 222, Name : \"Great Britain\", Iso2: etc }} ...\r\nvar countriesDictionary = countries.map(function(c, i) {\r\n return { CountryId: c[0], Name: c[1], Iso2: c[2].toLowerCase(), Iso3: c[3].toLowerCase() }\r\n })\r\n .reduce(function(acc, country) {\r\n acc[country.Iso2] = country;\r\n return acc;\r\n }, {});\r\n\r\nexport default countriesDictionary;","import CountryMap from \"./country-list.js\";\r\n\r\nexport default function guessCountry() {\r\n var langCode = navigator.language; // could be \"fr\", \"fr-FR\", \"en\", \"en-GB\"...\r\n var usersIso2CountryCode = langCode;\r\n if (langCode.includes(\"-\")) {\r\n usersIso2CountryCode = langCode.split(\"-\")[1].toLowerCase();\r\n }\r\n\r\n var usersCountry = CountryMap[usersIso2CountryCode] || false;\r\n return usersCountry;\r\n}","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport CustomerBase from './customer-base';\r\nimport PressEnter from '../press-enter-to-continue.jsx';\r\nimport FormGroup from '../../common/form-group.jsx';\r\nimport TelephoneInput from '../../common/react-telephone-input.jsx';\r\nimport NavigationButtons from '../navigation-buttons.jsx';\r\n\r\nimport Loading from '../../common/loading.jsx';\r\nimport guessUserCountry from '../../common/guess-user-country.js';\r\nimport BasketStore from '../../../stores/BasketStore.js';\r\nimport BasketActionCreators from '../../../actions/BasketActionCreators.js';\r\n\r\nimport validateNumber from '../../../validators/Telephone.js';\r\n\r\nimport isEmail from 'validator/es/lib/isEmail';\r\nimport map from 'lodash/map';\r\nimport find from 'lodash/find';\r\nimport sortBy from 'lodash/sortBy.js';\r\n\r\nvar Customer = createReactClass({ \r\n displayName: 'Customer',\r\n mixins: [CustomerBase],\r\n\r\n getInitialState: function() {\r\n return {\r\n hasValidated: false,\r\n firstNameError: false,\r\n lastNameError: false,\r\n emailErrors: [],\r\n countryError: false,\r\n countries: BasketStore.getCountries(),\r\n isEditMode: BasketStore.numberOfItems() > 0,\r\n mobileErrors: [],\r\n TelephoneInput: React.createRef(),\r\n }\r\n },\r\n\r\n componentDidMount: function () {\r\n BasketStore.addChangeListener(this.changeBasket);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n BasketStore.removeChangeListener(this.changeBasket);\r\n },\r\n\r\n changeBasket: function () {\r\n var update = {};\r\n var newCountries = BasketStore.getCountries();\r\n if (newCountries !== this.state.countries) {\r\n update.countries = newCountries;\r\n }\r\n\r\n var newIsEditMode = BasketStore.numberOfItems() > 0;\r\n if (this.state.isEditMode !== newIsEditMode) {\r\n update.isEditMode = newIsEditMode;\r\n }\r\n\r\n this.setState(update);\r\n },\r\n\r\n render: function() {\r\n var wizard = this.props.wizard;\r\n var usersCountry = guessUserCountry();\r\n return \r\n
    \r\n \r\n

    To get started, we'll need some information
    about the person paying the fees.

    \r\n

    This person will be our main point of contact, and must be over the age of 18.

    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n \r\n {(!this.state.countries.length \r\n ? \r\n : \r\n
    \r\n \r\n
    \r\n \r\n )}\r\n
    \r\n\r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n \r\n
    ;\r\n },\r\n\r\n onSubmit: function () {\r\n var wizard = this.props.wizard;\r\n BasketActionCreators.chooseCustomer(wizard.state.Customer);\r\n if (this.state.isEditMode) {\r\n wizard.jumpToWhatNext();\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n isValid: function() {\r\n let firstNameError = !this.isNonEmptyProp(\"FirstName\");\r\n let lastNameError = !this.isNonEmptyProp(\"LastName\");\r\n let emailErrors = [];\r\n let mobileErrors = [];\r\n\r\n if (!this.isNonEmptyProp(\"Email\")) {\r\n emailErrors.push(\"Your email address is required\");\r\n }\r\n else if (!isEmail(this.props.wizard.state.Customer.Email)) {\r\n emailErrors.push(\"Please enter a valid email address\");\r\n }\r\n\r\n let countryError = !this.isNonEmptyProp(\"Country\");\r\n \r\n if (!this.isNonEmptyProp(\"Mobile\")) {\r\n mobileErrors.push(\"Please enter a contact number\");\r\n } \r\n else if (!validateNumber(this.props.wizard.state.Customer.Mobile.replace(/\\D/g, ''))) {\r\n mobileErrors.push(\"Please enter a valid contact number\");\r\n }\r\n\r\n this.setState({ \r\n firstNameError: firstNameError,\r\n lastNameError: lastNameError,\r\n emailErrors: emailErrors,\r\n countryError: countryError,\r\n mobileErrors: mobileErrors,\r\n hasValidated: true\r\n });\r\n\r\n return !firstNameError && !lastNameError && !emailErrors.length && !countryError && !mobileErrors.length;\r\n },\r\n \r\n updateCountry: function(event) {\r\n var countryId = event.target.value * 1;\r\n var country = null;\r\n if (countryId) {\r\n country = find(this.state.countries,\r\n function(country) {\r\n return country.CountryId == countryId;\r\n });\r\n }\r\n\r\n this.updateCustomerProp('Country', country);\r\n if (country && country.Iso2) {\r\n this.state.TelephoneInput.current.updateCountry(country.Iso2.toLowerCase());\r\n }\r\n },\r\n\r\n updateMobile: function (value) {\r\n this.updateCustomerProp('Mobile', value);\r\n },\r\n});\r\n\r\nexport default Customer;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport clone from 'lodash/clone';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport BasketActionCreators from '../../../actions/BasketActionCreators.js';\r\nimport BasketStore from '../../../stores/BasketStore.js';\r\n\r\nexport default {\r\n props: {\r\n wizard: PropTypes.object\r\n }, \r\n getInitialState: function() {\r\n return {\r\n firstInput: React.createRef()\r\n };\r\n },\r\n\r\n componentDidMount: function() {\r\n if (this.state.firstInput && this.state.firstInput.current) this.state.firstInput.current.focus();\r\n },\r\n\r\n updateStudent: function(event) {\r\n this.updateStudentProp(event.target.name, event.target.value);\r\n },\r\n\r\n updateStudentProp: function(prop, value, callback) {\r\n var student = clone(this.props.wizard.state.Student);\r\n student[prop] = value;\r\n this.props.wizard.set({ Student: student }, callback);\r\n if (this.state.hasValidated) {\r\n this.isValid();\r\n }\r\n\r\n // sync changes to the customer basket so that abandoned baskets and opps work as expected\r\n if (!this.props.wizard.state.IsUserCustomer\r\n && ['FirstName', 'LastName', 'Mobile', 'Email'].indexOf(prop) > -1\r\n && isEmpty(BasketStore.getCourses())) {\r\n BasketActionCreators.updateCustomer(prop, value);\r\n }\r\n },\r\n\r\n isNonEmptyProp: function(prop) {\r\n return !!this.props.wizard.state.Student[prop];\r\n }\r\n};","import sortBy from 'lodash/sortBy';\r\n\r\n// NationalityId, CountryId, Name\r\nvar nationalities = [\r\n[1, 1, \"Afghan\"],\r\n[2, 2, \"Albanian\"],\r\n[3, 3, \"Algerian\"],\r\n[4, 223, \"American\"],\r\n[5, 5, \"Andorran\"],\r\n[6, 6, \"Angolan\"],\r\n[7, 9, \"Antiguans\"],\r\n[8, 10, \"Argentinean\"],\r\n[9, 11, \"Armenian\"],\r\n[10, 13, \"Australian\"],\r\n[11, 14, \"Austrian\"],\r\n[12, 15, \"Azerbaijani\"],\r\n[13, 16, \"Bahamian\"],\r\n[14, 17, \"Bahraini\"],\r\n[15, 18, \"Bangladeshi\"],\r\n[16, 19, \"Barbadian\"],\r\n[17, 9, \"Barbudans\"],\r\n[18, 28, \"Botswana\"],\r\n[19, 20, \"Belarusian\"],\r\n[20, 21, \"Belgian\"],\r\n[21, 22, \"Belizean\"],\r\n[22, 23, \"Beninese\"],\r\n[23, 25, \"Bhutanese\"],\r\n[24, 26, \"Bolivian\"],\r\n[25, 27, \"Bosnian\"],\r\n[26, 30, \"Brazilian\"],\r\n[27, 222, \"British\"],\r\n[28, 32, \"Bruneian\"],\r\n[29, 33, \"Bulgarian\"],\r\n[30, 34, \"Burkinabe\"],\r\n[31, 146, \"Burmese\"],\r\n[32, 35, \"Burundian\"],\r\n[33, 36, \"Cambodian\"],\r\n[34, 37, \"Cameroonian\"],\r\n[35, 38, \"Canadian\"],\r\n[36, 39, \"Cape Verdean\"],\r\n[37, 41, \"Central African\"],\r\n[38, 42, \"Chadian\"],\r\n[39, 43, \"Chilean\"],\r\n[40, 44, \"Chinese\"],\r\n[41, 47, \"Colombian\"],\r\n[42, 48, \"Comoran\"],\r\n[43, 49, \"Congolese\"],\r\n[44, 51, \"Costa Rican\"],\r\n[45, 53, \"Croatian\"],\r\n[46, 54, \"Cuban\"],\r\n[47, 55, \"Cypriot\"],\r\n[48, 56, \"Czech\"],\r\n[49, 57, \"Danish\"],\r\n[50, 58, \"Djibouti\"],\r\n[51, 60, \"Dominican\"],\r\n[52, 150, \"Dutch\"],\r\n[53, 61, \"East Timorese\"],\r\n[54, 62, \"Ecuadorean\"],\r\n[55, 63, \"Egyptian\"],\r\n[56, 221, \"Emirian\"],\r\n[57, 65, \"Equatorial Guinean\"],\r\n[58, 66, \"Eritrean\"],\r\n[59, 67, \"Estonian\"],\r\n[60, 68, \"Ethiopian\"],\r\n[61, 71, \"Fijian\"],\r\n[62, 168, \"Filipino\"],\r\n[63, 72, \"Finnish\"],\r\n[64, 73, \"French\"],\r\n[65, 78, \"Gabonese\"],\r\n[66, 79, \"Gambian\"],\r\n[67, 80, \"Georgian\"],\r\n[68, 81, \"German\"],\r\n[69, 82, \"Ghanaian\"],\r\n[70, 84, \"Greek\"],\r\n[71, 86, \"Grenadian\"],\r\n[72, 89, \"Guatemalan\"],\r\n[73, 91, \"Guinea-Bissauan\"],\r\n[74, 90, \"Guinean\"],\r\n[75, 92, \"Guyanese\"],\r\n[76, 93, \"Haitian\"],\r\n[77, 27, \"Herzegovinian\"],\r\n[78, 95, \"Honduran\"],\r\n[79, 97, \"Hungarian\"],\r\n[80, 111, \"I-Kiribati\"],\r\n[81, 98, \"Icelander\"],\r\n[82, 99, \"Indian\"],\r\n[83, 100, \"Indonesian\"],\r\n[84, 101, \"Iranian\"],\r\n[85, 102, \"Iraqi\"],\r\n[86, 103, \"Irish\"],\r\n[87, 104, \"Israeli\"],\r\n[88, 105, \"Italian\"],\r\n[89, 52, \"Ivorian\"],\r\n[90, 106, \"Jamaican\"],\r\n[91, 107, \"Japanese\"],\r\n[92, 108, \"Jordanian\"],\r\n[93, 109, \"Kazakhstani\"],\r\n[94, 110, \"Kenyan\"],\r\n[95, 178, \"Kittian and Nevisian\"],\r\n[96, 114, \"Kuwaiti\"],\r\n[97, 115, \"Kyrgyz\"],\r\n[98, 116, \"Laotian\"],\r\n[99, 117, \"Latvian\"],\r\n[100, 118, \"Lebanese\"],\r\n[101, 120, \"Liberian\"],\r\n[102, 121, \"Libyan\"],\r\n[103, 122, \"Liechtensteiner\"],\r\n[104, 123, \"Lithuanian\"],\r\n[105, 124, \"Luxembourger\"],\r\n[106, 126, \"Macedonian\"],\r\n[107, 127, \"Malagasy\"],\r\n[108, 128, \"Malawian\"],\r\n[109, 129, \"Malaysian\"],\r\n[110, 130, \"Maldivan\"],\r\n[111, 131, \"Malian\"],\r\n[112, 132, \"Maltese\"],\r\n[113, 133, \"Marshallese\"],\r\n[114, 135, \"Mauritanian\"],\r\n[115, 136, \"Mauritian\"],\r\n[116, 138, \"Mexican\"],\r\n[117, 139, \"Micronesian\"],\r\n[118, 140, \"Moldovan\"],\r\n[119, 141, \"Monacan\"],\r\n[120, 142, \"Mongolian\"],\r\n[121, 144, \"Moroccan\"],\r\n[122, 119, \"Mosotho\"],\r\n[123, 28, \"Motswana\"],\r\n[124, 145, \"Mozambican\"],\r\n[125, 147, \"Namibian\"],\r\n[126, 148, \"Nauruan\"],\r\n[127, 149, \"Nepalese\"],\r\n[128, 153, \"New Zealander\"],\r\n[129, 154, \"Nicaraguan\"],\r\n[130, 156, \"Nigerian\"],\r\n[131, 155, \"Nigerien\"],\r\n[132, 112, \"North Korean\"],\r\n[133, 222, \"Northern Irish\"],\r\n[134, 160, \"Norwegian\"],\r\n[135, 161, \"Omani\"],\r\n[136, 162, \"Pakistani\"],\r\n[137, 163, \"Palauan\"],\r\n[138, 164, \"Panamanian\"],\r\n[139, 165, \"Papua New Guinean\"],\r\n[140, 166, \"Paraguayan\"],\r\n[141, 167, \"Peruvian\"],\r\n[142, 170, \"Polish\"],\r\n[143, 171, \"Portuguese\"],\r\n[144, 173, \"Qatari\"],\r\n[145, 175, \"Romanian\"],\r\n[146, 176, \"Russian\"],\r\n[147, 177, \"Rwandan\"],\r\n[148, 179, \"Saint Lucian\"],\r\n[149, 64, \"Salvadoran\"],\r\n[150, 181, \"Samoan\"],\r\n[151, 182, \"San Marinese\"],\r\n[152, 183, \"Sao Tomean\"],\r\n[153, 184, \"Saudi\"],\r\n[154, 222, \"Scottish\"],\r\n[155, 185, \"Senegalese\"],\r\n[156, 240, \"Serbian\"],\r\n[157, 186, \"Seychellois\"],\r\n[158, 187, \"Sierra Leonean\"],\r\n[159, 188, \"Singaporean\"],\r\n[160, 189, \"Slovakian\"],\r\n[161, 190, \"Slovenian\"],\r\n[162, 191, \"Solomon Islander\"],\r\n[163, 192, \"Somali\"],\r\n[164, 193, \"South African\"],\r\n[165, 113, \"South Korean\"],\r\n[166, 195, \"Spanish\"],\r\n[167, 196, \"Sri Lankan\"],\r\n[168, 199, \"Sudanese\"],\r\n[169, 200, \"Surinamer\"],\r\n[170, 202, \"Swazi\"],\r\n[171, 203, \"Swedish\"],\r\n[172, 204, \"Swiss\"],\r\n[173, 205, \"Syrian\"],\r\n[174, 206, \"Taiwanese\"],\r\n[175, 207, \"Tajik\"],\r\n[176, 208, \"Tanzanian\"],\r\n[177, 209, \"Thai\"],\r\n[178, 210, \"Togolese\"],\r\n[179, 212, \"Tongan\"],\r\n[180, 213, \"Trinidadian or Tobagonian\"],\r\n[181, 214, \"Tunisian\"],\r\n[182, 215, \"Turkish\"],\r\n[183, 218, \"Tuvaluan\"],\r\n[184, 219, \"Ugandan\"],\r\n[185, 220, \"Ukrainian\"],\r\n[186, 225, \"Uruguayan\"],\r\n[187, 226, \"Uzbekistani\"],\r\n[188, 229, \"Venezuelan\"],\r\n[189, 230, \"Vietnamese\"],\r\n[190, 222, \"Welsh\"],\r\n[191, 235, \"Yemenite\"],\r\n[192, 238, \"Zambian\"],\r\n[193, 239, \"Zimbabwean\"],\r\n[194, 96, \"Hongkonger\"],\r\n[195, 241, \"Palestinian\"],\r\n[196, 216, \"Turkmenistan\"],\r\n[197, 172, \"Puerto Rico\"],\r\n[199, 28, \"Batswana\"],\r\n[200, 242, \"Montenegrin\"],\r\n[201, 24, \"Bermudian\"],\r\n[202, 40, \"Caymanian\"],\r\n[203, 180, \"Saint Vincentian\"]\r\n];\r\n\r\n// e.g [ { Nationality: \"American\"... }]\r\nexport default sortBy(nationalities.map(function(n) {\r\n return {\r\n CountryId: n[1],\r\n NationalityId: n[0],\r\n Name: n[2]\r\n };\r\n }),\r\n function(n) {\r\n return n.Name;\r\n });","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport Store from './Store.js';\r\nimport create from 'lodash/create';\r\n\r\nvar individualCourseLookup = {};\r\nvar courses = [];\r\n\r\nfunction CourseStore() {\r\n Store.call(this);\r\n}\r\n\r\nCourseStore.prototype = create(Store.prototype, {\r\n 'constructor': CourseStore,\r\n getById: function (courseId) {\r\n return individualCourseLookup[courseId];\r\n },\r\n\r\n getCourses: function() {\r\n return courses;\r\n }\r\n});\r\n\r\nvar courseStore = new CourseStore();\r\ncourseStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.GET_COURSE:\r\n individualCourseLookup[payload.course.CourseId] = payload.course;\r\n break;\r\n\r\n case ActionTypes.GET_COURSES:\r\n courses = payload.courses;\r\n break;\r\n \r\n default:\r\n return;\r\n }\r\n\r\n courseStore.emitChange();\r\n});\r\n\r\nexport default courseStore;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport StudentBase from './student-base.js';\r\nimport PressEnter from '../press-enter-to-continue.jsx';\r\nimport FormGroup from '../../common/form-group.jsx';\r\nimport nationalities from '../../common/nationality-list.js';\r\nimport CourseStore from '../../../stores/CourseStore.js';\r\nimport BasketStore from '../../../stores/BasketStore.js';\r\nimport BasketActionCreators from '../../../actions/BasketActionCreators.js';\r\nimport NavigationButtons from '../navigation-buttons.jsx';\r\nimport Loading from '../../common/loading.jsx';\r\n\r\nimport deepLinkParse from '../deep-link-parser.js';\r\n\r\nimport moment from 'moment';\r\nimport partial from 'lodash/partial';\r\nimport extend from 'lodash/extend';\r\nimport pick from 'lodash/pick';\r\nimport mapValues from 'lodash/mapValues';\r\nimport map from 'lodash/map';\r\nimport find from 'lodash/find';\r\nimport filter from 'lodash/filter';\r\nimport any from 'lodash/some';\r\nimport sortBy from 'lodash/sortBy.js';\r\n\r\nvar Student = createReactClass({\r\n displayName: 'Student',\r\n mixins: [StudentBase],\r\n getInitialState: function () {\r\n var wizard = this.props.wizard;\r\n var isAdditionalCourse = BasketStore.numberOfItems() > 0;\r\n let init = {\r\n hasValidated: false,\r\n firstNameError: false,\r\n lastNameError: false,\r\n genderError: false,\r\n dobErrors: [],\r\n nationalityError: false,\r\n courses: CourseStore.getCourses(),\r\n isAdditionalCourse: isAdditionalCourse\r\n };\r\n\r\n var dob = this.props.wizard.state.Student.DateOfBirth;\r\n if (dob) {\r\n return extend(init, {\r\n day: dob.date(),\r\n month: dob.month(),\r\n year: dob.year()\r\n });\r\n }\r\n return init;\r\n },\r\n \r\n componentDidMount: function () {\r\n CourseStore.addChangeListener(this.updateCourses);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n CourseStore.removeChangeListener(this.updateCourses);\r\n },\r\n\r\n render: function () {\r\n var wizard = this.props.wizard;\r\n var customerCountry = wizard.state.Customer.Country;\r\n\r\n if (!this.state.courses.length) {\r\n return ;\r\n }\r\n \r\n function getClassNameForButton(isSelected) {\r\n return \"btn\" + \" \" + (isSelected ? \"btn-primary\" : \"btn-default\");\r\n }\r\n\r\n return \r\n
    \r\n

    And now, who is attending Oxford Royale?

    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
    \r\n
    \r\n\r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n {wizard.state.CurrentItemId\r\n ? \r\n \r\n \r\n \r\n \r\n \r\n : false}\r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n
    \r\n \r\n
    ;\r\n },\r\n\r\n onSubmit: function () { \r\n var wizard = this.props.wizard;\r\n if (wizard.state.CurrentItemId) {\r\n BasketActionCreators.chooseStudent(wizard.state.CurrentItemId, wizard.state.Student);\r\n wizard.jumpToWhatNext();\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n isValid: function () {\r\n let firstNameError = !this.isNonEmptyProp(\"FirstName\");\r\n let lastNameError = !this.isNonEmptyProp(\"LastName\");\r\n let genderError = !this.isNonEmptyProp(\"Gender\");\r\n let dobErrors = [];\r\n let nationalityError = !this.isNonEmptyProp(\"Nationality\");\r\n\r\n if (!this.state.day || (!this.state.month && this.state.month !== 0) || !this.state.year) {\r\n dobErrors.push(\"This field is required\");\r\n }\r\n else {\r\n var dob = parseDate(this.state);\r\n if (!isRealisticDateOfBirth(dob)) {\r\n dobErrors.push(\"Please enter a valid date\");\r\n }\r\n }\r\n\r\n this.setState({\r\n firstNameError: firstNameError,\r\n lastNameError: lastNameError,\r\n genderError: genderError,\r\n dobErrors: dobErrors,\r\n nationalityError: nationalityError,\r\n hasValidated: true\r\n });\r\n return !firstNameError && !lastNameError && !genderError && !dobErrors.length && !nationalityError;\r\n },\r\n\r\n updateStudentGender: function (val, jumpToNextQuestion) {\r\n this.updateStudentProp(\"Gender\", val);\r\n if (jumpToNextQuestion === true) {\r\n this.props.wizard.nextQuestion();\r\n }\r\n },\r\n\r\n updateStudentDob: function (e) {\r\n var update = {};\r\n update[e.target.name] = e.target.value;\r\n this.setState(update, function () {\r\n var parsedDob = parseDate(this.state);\r\n if (isRealisticDateOfBirth(parsedDob)) {\r\n this.updateStudentProp(\"DateOfBirth\", parsedDob, this.updateAvailableCourses);\r\n }\r\n });\r\n },\r\n\r\n updateCourses: function() {\r\n this.setState({\r\n courses: CourseStore.getCourses()\r\n });\r\n },\r\n\r\n updateAvailableCourses: function() {\r\n var studentDob = this.props.wizard.state.Student.DateOfBirth;\r\n let courses = this.state.courses;\r\n let coursesInAgeGroup = getCoursesForAgeGroup(courses, studentDob); \r\n var result = deepLinkParse(coursesInAgeGroup, this.props.wizard.state) || {};\r\n result.StudentTooOldOrTooYoung = !any(coursesInAgeGroup);\r\n this.props.wizard.set(result);\r\n }, \r\n\r\n updateNationality: function(event) {\r\n var val = event.target.value;\r\n var selectedNationality = null;\r\n if (val) {\r\n selectedNationality = find(nationalities,\r\n function(nationality) {\r\n return nationality.NationalityId == val;\r\n });\r\n }\r\n\r\n this.updateStudentProp('Nationality', selectedNationality);\r\n },\r\n\r\n});\r\n\r\nfunction parseDate(state) {\r\n var dateObj = mapValues(pick(state, \"year\", \"month\", \"day\"), function (str) { return parseInt(str); });\r\n return moment.utc(extend({ year: 'invalid' }, dateObj));\r\n}\r\n\r\nfunction isRealisticDateOfBirth(momentDate) {\r\n return momentDate.isValid() && 1900 < momentDate.year() && momentDate.year() < (moment.utc().year() - 5);\r\n}\r\n\r\nfunction getCoursesForAgeGroup(courses, studentDob) {\r\n return filter(courses, function (c) {\r\n return any(c.Dates, function (cd) {\r\n var studentAgeOnDate = moment.utc(cd.From).diff(studentDob, 'years');\r\n\r\n function isStudentAgeEligible(ag) {\r\n return (!ag.LowerBound || ag.LowerBound <= studentAgeOnDate) && (!ag.UpperBound || studentAgeOnDate <= ag.UpperBound);\r\n }\r\n\r\n return any(c.AgeGroups, isStudentAgeEligible);\r\n });\r\n });\r\n}\r\n\r\nexport default Student;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport PressEnterToContinue from './press-enter-to-continue.jsx';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport partial from 'lodash/partial';\r\nimport any from 'lodash/some';\r\n\r\nfunction isStudentBetween13and18(now, dateOfBirth) {\r\n // to figure out if they're the right age for online\r\n // we give them the option of being 13 or 18 over quite a long time period\r\n var start, end;\r\n if (now.month() < 8) {\r\n // this summer\r\n start = moment.max(now.clone(), now.clone().startOf('month').month(5));\r\n end = now.clone().startOf('month').month(8);\r\n } else {\r\n // next summer \r\n start = now.clone().startOf('month').add(1, 'y').month(5);\r\n end = now.clone().startOf('month').add(1, 'y').month(8);\r\n }\r\n\r\n var ageStart = start.diff(dateOfBirth, 'years');\r\n var ageEnd = end.diff(dateOfBirth, 'years');\r\n\r\n return (13 <= ageStart && ageStart <= 18) || (13 <= ageEnd && ageEnd <= 18);\r\n}\r\n\r\nvar HowToStudy = createReactClass({\r\n displayName: \"HowToStudy\",\r\n mixins: [],\r\n getInitialState: function() {\r\n return { isValid: true };\r\n },\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n handleClick: function(method) {\r\n if (method === \"ondemand\") {\r\n location.href = global.OraWidgets.Options.ondemandLearningUrl;\r\n }\r\n\r\n this.props.wizard.set({\r\n StudyMethod: method\r\n }, this.props.wizard.nextQuestion);\r\n },\r\n render: function() {\r\n var wizard = this.props.wizard;\r\n \r\n var isThisASubsequentTimeThroughTheWizard = any(BasketStore.getCourses());\r\n var showOnline = isStudentBetween13and18(moment.utc(), this.props.wizard.state.Student.DateOfBirth);\r\n var showOnDemand = false; //!isThisASubsequentTimeThroughTheWizard && isStudentBetween13And18;\r\n\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n var selectedStudyMethod = wizard.state.StudyMethod;\r\n\r\n function methodChooser(method, displayName, pictureUrl, description, isComingSoon) {\r\n function getClassNameForStudyMethod(method) {\r\n return \"h-full border border-solid cursor-pointer shadow hover:shadow-lg mb-6 p-2\" + \r\n \" \" + (selectedStudyMethod === method ? \"border-blue-300 ring-2 ring-blue-300\" : \"border-gray-300\") +\r\n \" \" + (isComingSoon ? \"hover:bg-gray-300 hover:border-0 hover:ring-0 cursor-not-allowed hover:shadow\" : \"\");\r\n }\r\n\r\n return
    \r\n \r\n {displayName}\r\n \r\n

    {description}

    \r\n
    ;\r\n }\r\n\r\n return
    \r\n

    Thank you.\r\n {is3rdPerson \r\n ? \" How would \" + wizard.state.Student.FirstName + \" like to study with Oxford Royale?\" \r\n : \" How would you like to study with Oxford Royale?\"}\r\n

    \r\n \r\n
    \r\n
    \r\n {methodChooser.call(this, \"onsite\", \"On Campus\", \"/images/on-campus.jpg\", \"Award-winning educational experiences on the campuses of the world's leading universities and schools - Oxford, Cambridge, Yale and Uppingham School.\")}\r\n
    \r\n {global.OraWidgets.Options.showOnline && showOnline ?
    \r\n {methodChooser.call(this, \"online\", \"Online\", \"/images/on-line.jpg\", \"Live tutorials and seminars with academics from the world's top universities, and alongside students from across the globe. Delivered to your home using Microsoft Teams.\")}\r\n
    : false }\r\n { showOnDemand\r\n ?
    \r\n {methodChooser.call(this, \"ondemand\", \"On Demand\", \"/images/on-demand.jpg\", \"Our suite of on-demand courses in a range of subjects. Click to go through to our ORA Prep Online Learning store.\")}\r\n
    \r\n : false\r\n }\r\n
    \r\n
    \r\n
    ;\r\n},\r\n isValid: function() {\r\n var isValid = true;\r\n if (this.props.wizard.state.StudyMethod !== \"onsite\" && this.props.wizard.state.StudyMethod !== \"online\") {\r\n isValid = false;\r\n }\r\n this.setState({\r\n isValid: isValid\r\n });\r\n return isValid\r\n }\r\n});\r\n\r\nexport default HowToStudy;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport extend from 'lodash/extend';\r\nimport create from 'lodash/create';\r\nimport Store from './Store.js';\r\n\r\nvar courseAvailability = {};\r\nvar courseSuggestions = [];\r\nvar agentAvailability = {};\r\nvar availabilitySelections = {};\r\nvar dateSelections = {};\r\nvar enquiryRequests = {};\r\nvar regionSessionGroups = {};\r\n\r\nfunction AvailabilityStore() {\r\n Store.call(this);\r\n}\r\n\r\nAvailabilityStore.prototype = create(Store.prototype, {\r\n 'constructor': AvailabilityStore,\r\n\r\n getCourseAvailability: function (courseId, agentId) {\r\n var key = courseId + '-' + agentId;\r\n if (courseAvailability.hasOwnProperty(key)) {\r\n return courseAvailability[key];\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getCourseSuggestions: function () {\r\n return courseSuggestions;\r\n },\r\n\r\n getAgentAvailability: function (courseId, agentId) {\r\n var key = courseId + '-' + agentId;\r\n if (agentAvailability.hasOwnProperty(key)) {\r\n return agentAvailability[key];\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getSelection: function(context) {\r\n var key = JSON.stringify(context);\r\n if (availabilitySelections.hasOwnProperty(key)) {\r\n return availabilitySelections[key];\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getDatesState: function(context) {\r\n var key = JSON.stringify(context);\r\n if (dateSelections.hasOwnProperty(key)) {\r\n return dateSelections[key];\r\n }\r\n\r\n return {\r\n date: '',\r\n weeks: undefined,\r\n hours: undefined\r\n };\r\n },\r\n\r\n getEnquiryRequest: function(context) {\r\n var key = JSON.stringify(context);\r\n if (enquiryRequests.hasOwnProperty(key)) {\r\n return enquiryRequests[key];\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getRegionSessionGroups: function() {\r\n return regionSessionGroups;\r\n }\r\n});\r\n\r\nvar availabilityStore = new AvailabilityStore();\r\navailabilityStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.GET_AVAILABILITY:\r\n var courseAvailabilityKey = payload.courseId + '-' + payload.agentId;\r\n courseAvailability[courseAvailabilityKey] = payload.availability;\r\n break;\r\n\r\n case ActionTypes.GET_COURSE_SUGGESTIONS:\r\n courseSuggestions = payload.suggestions;\r\n break;\r\n\r\n case ActionTypes.BEGIN_COURSE_SUGGESTIONS:\r\n courseSuggestions = [];\r\n break;\r\n\r\n case ActionTypes.GET_AGENT_AVAILABILITY:\r\n var agentAvailabilityKey = payload.courseId + '-' + payload.agentId;\r\n agentAvailability[agentAvailabilityKey] = payload.agentAvailability;\r\n break;\r\n\r\n case ActionTypes.SEARCH_SUCCESS:\r\n // TODO think about caching results from the search results in here (as they may be the same)\r\n break;\r\n\r\n case ActionTypes.SELECTION_CHOSEN:\r\n availabilitySelections[JSON.stringify(payload.context)] = {\r\n course: payload.course,\r\n intensity: payload.intensity,\r\n dates: payload.dates\r\n };\r\n break;\r\n\r\n case ActionTypes.SELECTION_CLEARED:\r\n var key = JSON.stringify(payload.context);\r\n delete availabilitySelections[key];\r\n break;\r\n\r\n case ActionTypes.DATES_UPDATED:\r\n dateSelections[JSON.stringify(payload.context)] = {\r\n date: payload.date,\r\n weeks: payload.weeks,\r\n hours: payload.hours\r\n };\r\n break;\r\n\r\n case ActionTypes.BEGIN_ENQUIRY:\r\n enquiryRequests[JSON.stringify(payload.context)] = payload;\r\n break;\r\n\r\n case ActionTypes.SEND_ENQUIRY_START:\r\n enquiryRequests[JSON.stringify(payload.context)].isInTransit = true;\r\n break;\r\n\r\n case ActionTypes.SEND_ENQUIRY_SENT:\r\n enquiryRequests[JSON.stringify(payload.context)].isSent = true;\r\n break;\r\n\r\n case ActionTypes.GET_REGION_SESSION_GROUPS:\r\n regionSessionGroups = payload.regionSessionGroups;\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n availabilityStore.emitChange(payload.context);\r\n});\r\n\r\nexport default availabilityStore;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport AvailabilityService from '../utilities/AvailabilityService.js';\r\nimport AvailabilityStore from '../stores/AvailabilityStore.js';\r\n\r\nexport default {\r\n getAvailability: function (courseId, agentId, context) {\r\n // does the store already have this availability?\r\n var cachedAvailability = AvailabilityStore.getCourseAvailability(courseId, agentId);\r\n if (cachedAvailability) {\r\n // yes, issue another dispatch so that any views get notified of the new request finishing\r\n setTimeout(function() {\r\n dispatchGetAvailability(cachedAvailability, context, agentId, courseId);\r\n }, 1);\r\n } else {\r\n // doesn't have it, go to the web api\r\n AvailabilityService.getCourseAvailability(courseId, agentId).done(function (availability) {\r\n dispatchGetAvailability(availability, context, agentId, courseId);\r\n });\r\n }\r\n },\r\n\r\n getAgentAvailability: function(courseId, agentId, context) {\r\n var cached = AvailabilityStore.getAgentAvailability(courseId, agentId);\r\n if (!cached) {\r\n AvailabilityService\r\n .getAgentAvailability(courseId, agentId)\r\n .done(function(result) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_AGENT_AVAILABILITY,\r\n agentAvailability: result,\r\n courseId: courseId,\r\n agentId: agentId,\r\n context: context\r\n });\r\n });\r\n }\r\n },\r\n\r\n getTimeZones: function(course, sessions) {\r\n AvailabilityService.getTimeZones(course, sessions).then(function(d) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_TIMEZONES,\r\n course: course,\r\n sessions: sessions,\r\n timeZones: d\r\n });\r\n });\r\n },\r\n\r\n getOptions: function (course, intensity, region, sessions, startDate) {\r\n AvailabilityService.getOptions(course, sessions, region.RegionId).then(function (d) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_OPTIONS,\r\n lineItem: d,\r\n course: course,\r\n intensity: intensity,\r\n region: region,\r\n sessions: sessions,\r\n startDate: startDate\r\n });\r\n });\r\n },\r\n\r\n makeSelection: function (course, intensity, dates, context) {\r\n Dispatcher.dispatch({ type: ActionTypes.SELECTION_CHOSEN, course: course, intensity: intensity, dates: dates, context: context });\r\n },\r\n\r\n clearSelection: function(context) {\r\n Dispatcher.dispatch({ type: ActionTypes.SELECTION_CLEARED, context: context });\r\n },\r\n\r\n updateDates: function(date, weeks, hours, context) {\r\n Dispatcher.dispatch({ type: ActionTypes.DATES_UPDATED, context: context, date: date, weeks: weeks, hours: hours });\r\n },\r\n\r\n goToEnquiry: function(course, intensity, options, context) {\r\n Dispatcher.dispatch({ type: ActionTypes.BEGIN_ENQUIRY, course: course, intensity: intensity, options: options, context: context });\r\n },\r\n\r\n sendEnquiry: function (customer, course, intensity, options, message, context) {\r\n //var selectedRegions = OptionsStore.getSelectedRegions(context);\r\n //Dispatcher.dispatch({ type: ActionTypes.SEND_ENQUIRY_START, context: context });\r\n //AvailabilityService.sendEnquiry(customer, course, intensity, options, message, selectedRegions).done(function () {\r\n // Dispatcher.dispatch({ type: ActionTypes.SEND_ENQUIRY_SENT, context: context });\r\n //});\r\n },\r\n\r\n sendNotifyRequest: function (course, intensity, options, region, emailAddress, phoneNumber, studentName, studentGender) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.BEGIN_COURSE_SUGGESTIONS\r\n });\r\n AvailabilityService.sendNotifyRequest(course, intensity, options, region, emailAddress, phoneNumber, studentName, studentGender).done(function (suggestions) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_COURSE_SUGGESTIONS,\r\n suggestions: suggestions\r\n });\r\n });\r\n },\r\n\r\n selectRegion: function (region, context) {\r\n Dispatcher.dispatch({ type: ActionTypes.SELECT_REGION, region: region, context: context });\r\n },\r\n\r\n deselectRegion: function (region, context) {\r\n Dispatcher.dispatch({ type: ActionTypes.DESELECT_REGION, region: region, context: context });\r\n }\r\n};\r\n\r\nfunction dispatchGetAvailability(availability, context, agentId, courseId) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_AVAILABILITY,\r\n availability: availability,\r\n courseId: courseId,\r\n agentId: agentId,\r\n context: context\r\n });\r\n}","import dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport create from 'lodash/create';\r\nimport map from 'lodash/map';\r\nimport Store from './Store.js';\r\n\r\nvar timeZonesLookup = {};\r\n\r\nfunction TimeZonesStore() {\r\n Store.call(this);\r\n};\r\n\r\nTimeZonesStore.prototype = create(Store.prototype, {\r\n 'constructor': TimeZonesStore,\r\n\r\n getTimeZones: function (course, sessions) {\r\n var key = this.getKey(course, sessions);\r\n if (timeZonesLookup.hasOwnProperty(key)) {\r\n return timeZonesLookup[key];\r\n }\r\n\r\n return [];\r\n },\r\n \r\n getKey: function (course, sessions) {\r\n var key = course.CourseId + '|';\r\n key += map(sessions, 'SessionId').join(',');\r\n return key;\r\n }\r\n});\r\n\r\nvar timeZonesStore = new TimeZonesStore();\r\ntimeZonesStore.dispatchToken = dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.GET_TIMEZONES:\r\n // take the list of course availabilities and map in to a sensible structure for displaying options\r\n var key = timeZonesStore.getKey(\r\n payload.course,\r\n payload.sessions);\r\n timeZonesLookup[key] = payload.timeZones;\r\n\r\n break;\r\n \r\n default:\r\n return;\r\n }\r\n\r\n timeZonesStore.emitChange();\r\n});\r\n\r\nexport default timeZonesStore;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport AvailabilityActionCreators from '../../actions/AvailabilityActionCreators.js';\r\nimport TimeZonesStore from '../../stores/TimeZonesStore.js';\r\nimport partial from 'lodash/partial';\r\nimport map from 'lodash/map';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\n\r\nfunction calcTime(currentTime, offset) {\r\n // convert to msec\r\n // add local time zone offset\r\n // get UTC time in msec\r\n var utc = currentTime.getTime() + (currentTime.getTimezoneOffset() * 60000);\r\n\r\n // create new Date object for different city\r\n // using supplied offset\r\n var nd = new Date(utc + (3600000 * offset));\r\n\r\n // return time as a string\r\n return nd.toLocaleTimeString();\r\n\r\n}\r\n\r\nvar TimeZone = createReactClass({\r\n displayName: \"TimeZone\",\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function() {\r\n var data = this.props.wizard.state;\r\n return {\r\n time: new Date(),\r\n timeZones: TimeZonesStore.getTimeZones(data.Course, data.Sessions)\r\n };\r\n },\r\n\r\n updateTime: function() {\r\n this.setState({\r\n time: new Date()\r\n });\r\n },\r\n\r\n componentDidMount: function() {\r\n var data = this.props.wizard.state;\r\n AvailabilityActionCreators.getTimeZones(data.Course, data.Sessions);\r\n TimeZonesStore.addChangeListener(this.updateTimeZones);\r\n this.setState({\r\n intervalId: global.setInterval(this.updateTime, 1000)\r\n });\r\n },\r\n\r\n componentWillUnmount: function () {\r\n TimeZonesStore.removeChangeListener(this.updateTimeZones);\r\n if (this.state.intervalId) {\r\n global.clearInterval(this.state.intervalId);\r\n }\r\n },\r\n \r\n updateTimeZones: function () {\r\n var data = this.props.wizard.state;\r\n this.setState({\r\n timeZones: TimeZonesStore.getTimeZones(data.Course, data.Sessions)\r\n });\r\n },\r\n\r\n render: function() {\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n\r\n function getClassNameForButton(isSelected) {\r\n return \"btn \" + (isSelected ? \"btn-selected\" : \"btn-default\");\r\n }\r\n\r\n var inner = this.state.timeZones.length\r\n ? \r\n { global.OraWidgets.Options.showTimesInTimezone\r\n ?

    Your local time: {this.state.time.toLocaleTimeString()}

    \r\n : false }\r\n
    \r\n {map(this.state.timeZones,\r\n function(timeZone) {\r\n return
    \r\n \r\n { global.OraWidgets.Options.showTimesInTimezone\r\n ?

    Current time: {calcTime(this.state.time, timeZone.Offset)\r\n }

    \r\n : false }\r\n
    ;\r\n }.bind(this))}\r\n
    \r\n
    \r\n :
    Finding available time zones...
    ;\r\n\r\n return
    \r\n

    Course Information

    \r\n

    {is3rdPerson ? \"In which time zone would \" + wizard.state.Student.FirstName + \" like to study?\" : \"In which time zone would you like to study?\"}

    \r\n {inner}\r\n
    \r\n
    ;\r\n },\r\n\r\n updateTimeZone: function (timeZone) {\r\n this.props.wizard.set({ TimeZone: timeZone });\r\n this.props.wizard.nextQuestion(true);\r\n },\r\n\r\n isValid: function() {\r\n if (this.props.wizard.state.TimeZone) {\r\n return true;\r\n }\r\n\r\n this.setState({ showError: true });\r\n return false;\r\n }\r\n});\r\n\r\nexport default TimeZone;","export default {\r\n Oxford: \"Oxford\",\r\n Cambridge: \"Cambridge\",\r\n \"Ascot, Berkshire\": \"St Mary's School, Ascot\",\r\n London: \"Imperial College London\",\r\n Uppingham: \"Uppingham School\",\r\n \"Yale University, USA\": \"Yale University\",\r\n \"UC Berkeley, USA\": \"UC Berkeley\",\r\n \"St Andrews, Scotland\": \"University of St Andrews\"\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport CourseStore from '../../stores/CourseStore.js';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport Loading from '../common/loading.jsx';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport RegionPrettyNameLookup from './region-pretty-name-lookup';\r\nimport any from 'lodash/some';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport flatten from 'lodash/flatten';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport sortBy from 'lodash/sortBy.js';\r\nimport partial from 'lodash/partial';\r\nimport BasketUtilities from '../../utilities/BasketUtilities.js';\r\n\r\nvar WhatRegion = createReactClass({\r\n displayName: \"WhatRegion\",\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n getInitialState: function () {\r\n var wizard = this.props.wizard;\r\n var isAdditionalCourse = any(BasketStore.getCourses(), function (course) {\r\n return BasketUtilities.studentEquals(course.Student, wizard.state.Student);\r\n });\r\n\r\n return {\r\n courses: CourseStore.getCourses(),\r\n isAdditionalCourse: isAdditionalCourse\r\n }\r\n },\r\n\r\n componentDidMount: function () {\r\n CourseStore.addChangeListener(this.updateCourses);\r\n this.skipIfPreselected();\r\n },\r\n\r\n componentWillUnmount: function () {\r\n CourseStore.removeChangeListener(this.updateCourses);\r\n },\r\n\r\n updateCourses: function () {\r\n var courses = CourseStore.getCourses();\r\n this.setState({\r\n courses: courses,\r\n }, this.skipIfPreselected)\r\n },\r\n\r\n updateRegion: function (region) {\r\n this.props.wizard.set({ Region: region }, this.props.wizard.nextQuestion);\r\n },\r\n\r\n\r\n skipIfPreselected: function () {\r\n // if a region has been preselected, then we can skip this step, \r\n // but we want to be able to visit this step later, so unset the preselection flag\r\n const wizard = this.props.wizard;\r\n const region = wizard.state.Region;\r\n if (region && region.IsPreselected) {\r\n region.IsPreselected = false;\r\n this.updateRegion(region)\r\n }\r\n },\r\n\r\n render: function () {\r\n var allCourses = this.state.courses;\r\n var loading = !any(allCourses);\r\n if (loading) return ;\r\n\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n\r\n var isAfterSeptember = moment.utc().month() >= 8;\r\n var studentAgeInSummer =\r\n isAfterSeptember\r\n ? moment([moment.utc().year() + 1, 7, 1]).diff(wizard.state.Student.DateOfBirth, 'years')\r\n : moment([moment.utc().year(), 7, 1]).diff(wizard.state.Student.DateOfBirth, 'years');\r\n\r\n var regionsForStudentAge = getRegions(allCourses, wizard.state.Student.DateOfBirth);\r\n\r\n return
    \r\n

    Great. {is3rdPerson\r\n ? \"On which campus would \" + wizard.state.Student.FirstName + \" like to study?\"\r\n : \"On which campus would you like to study?\"}\r\n

    \r\n \r\n
    \r\n {map(regionsForStudentAge, function (region) {\r\n var isSelected = wizard.state.Region && wizard.state.Region.RegionId === region.RegionId;\r\n var regionName = RegionPrettyNameLookup.hasOwnProperty(region.RegionName)\r\n ? RegionPrettyNameLookup[region.RegionName]\r\n : region.RegionName;\r\n\r\n var classNames = \"h-full border border-solid cursor-pointer shadow hover:shadow-lg mb-4 md:mb-0 lg:mb-2 p-2\" +\r\n \" \" + (isSelected ? \"border-blue-300 ring-2 ring-blue-300\" : \"border-gray-300\");\r\n\r\n return
    \r\n
    \r\n {/* {regionName} */}\r\n \r\n

    {regionName}

    \r\n
    \r\n
    ;\r\n }.bind(this))}\r\n
    \r\n
    \r\n

    If you would like to study at more than one campus, you can come back and add another after completing this booking

    \r\n
    ;\r\n },\r\n isValid: function () {\r\n var wizard = this.props.wizard;\r\n var hasError = false;\r\n\r\n if (!this.state.courses.length) {\r\n hasError = true;\r\n }\r\n else if (!wizard.state.Region) {\r\n hasError = true;\r\n\r\n } else {\r\n var allowedRegions = getRegions(this.state.courses, wizard.state.Student.DateOfBirth);\r\n\r\n // if Region Id isn't in the list\r\n if (!any(allowedRegions, function (r) { return r.RegionId === wizard.state.Region.RegionId })) {\r\n hasError = true;\r\n }\r\n }\r\n\r\n this.setState({ hasError: hasError });\r\n return !hasError;\r\n }\r\n});\r\n\r\nfunction getRegions(courses, studentDob) {\r\n var coursesInAgeGroup = filter(courses, function (c) {\r\n return any(c.Dates, function (cd) {\r\n var studentAgeOnDate = moment.utc(cd.From).diff(studentDob, 'years');\r\n\r\n function isStudentAgeEligible(ag) {\r\n return (!ag.LowerBound || ag.LowerBound <= studentAgeOnDate) && (!ag.UpperBound || studentAgeOnDate <= ag.UpperBound);\r\n }\r\n\r\n return any(c.AgeGroups, isStudentAgeEligible);\r\n });\r\n });\r\n\r\n return sortBy(regionsFromCourses(coursesInAgeGroup), function (r) { return r.RegionDisplayOrder; });\r\n\r\n\r\n function regionsFromCourses(courses) {\r\n return uniqBy(flatten(map(courses, function (c) { return c.Sites || [] })), function (r) { return r.RegionId });\r\n }\r\n}\r\n\r\nexport default WhatRegion;","import min from 'lodash/min';\r\nimport max from 'lodash/max';\r\nimport moment from 'moment';\r\nimport flatten from 'lodash/flatten';\r\nimport { DATE_FORMAT } from '../constants/Constants.js';\r\nimport map from 'lodash/map';\r\n\r\nfunction datesFromSessions(sessions) {\r\n var from = moment.utc(min(sessions, function (session) {\r\n return moment.utc(session.From).unix();\r\n }).From);\r\n var to = moment.utc(max(sessions, function (session) {\r\n return moment.utc(session.To).unix();\r\n }).To);\r\n\r\n var dates;\r\n if (from.format('YY') != to.format('YY')) {\r\n dates = from.format('Do MMM \\'YY') + ' - ' + to.format('Do MMM \\'YY');\r\n }\r\n else if (from.format('MMM') != to.format('MMM')) {\r\n dates = from.format('Do MMM') + ' - ' + to.format('Do MMM \\'YY');\r\n }\r\n else {\r\n dates = from.format('Do') + ' - ' + to.format('Do MMM \\'YY');\r\n }\r\n\r\n return dates;\r\n}\r\n\r\nfunction datesFromCourseItem(courseItem) {\r\n var description = '';\r\n if (courseItem.Course.CourseType.AvailabilityModel === 1) {\r\n description = moment.utc(courseItem.Options[0].StartDate).format(DATE_FORMAT);\r\n if (courseItem.Intensity.Weeks && courseItem.Intensity.Hours) {\r\n description += ' - ' + courseItem.Intensity.Weeks + ' week' + (courseItem.Intensity.Weeks > 1 ? 's' : '') + ', ' +\r\n courseItem.Intensity.Hours + ' hour' + (courseItem.Intensity.Hours > 1 ? 's' : '');\r\n } else if (courseItem.Intensity.Weeks) {\r\n description += ' - ' + courseItem.Intensity.Weeks + ' week' + (courseItem.Intensity.Weeks > 1 ? 's' : '');\r\n } else if (courseItem.Intensity.Hours) {\r\n description += ' - ' + courseItem.Intensity.Hours + ' hour' + (courseItem.Intensity.Hours > 1 ? 's' : '');\r\n }\r\n } else if (courseItem.Course.CourseType.AvailabilityModel === 0) {\r\n description = datesFromSessions(map(courseItem.Options, function (option) { return option.Session; }));\r\n } else {\r\n if (courseItem.Intensity.Weeks && courseItem.Intensity.Hours) {\r\n description = courseItem.intensity.Weeks + ' week' + (courseItem.Intensity.Weeks > 1 ? 's' : '') + ', ' +\r\n courseItem.Intensity.Hours + ' hour' + (courseItem.Intensity.Hours > 1 ? 's' : '');\r\n } else if (courseItem.Intensity.Weeks) {\r\n description = courseItem.Intensity.Weeks + ' week' + (courseItem.Intensity.Weeks > 1 ? 's' : '');\r\n } else if (courseItem.Intensity.Hours) {\r\n description = courseItem.Intensity.Hours + ' hour' + (courseItem.Intensity.Hours > 1 ? 's' : '');\r\n }\r\n }\r\n\r\n return description;\r\n}\r\n\r\nfunction descriptionFromCourseItem(courseItem) {\r\n var description = datesFromCourseItem(courseItem);\r\n if (courseItem.Course.HasCourseBreakdown) {\r\n if (description.length) {\r\n description += '
    ';\r\n }\r\n\r\n description += flatten(map(courseItem.Options, function (option) {\r\n return map(option.Options, function (slotOption) {\r\n return slotOption.CourseOption.Name;\r\n });\r\n })).join(', ');\r\n }\r\n\r\n return description;\r\n}\r\n\r\nfunction to2Dp(number, precision) {\r\n // first bit does rounding\r\n var multiplier = Math.pow(10, precision + 1),\r\n wholeNumber = Math.floor(number * multiplier);\r\n var num = Math.round(wholeNumber / 10) * 10 / multiplier;\r\n\r\n // this bit converts to string with guaranteed 2dp\r\n return num.toFixed(2).toString();\r\n}\r\n\r\nfunction formatWithCommas(x) {\r\n // https://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\r\n\r\n var str = x.toString();\r\n var bits = str.split('.');\r\n if (bits.length === 2) {\r\n var formatted = maybeFormat2Dp(str);\r\n var formattedBits = formatted.split('.');\r\n if (formattedBits.length === 1) {\r\n return formatted.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n return formattedBits[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\") + '.' + formattedBits[1];\r\n }\r\n\r\n return maybeFormat2Dp(x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\r\n}\r\n\r\nfunction maybeFormat2Dp(str) {\r\n var bits = str.split('.');\r\n if (bits.length === 2) {\r\n return Number(str).toFixed(2);\r\n }\r\n\r\n return str;\r\n}\r\n\r\nexport default {\r\n datesFromSessions: datesFromSessions,\r\n datesFromCourseItem: datesFromCourseItem,\r\n descriptionFromCourseItem: descriptionFromCourseItem,\r\n to2Dp: to2Dp,\r\n formatWithCommas: formatWithCommas,\r\n maybeFormat2Dp: maybeFormat2Dp\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport AdManagerService from '../../utilities/AdManagerService.js';\r\nimport Loading from '../common/loading.jsx';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport AvailabilityStore from '../../stores/AvailabilityStore.js';\r\nimport AvailabilityActionCreators from '../../actions/AvailabilityActionCreators.js';\r\nimport CourseStore from '../../stores/CourseStore.js';\r\n\r\nimport first from 'lodash/find';\r\nimport last from 'lodash/findLast';\r\nimport sortBy from 'lodash/sortBy';\r\nimport groupBy from 'lodash/groupBy';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport any from 'lodash/some';\r\nimport all from 'lodash/every';\r\nimport size from 'lodash/size';\r\nimport partial from 'lodash/partial';\r\nimport distinct from 'lodash/uniq';\r\nimport omit from 'lodash/omit';\r\nimport Ui from '../../utilities/Ui.js';\r\nimport uniqBy from 'lodash/uniqBy.js';\r\n\r\n\r\nvar WhatSession = createReactClass({\r\n displayName: \"WhatSession\",\r\n props: {\r\n wizard: PropTypes.object,\r\n course: PropTypes.object\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n availability: AvailabilityStore.getCourseAvailability(this.props.course.CourseId, null),\r\n courses: CourseStore.getCourses(),\r\n isValid: true,\r\n sentWaitlistDates: []\r\n };\r\n },\r\n\r\n componentDidMount: function () {\r\n AvailabilityActionCreators.getAvailability(this.props.course.CourseId, null, null);\r\n AvailabilityStore.addChangeListener(this.updateAvailability);\r\n CourseStore.addChangeListener(this.updateCourses);\r\n AdManagerService.sessionOptionsTag(\r\n this.props.course.CourseId,\r\n this.props.course.Name,\r\n this.props.course.CourseType.Name,\r\n this.props.wizard.state.Region ? this.props.wizard.state.Region.RegionName : null);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n AvailabilityStore.removeChangeListener(this.updateAvailability);\r\n CourseStore.removeChangeListener(this.updateCourses);\r\n },\r\n\r\n updateAvailability: function () {\r\n var availability = AvailabilityStore.getCourseAvailability(this.props.course.CourseId, null);\r\n var selectedIntensity = this.props.wizard.state.Intensity;\r\n var intensityId =\r\n selectedIntensity && selectedIntensity.IntensityId\r\n ? selectedIntensity.IntensityId\r\n : availability.length\r\n ? first(sortBy(distinct(map(availability, function (a) { return a.Intensity }),\r\n function (i) { return i.IntensityId; }),\r\n function (i) { return i.NumberOfSessions })).IntensityId\r\n : null;\r\n this.setState({ availability: availability, intensityId: intensityId });\r\n },\r\n\r\n updateCourses: function () {\r\n this.setState({ courses: CourseStore.getCourses() });\r\n },\r\n\r\n render: function () {\r\n var wizard = this.props.wizard;\r\n var student = wizard.state.Student;\r\n var course = this.props.course;\r\n var imageStyleSrc = { backgroundImage: \"url('\" + course.ImageUrl + \"')\" };\r\n \r\n var isLoading = !this.state.availability.length || !this.state.courses.length;\r\n if (isLoading) {\r\n return
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {this.props.course.Name}\r\n

    \r\n\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n var hasIntensities = course.Intensities.length > 1;\r\n var intensitiesWithAnySessions = filter(course.Intensities, function (i) {\r\n // include only intensities that have a non-zero amount of sessions (in the same region)\r\n return any(this.state.availability, function (a) {\r\n var isSelectedRegion = !wizard.state.Region || a.Region.RegionId === wizard.state.Region.RegionId;\r\n var isSameIntensity = a.Intensity.IntensityId == i.IntensityId;\r\n return isSameIntensity && isSelectedRegion;\r\n });\r\n }.bind(this));\r\n \r\n var region = wizard.state.Region;\r\n var sessionsByPrice = uniqBy(filter(this.state.availability, s => s.Region.RegionId === region.RegionId), a => a.Price);\r\n var hasJustOnePrice = sessionsByPrice.length === 1;\r\n var intensitySessions = map(intensitiesWithAnySessions, function(intensity) {\r\n var sessions = filterAvailabilities.call(this, intensity);\r\n var seasonSessions = groupBy(sessions, function (session) {\r\n return session.Season.SeasonId;\r\n });\r\n\r\n return {intensity: intensity, seasonSessions: seasonSessions};\r\n }.bind(this));\r\n\r\n\r\n var allUnavailable = all(intensitySessions, function(pair) {\r\n return all(pair.seasonSessions, function(availabilities) {\r\n return all(availabilities, function(availability) {\r\n var dates = getStartAndEndDates(availability.Sessions);\r\n var start = dates.start;\r\n var studentAgeOnSession = start.diff(student.DateOfBirth, 'years');\r\n var isStudentAgeOutOfRange = studentAgeOnSession < availability.MinAge || availability.MaxAge < studentAgeOnSession;\r\n return isStudentAgeOutOfRange;\r\n });\r\n });\r\n });\r\n\r\n if (allUnavailable) { // no sessions can be picked because ages out of range, therefore, this course shouldn't be on the list\r\n return false;\r\n }\r\n \r\n return
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {this.props.course.Name}\r\n\r\n \r\n {hasJustOnePrice\r\n ? \r\n \r\n £{Ui.formatWithCommas(sessionsByPrice[0].Price)}\r\n \r\n : false}\r\n \r\n

    \r\n\r\n {map(intensitySessions, function (pair) {\r\n var intensity = pair.intensity;\r\n var seasonSessions = pair.seasonSessions;\r\n\r\n return
    \r\n {hasIntensities\r\n ?

    {intensity.Name}

    \r\n : false}\r\n\r\n {map(seasonSessions, function (sessions, seasonId) {\r\n return
    \r\n
      \r\n {size(seasonSessions) > 1 ?

      {sessions[0].Season.Name}

      : false}\r\n {map(\r\n sortBy(\r\n sessions,\r\n function (availability) {\r\n var dates = getStartAndEndDates(availability.Sessions);\r\n return dates.start.unix();\r\n }),\r\n function (availability) {\r\n var dates = getStartAndEndDates(availability.Sessions);\r\n var start = dates.start;\r\n var end = dates.end;\r\n\r\n var placesForStudent = availability[student.Gender];\r\n var sessionIds = map(availability.Sessions, function (s) { return s.SessionId }).join(\"-\");\r\n var isSelected = wizard.state.Course && wizard.state.Course.CourseId === this.props.course.CourseId\r\n && wizard.state.SessionIds && wizard.state.SessionIds.join(\"-\") === sessionIds;\r\n\r\n var studentAgeOnSession = start.diff(student.DateOfBirth, 'years');\r\n var isStudentAgeOutOfRange = studentAgeOnSession < availability.MinAge || availability.MaxAge < studentAgeOnSession;\r\n\r\n var bookButtonClass = \"my-1 btn btn-sm \" + (isSelected ? \"btn-primary \" : \"btn-default \") + (isStudentAgeOutOfRange ? 'hint--left' : '');\r\n\r\n var hasWaitlistBeenJoined = !!this.state.sentWaitlistDates && any(this.state.sentWaitlistDates, function (datePair) {\r\n return datePair.start._i === start._i && datePair.end._i === end._i;\r\n });\r\n var key = this.props.course.CourseId + \":\" + sessionIds;\r\n\r\n return
    1. \r\n
      \r\n {placesForStudent === 0\r\n ? \r\n : }\r\n\r\n
      \r\n\r\n
      \r\n

      \r\n {start.format(\"ddd Do MMMM\")} - {end.format(\"ddd Do MMMM\")}\r\n

      \r\n\r\n

      \r\n {placesForStudent <= 5\r\n ? placesForStudent <= 0 && !isStudentAgeOutOfRange\r\n ? (hasWaitlistBeenJoined\r\n ? Waiting list joined\r\n : Join waiting list)\r\n : Last few spaces\r\n : Good availability}\r\n

      \r\n
      \r\n\r\n\r\n\r\n {!hasJustOnePrice\r\n ? \r\n \r\n £{Ui.formatWithCommas(availability.Price)}\r\n \r\n : false}\r\n
    2. \r\n }.bind(this))\r\n }\r\n
    \r\n
    \r\n }.bind(this))\r\n }\r\n
    \r\n }.bind(this))}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n },\r\n\r\n selectSession: function (availability, intensity) {\r\n var sessions = availability.Sessions;\r\n this.props.wizard.set({\r\n SessionIds: map(sessions, function (s) { return s.SessionId }),\r\n SessionDates: map(getStartAndEndDates(sessions), function (d) { return d }),\r\n Sessions: sessions,\r\n Intensity: availability.Intensity,\r\n Course: this.props.course,\r\n SessionPricing: omit(availability, [\"Seasons\", \"Sessions\", \"Region\", \"Intensity\", \"Male\", \"Female\", \"Total\"]),\r\n }, this.props.wizard.nextQuestion);\r\n AdManagerService.bookTag(\r\n this.props.course.CourseId,\r\n this.props.course.Name,\r\n this.props.course.CourseType.Name,\r\n this.props.wizard.state.Region ? this.props.wizard.state.Region.RegionName : null,\r\n availability.Intensity.Name,\r\n availability.Price,\r\n map(sessions, function (s) { return s.Name; }).join(','));\r\n },\r\n\r\n joinWaitlist: function (availability) {\r\n var wizard = this.props.wizard;\r\n var student = wizard.state.Student;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n var course = this.props.course;\r\n\r\n var options = map(availability.Sessions, function (s) {\r\n return {\r\n Session: s\r\n };\r\n });\r\n\r\n AvailabilityActionCreators.sendNotifyRequest(course,\r\n availability.Intensity,\r\n options,\r\n availability.Region,\r\n is3rdPerson ? wizard.state.Customer.Email : student.Email,\r\n student.Mobile,\r\n student.FirstName + ' ' + student.LastName,\r\n student.Gender);\r\n this.setState({ isSent: true, errorMessage: '' });\r\n\r\n var currentNotifyDates = this.state.sentWaitlistDates;\r\n currentNotifyDates.push(getStartAndEndDates(availability.Sessions));\r\n this.setState({ sentWaitlistDates: currentNotifyDates });\r\n },\r\n\r\n updateIntensity: function (intensity) {\r\n this.setState({\r\n intensityId: intensity.IntensityId\r\n });\r\n },\r\n\r\n isValid: function () {\r\n var isValid = true;\r\n var availabilities = filterAvailabilities.call(this);\r\n var wizard = this.props.wizard;\r\n if (!wizard.state.SessionIds || !wizard.state.SessionIds.length || !any(availabilities, function (a) {\r\n return all(a.Sessions, function (s, i) { return s.SessionId === wizard.state.SessionIds[i] });\r\n })) {\r\n isValid = false;\r\n }\r\n\r\n this.setState({\r\n isValid: isValid\r\n });\r\n return isValid;\r\n }\r\n});\r\n\r\nfunction getStartAndEndDates(sessions) {\r\n\r\n var dateOrderedSessions = sortBy(sessions, function (s) { return s.StartDate }); // lexical sorting is FINE because it's ISO format :)\r\n return { start: moment.utc(first(dateOrderedSessions).From), end: moment.utc(last(dateOrderedSessions).To) };\r\n}\r\n\r\nfunction filterAvailabilities(intensity) {\r\n var sessions = this.state.availability;\r\n if (intensity) {\r\n sessions = filter(sessions, function (s) { return s.Intensity.IntensityId === intensity.IntensityId }.bind(this));\r\n }\r\n if (this.props.wizard.state.Region) {\r\n sessions = filter(sessions, function (s) { return s.Region.RegionId === this.props.wizard.state.Region.RegionId }.bind(this));\r\n }\r\n return sessions;\r\n}\r\n\r\nexport default WhatSession;\r\n","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\n\r\nimport CourseStore from '../../stores/CourseStore.js';\r\nimport Loading from '../common/loading.jsx';\r\nimport RegionPrettyNameLookup from './region-pretty-name-lookup';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport PressEnter from './press-enter-to-continue.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\n\r\nimport CourseSessionPicker from './course-session-picker.jsx';\r\n\r\nimport any from 'lodash/some';\r\nimport map from 'lodash/map';\r\nimport sortBy from 'lodash/sortBy';\r\nimport filter from 'lodash/filter';\r\nimport find from 'lodash/find';\r\nimport flatten from 'lodash/flatten';\r\nimport partial from 'lodash/partial';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport some from 'lodash/some';\r\nimport groupBy from 'lodash/groupBy';\r\nimport size from 'lodash/size';\r\n\r\nvar WhatCourse = createReactClass({\r\n displayName: \"WhatCourse\",\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n courses: CourseStore.getCourses()\r\n };\r\n },\r\n\r\n componentDidMount: function () {\r\n CourseStore.addChangeListener(this.change);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n CourseStore.removeChangeListener(this.change);\r\n },\r\n\r\n change: function () {\r\n var courses = CourseStore.getCourses();\r\n this.setState({\r\n courses: courses,\r\n });\r\n },\r\n\r\n\r\n updateRegion: function (region) {\r\n this.props.wizard.set({ Region: region });\r\n },\r\n\r\n resetCourse: function() {\r\n this.props.wizard.set({Course: null});\r\n },\r\n\r\n render: function () {\r\n var isLoading = !this.state.courses.length;\r\n if (isLoading) {\r\n return ;\r\n }\r\n\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n var student = wizard.state.Student;\r\n\r\n var allCourses = this.state.courses;\r\n var region = false;\r\n var excludeCoursesByStudyMethodAndAgeRange = function (c) {\r\n // does the selected study method match the course type?\r\n return c.CourseType.StudyMethod === (wizard.state.StudyMethod === \"onsite\" ? 0 : 1)\r\n // are there any sessions for this course where the student will be within the age bound?\r\n && any(c.Dates, function (s) {\r\n var studentAge = moment.utc(s.From).diff(student.DateOfBirth, 'years');\r\n return any(c.AgeGroups, function (ag) {\r\n return (!ag.LowerBound || ag.LowerBound <= studentAge)\r\n && (!ag.UpperBound || studentAge <= ag.UpperBound);\r\n });\r\n });\r\n }\r\n var courses = filter(allCourses, excludeCoursesByStudyMethodAndAgeRange);\r\n if (wizard.state.Region) {\r\n region = this.props.wizard.state.Region;\r\n\r\n var isSelectedRegion = function (s) { return s.RegionId === wizard.state.Region.RegionId };\r\n courses = filter(courses, function (c) { return any(c.Sites, isSelectedRegion) });\r\n }\r\n\r\n var regionsForStudentAge = getRegions(allCourses, wizard.state.Student.DateOfBirth);\r\n\r\n courses = sortBy(courses,\r\n (course) => wizard.state.Course && wizard.state.Course.CourseId === course.CourseId ? 0 : 1,\r\n (course) => !course.HasCourseBreakdown,\r\n (course) => course.Name);\r\n\r\n // maybe we have preselected an incompatible course, if so, don't be preselected!\r\n var isPreselected = wizard.state.Course && wizard.state.Course.IsPreselected && some(courses, c => c.CourseId === wizard.state.Course.CourseId);\r\n if (isPreselected) {\r\n courses = filter(courses, c => c.CourseId === wizard.state.Course.CourseId);\r\n }\r\n\r\n return \r\n
    \r\n

    \r\n {isPreselected\r\n ? \"Which session would \" + student.FirstName + \" like to attend?\"\r\n : \"Which Programme would \" + student.FirstName + \" like to study?\"\r\n }\r\n

    \r\n\r\n {isPreselected // don't show mini region select if preselected\r\n ? false\r\n :\r\n
    \r\n {map(regionsForStudentAge, function (region) {\r\n var isSelected = wizard.state.Region && wizard.state.Region.RegionId === region.RegionId;\r\n var containerClassNames = \"border border-brand-primary rounded-md text-brand-primary cursor-pointer shadow hover:shadow-lg hover:bg-brand-primary hover:text-white focus:outline-2 focus:outline-blue-500\"\r\n + (isSelected ? \" text-white bg-brand-primary\" : \"\");\r\n var regionName = GetRegionName(region);\r\n var id = \"region-\" + region.RegionId;\r\n\r\n return
    \r\n
    \r\n \r\n {regionName}\r\n
    \r\n
    \r\n }.bind(this))}\r\n
    \r\n }\r\n\r\n \r\n {(region\r\n ? renderCourses.call(this)\r\n : false\r\n )}\r\n \r\n\r\n {isPreselected\r\n ?

    \r\n If you would like {student.FirstName} to study a different programme, please click here to see all our programmes in {GetRegionName(wizard.state.Region)}. Or, to see all our programmes:\r\n

    \r\n : false}\r\n \r\n \r\n\r\n
    \r\n
    \r\n\r\n function renderCourses() {\r\n return
      \r\n {map(courses, function (c) {\r\n return
    • \r\n \r\n
    • \r\n }.bind(this))}\r\n
    \r\n }\r\n\r\n function countCourseOptions(course) {\r\n return size(groupBy(flatten(map(course.Slots, \"Options\")), \"CourseOptionId\"));\r\n }\r\n },\r\n\r\n isValid: function () {\r\n var hasError = false;\r\n if (!this.state.courses.length || !this.props.wizard.state.Course) {\r\n hasError = true;\r\n } else {\r\n var course = find(this.state.courses, function (c) { return c.CourseId === this.props.wizard.state.Course.CourseId }.bind(this));\r\n if (!course) {\r\n hasError = true;\r\n } else if (this.props.wizard.state.Region) {\r\n if (!any(course.Sites, function (s) { return s.RegionId === this.props.wizard.state.Region.RegionId }.bind(this))) {\r\n hasError = true;\r\n }\r\n }\r\n }\r\n\r\n this.setState({\r\n hasError: hasError\r\n });\r\n\r\n return !hasError;\r\n }\r\n});\r\n\r\nfunction GetRegionName(region) {\r\n return RegionPrettyNameLookup.hasOwnProperty(region.RegionName)\r\n ? RegionPrettyNameLookup[region.RegionName]\r\n : region.RegionName;\r\n}\r\n\r\nfunction isFlagshipCourse(c) {\r\n return c.Name === \"Broadening Horizons\" ||\r\n c.Name === \"New Perspectives\" ||\r\n c.Name === \"Ivy League Experience\";\r\n}\r\n\r\nfunction getRegions(courses, studentDob) {\r\n var coursesInAgeGroup = filter(courses, function (c) {\r\n return any(c.Dates, function (cd) {\r\n var studentAgeOnDate = moment.utc(cd.From).diff(studentDob, 'years');\r\n\r\n function isStudentAgeEligible(ag) {\r\n return (!ag.LowerBound || ag.LowerBound <= studentAgeOnDate) && (!ag.UpperBound || studentAgeOnDate <= ag.UpperBound);\r\n }\r\n\r\n return any(c.AgeGroups, isStudentAgeEligible);\r\n });\r\n });\r\n\r\n return sortBy(regionsFromCourses(coursesInAgeGroup), function (r) { return r.RegionDisplayOrder; });\r\n\r\n\r\n function regionsFromCourses(courses) {\r\n return uniqBy(flatten(map(courses, function (c) { return c.Sites || [] })), function (r) { return r.RegionId });\r\n }\r\n}\r\n\r\nexport default WhatCourse;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport groupBy from 'lodash/groupBy';\r\nimport sortBy from 'lodash/sortBy';\r\nimport create from 'lodash/create';\r\nimport map from 'lodash/map';\r\nimport Store from './Store.js';\r\n\r\nvar optionsLookup = {};\r\nvar optionsAvailabilitiesLookup = {};\r\n\r\nfunction OptionsStore() {\r\n Store.call(this);\r\n}\r\n\r\nOptionsStore.prototype = create(Store.prototype, {\r\n 'constructor': OptionsStore,\r\n\r\n getOptions: function (course, intensity, region, sessions, startDate) {\r\n var key = this.getKey(course, intensity, region, sessions, startDate);\r\n if (optionsLookup.hasOwnProperty(key)) {\r\n return optionsLookup[key];\r\n }\r\n\r\n return [];\r\n },\r\n\r\n getAvailabilities: function(course, intensity, region, sessions, startDate) {\r\n var key = this.getKey(course, intensity, region, sessions, startDate);\r\n if (optionsAvailabilitiesLookup.hasOwnProperty(key)) {\r\n return optionsAvailabilitiesLookup[key];\r\n }\r\n\r\n return [];\r\n },\r\n\r\n getKey: function (course, intensity, region, sessions, startDate) {\r\n var key = course.CourseId + '|' + intensity.IntensityId + '|' + region.RegionId + '|';\r\n if (startDate) {\r\n key += startDate;\r\n } else {\r\n key += map(sessions, 'SessionId').join(',');\r\n }\r\n\r\n return key;\r\n }\r\n});\r\n\r\nvar optionsStore = new OptionsStore();\r\noptionsStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.GET_OPTIONS:\r\n // take the list of course availabilities and map in to a sensible structure for displaying options\r\n var key = optionsStore.getKey(\r\n payload.course,\r\n payload.intensity,\r\n payload.region,\r\n payload.sessions,\r\n payload.startDate);\r\n if (payload.course.HasCourseBreakdown) {\r\n optionsLookup[key] = mapOptions(payload);\r\n }\r\n\r\n optionsAvailabilitiesLookup[key] = payload.lineItem.Availabilities;\r\n\r\n break;\r\n\r\n case ActionTypes.GET_LINEITEM_OPTIONS_SUCCESS:\r\n optionsLookup[optionsStore.getKey(\r\n payload.lineItem.Course,\r\n payload.lineItem.Intensity,\r\n payload.lineItem.Region,\r\n payload.lineItem.Sessions)] =\r\n mapOptions(payload);\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n optionsStore.emitChange();\r\n});\r\n\r\nfunction mapOptions(payload) {\r\n // takes a list of OptionAvailalibity and maps to [{ Session: xxx, Slots: [{ CourseScheduleSlot: yyy, Options: [{ CourseOption: zzz, CourseAvailabilities: [CourseAvailabilities]}]}]}]\r\n return map(\r\n groupBy(\r\n payload.lineItem.Availabilities, \r\n function (option) {\r\n return option.Session.SessionId;\r\n }),\r\n function (options) {\r\n return {\r\n Session: options[0].Session,\r\n Slots: map(\r\n groupBy(\r\n options,\r\n function (options) {\r\n return options.CourseScheduleSlot.CourseScheduleSlotId;\r\n }),\r\n function (options) {\r\n return {\r\n CourseScheduleSlot: options[0].CourseScheduleSlot,\r\n Options: map(\r\n groupBy(\r\n options,\r\n function (option) {\r\n return option.CourseOption.CourseOptionId;\r\n }),\r\n function (options) {\r\n return {\r\n CourseOption: options[0].CourseOption,\r\n CourseAvailabilies: options\r\n };\r\n })\r\n };\r\n })\r\n };\r\n }\r\n );\r\n}\r\n\r\nfunction oldMapOptions(payload) {\r\n // takes a list of courseavailability and maps to [{ Session: xxx, Slots: [{ CourseScheduleSlot: yyy, Options: [{ CourseOption: zzz, CourseAvailabilities: [CourseAvailabilities]}]}]}]\r\n var courseAvailabilities = payload.options;\r\n return map(\r\n groupBy(\r\n courseAvailabilities,\r\n function (courseAvailabilty) {\r\n return courseAvailabilty.Session ? courseAvailabilty.Session.SessionId : courseAvailabilty.StartDate;\r\n }\r\n ),\r\n function (courseAvailabilities) {\r\n return {\r\n Session: courseAvailabilities[0].Session,\r\n StartDate: courseAvailabilities[0].StartDate,\r\n Slots: sortBy(\r\n map(\r\n groupBy(\r\n courseAvailabilities,\r\n function (courseAvailability) {\r\n return courseAvailability.CourseScheduleSlot.CourseScheduleSlotId;\r\n }),\r\n function (courseAvailabilities) {\r\n return {\r\n CourseScheduleSlot: courseAvailabilities[0].CourseScheduleSlot,\r\n Options: sortBy(\r\n map(\r\n groupBy(\r\n courseAvailabilities,\r\n function (courseAvailability) {\r\n return courseAvailability.CourseOption.CourseOptionId;\r\n }),\r\n function (courseAvailabilities) {\r\n return {\r\n CourseOption: courseAvailabilities[0].CourseOption,\r\n CourseAvailabilities: courseAvailabilities\r\n };\r\n }\r\n ),\r\n function (option) { return option.CourseOption.Name; })\r\n };\r\n }\r\n ),\r\n function (slot) {\r\n return slot.CourseScheduleSlot.DisplayOrder;\r\n })\r\n };\r\n });\r\n}\r\n\r\n//function getCourse(key) {\r\n// for (var i = 0; i < optionsLookup[key].length; i++) {\r\n// if (optionsLookup[key][i].Course) {\r\n// return optionsLookup[key][i].Course;\r\n// }\r\n// }\r\n\r\n// alert('There was an unknown error. Please contact customer support at admin@oxford-royale.co.uk');\r\n//}\r\n\r\n//function getSelectedRegions(key) {\r\n// if (selectedRegionsLookup.hasOwnProperty(key)) {\r\n// return selectedRegionsLookup[key];\r\n// }\r\n\r\n// return [];\r\n//}\r\n\r\n//function mapChoicesToOptions(key) {\r\n// var selectedRegions = getSelectedRegions(key);\r\n// var options = filter(optionsLookup[key], function (option) {\r\n// return any(selectedRegions, function (selectedRegion) {\r\n// return option.Site && option.Site.Region && option.Site.Region.RegionId == selectedRegion.RegionId;\r\n// });\r\n// });\r\n\r\n// var choices = choicesLookup.hasOwnProperty(key) ? choicesLookup[key] : [];\r\n// var course = getCourse(key);\r\n// var intersectedSiteIds = [];\r\n// var isSessionBased = options[0].CourseType.AvailabilityModel === 0;\r\n// var isDatesBased = options[0].CourseType.AvailabilityModel === 1;\r\n\r\n// if (isDatesBased) {\r\n// intersectedSiteIds = intersection.apply(global, map(choices, function (choice) {\r\n// return map(choice.courseAvailabilities, function(courseAvailability) {\r\n// return courseAvailability.Site.SiteId;\r\n// });\r\n// }));\r\n// } else if (isSessionBased) {\r\n// var sessionIds = uniq(map(options, function(option) {\r\n// return option.Session.SessionId;\r\n// }));\r\n\r\n// intersectedSiteIds = zipObject(map(sessionIds, function(sessionId) { return 'SessionId' + sessionId; }), map(sessionIds, function(sessionId) {\r\n// return intersection.apply(global, map(filter(choices, function(choice) {\r\n// return choice.session.SessionId == sessionId;\r\n// }), function(choice) {\r\n// return map(filter(choice.courseAvailabilities, function(courseAvailability) {\r\n// return courseAvailability.Male > 0 || courseAvailability.Female > 0;\r\n// }), \r\n// function(courseAvailability) {\r\n// return courseAvailability.Site.SiteId;\r\n// });\r\n// }));\r\n// }));\r\n// }\r\n\r\n// for (var i = 0; i < options.length; i++) {\r\n// var courseAvailabilityOption = options[i];\r\n// var isInChoices = inChoices(choices, courseAvailabilityOption);\r\n// courseAvailabilityOption.Selected = isInChoices;\r\n// courseAvailabilityOption.Disabled = !isInChoices\r\n// && ((courseAvailabilityOption.Male === 0 && courseAvailabilityOption.Female === 0)\r\n// || choiceMadeInSlot(choices, courseAvailabilityOption)\r\n// || (!course.AreOptionsBookablePerSlot && optionAlreadySelected(choices, courseAvailabilityOption))\r\n// || ((isDatesBased && choices.length && nonApplicableSite(courseAvailabilityOption, intersectedSiteIds))\r\n// || (isSessionBased && intersectedSiteIds['SessionId' + courseAvailabilityOption.Session.SessionId].length && nonApplicableSite(courseAvailabilityOption, intersectedSiteIds))));\r\n// }\r\n\r\n// return options;\r\n//}\r\n\r\n//function inChoices(choices, courseAvailabilityOption) {\r\n// for (var i = 0; i < choices.length; i++) {\r\n// if (choices[i].courseAvailabilities[0].CourseOption.CourseOptionId == courseAvailabilityOption.CourseOption.CourseOptionId\r\n// && choices[i].courseScheduleSlot.CourseScheduleSlotId == courseAvailabilityOption.CourseScheduleSlot.CourseScheduleSlotId\r\n// && (!choices[i].session || choices[i].session.SessionId == courseAvailabilityOption.Session.SessionId)) {\r\n// return true;\r\n// }\r\n// }\r\n\r\n// return false;\r\n//}\r\n\r\n//function choiceMadeInSlot(choices, courseAvailabilityOption) {\r\n// for (var i = 0; i < choices.length; i++) {\r\n// if (choices[i].courseScheduleSlot.CourseScheduleSlotId == courseAvailabilityOption.CourseScheduleSlot.CourseScheduleSlotId\r\n// && (!choices[i].session || choices[i].session.SessionId == courseAvailabilityOption.Session.SessionId)) {\r\n// return true;\r\n// }\r\n// }\r\n\r\n// return false;\r\n//}\r\n\r\n//function optionAlreadySelected(choices, courseAvailabilityOption) {\r\n// for (var i = 0; i < choices.length; i++) {\r\n// if (choices[i].courseAvailabilities[0].CourseOption.CourseOptionId == courseAvailabilityOption.CourseOption.CourseOptionId) {\r\n// return true;\r\n// }\r\n// }\r\n\r\n// return false;\r\n//}\r\n\r\n//function allOptionsSelectedForContext(key) {\r\n// var options = mapChoicesToOptions(key);\r\n// var choices = choicesLookup.hasOwnProperty(key) ? choicesLookup[key] : [];\r\n\r\n// // we need to group by options by session and slot and then see if we have a choice in each section\r\n// return all(options, function(option) {\r\n// var courseScheduleSlotId = option.CourseScheduleSlot.CourseScheduleSlotId;\r\n// return some(choices, function(choice) {\r\n// return (!option.Session || choice.session.SessionId == option.Session.SessionId)\r\n// && choice.courseScheduleSlot.CourseScheduleSlotId == courseScheduleSlotId;\r\n// });\r\n// });\r\n//}\r\n\r\n//function nonApplicableSite(courseAvailabilityOption, intersectedSiteIds) {\r\n// if (courseAvailabilityOption.Session) {\r\n// return indexOf(intersectedSiteIds['SessionId' + courseAvailabilityOption.Session.SessionId], courseAvailabilityOption.Site.SiteId) === -1;\r\n// }\r\n\r\n// return indexOf(intersectedSiteIds, courseAvailabilityOption.Site.SiteId) === -1;\r\n//}\r\n\r\nexport default optionsStore;","/*\r\n * React FitText v0.0.3\r\n * https://github.com/gianu/react-fittext\r\n *\r\n * A port of the jQuery plugin: http://github.com/davatron5000/FitText.js\r\n *\r\n * Released under the MIT license\r\n * http://gianu.mit-license.org\r\n */\r\n\r\n// MJ I've grabbed this as we're on older react\r\n'use strict';\r\n\r\nimport ReactDOM from 'react-dom';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nvar ReactPropTypes = PropTypes;\r\n\r\nexport default createReactClass({\r\n displayName: 'ReactFitText',\r\n\r\n propTypes: {\r\n children: ReactPropTypes.element.isRequired,\r\n compressor: ReactPropTypes.number,\r\n minFontSize: ReactPropTypes.number,\r\n maxFontSize: ReactPropTypes.number\r\n },\r\n\r\n getDefaultProps: function () {\r\n return {\r\n compressor: 1.0,\r\n minFontSize: Number.NEGATIVE_INFINITY,\r\n maxFontSize: Number.POSITIVE_INFINITY\r\n };\r\n },\r\n\r\n componentDidMount: function () {\r\n window.addEventListener(\"resize\", this._onBodyResize);\r\n this._onBodyResize();\r\n },\r\n\r\n componentWillUnmount: function () {\r\n window.removeEventListener(\"resize\", this._onBodyResize);\r\n },\r\n\r\n _onBodyResize: function () {\r\n var element = ReactDOM.findDOMNode(this);\r\n var width = element.offsetWidth;\r\n element.style.fontSize = Math.max(\r\n Math.min((width / (this.props.compressor * 10)),\r\n parseFloat(this.props.maxFontSize)),\r\n parseFloat(this.props.minFontSize)) + 'px';\r\n },\r\n\r\n render: function () {\r\n return this.props.children;\r\n }\r\n});\r\n","export default function permute(permutation) {\r\n var length = permutation.length,\r\n result = [permutation.slice()],\r\n c = new Array(length).fill(0),\r\n i = 1, k, p;\r\n\r\n while (i < length) {\r\n if (c[i] < i) {\r\n k = i % 2 && c[i];\r\n p = permutation[i];\r\n permutation[i] = permutation[k];\r\n permutation[k] = p;\r\n ++c[i];\r\n i = 1;\r\n result.push(permutation.slice());\r\n } else {\r\n c[i] = 0;\r\n ++i;\r\n }\r\n }\r\n return result;\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport ReactFitText from '../common/react-fit-text.jsx';\r\nimport UI from '../../utilities/Ui.js';\r\nimport intersection from 'lodash/intersection';\r\nimport map from 'lodash/map';\r\nimport mapValues from 'lodash/mapValues';\r\nimport uniq from 'lodash/uniq';\r\nimport some from 'lodash/some';\r\nimport every from 'lodash/every';\r\nimport filter from 'lodash/filter';\r\nimport find from 'lodash/find';\r\nimport groupBy from 'lodash/groupBy';\r\nimport sortBy from 'lodash/sortBy';\r\nimport clone from 'lodash/clone';\r\nimport reduce from 'lodash/reduce';\r\nimport partial from 'lodash/partial';\r\nimport assign from 'lodash/assign';\r\nimport flatten from 'lodash/flatten';\r\nimport size from 'lodash/size';\r\nimport moment from 'moment';\r\nimport classNames from 'classnames';\r\nimport permute from '../../utilities/permute.js';\r\n\r\nvar OptionsPicker = createReactClass({\r\n propTypes: {\r\n agentAvailability: PropTypes.array,\r\n course: PropTypes.object.isRequired,\r\n intensity: PropTypes.object.isRequired,\r\n options: PropTypes.array,\r\n startDate: PropTypes.instanceOf(moment),\r\n availabilities: PropTypes.array.isRequired,\r\n defaultSelectedOptions: PropTypes.array, // allows you to specify an option to auto select, might (/does) not include the course availabilities for that selection\r\n onValid: PropTypes.func, // triggered when all options have been made (and the form can be submitted)\r\n onInvalid: PropTypes.func // triggered whenever an option is deselected and the picker is in a valid state\r\n },\r\n\r\n getInitialState: function () {\r\n // { CourseScheduleSlotGroupId: [Option, ... ]} \r\n var availabilityGroupedInToCourseScheduleSlotGroups = groupBy(\r\n this.props.availabilities,\r\n function (option) {\r\n if (option.CourseScheduleSlot.CourseScheduleSlotGroup) {\r\n return option.CourseScheduleSlot.CourseScheduleSlotGroup.CourseScheduleSlotGroupId;\r\n }\r\n\r\n return -1;\r\n });\r\n\r\n // { CourseScheduleSlotGroupId: [{ CourseScheduleSlotGroup: {}, Session: {}, CourseScheduleSlot: {} }]}\r\n var courseScheduleSlotGroups = mapValues(\r\n availabilityGroupedInToCourseScheduleSlotGroups,\r\n function (optionsArray, courseScheduleSlotGroupId) {\r\n var indicator = optionsArray[0];\r\n return uniq(\r\n map(\r\n optionsArray,\r\n function (option) {\r\n return {\r\n CourseScheduleSlotGroup: indicator.CourseScheduleSlot.CourseScheduleSlotGroup,\r\n Session: option.Session,\r\n CourseScheduleSlot: option.CourseScheduleSlot\r\n };\r\n }),\r\n function (mappedOption) {\r\n var sessionId = mappedOption.Session.SessionId;\r\n var slotId = mappedOption.CourseScheduleSlot.CourseScheduleSlotId;\r\n return sessionId + '|' + slotId;\r\n });\r\n });\r\n\r\n var selectedOptions = mapValues(\r\n availabilityGroupedInToCourseScheduleSlotGroups,\r\n function(options, courseScheduleSlotGroupId) {\r\n return map(\r\n filter(\r\n this.props.defaultSelectedOptions,\r\n function(selectedOption) {\r\n return courseScheduleSlotGroupId == -1 &&\r\n !selectedOption.CourseScheduleSlot.CourseScheduleSlotGroup ||\r\n (selectedOption.CourseScheduleSlot.CourseScheduleSlotGroup &&\r\n selectedOption.CourseScheduleSlot.CourseScheduleSlotGroup.CourseScheduleSlotGroupId ==\r\n courseScheduleSlotGroupId);\r\n }),\r\n function(selectedOption) {\r\n return selectedOption.CourseOption;\r\n });\r\n }.bind(this));\r\n\r\n return {\r\n availabilityInCourseScheduleSlotGroups: availabilityGroupedInToCourseScheduleSlotGroups,\r\n courseScheduleSlotGroups: courseScheduleSlotGroups,\r\n selectedOptions: selectedOptions\r\n };\r\n },\r\n\r\n // returns { permutation: [Slot/Session, ...], solution: [AvailabilityItem, ...] }\r\n getSolution: function (courseScheduleSlotGroups, selectedOptions, candidateCourseOption) {\r\n var solutions = this.innerGetSolutions(courseScheduleSlotGroups, selectedOptions, candidateCourseOption, true);\r\n if (!solutions.length) {\r\n return null;\r\n }\r\n\r\n return solutions[0];\r\n },\r\n\r\n // returns [{ permutation: [Slot/Session, ...], solution: [AvailabilityItem, ...] }]\r\n getSolutions: function(courseScheduleSlotGroups, selectedOptions) {\r\n return this.innerGetSolutions(courseScheduleSlotGroups, selectedOptions);\r\n },\r\n\r\n // returns [{ permutation: [Slot/Session, ...], solution: [AvailabilityItem, ...] }]\r\n innerGetSolutions: function (courseScheduleSlotGroups, selectedOptions, candidateCourseOption, returnFirst) {\r\n // let's flatten out our selectedOptions (which is {group1: [CourseOption, ...]}) \r\n var flattenedSelectedOptions = flatten(map(selectedOptions,\r\n function(groupCourseOptions) {\r\n return groupCourseOptions;\r\n }));\r\n\r\n // there's a shortcut here ... if the options can only be picked once across the booking then we can bail out if the candidate is a dupe\r\n if (!this.props.course.AreOptionsBookablePerSlot && candidateCourseOption) {\r\n if (some(flattenedSelectedOptions,\r\n function(courseOption) {\r\n return courseOption.CourseOptionId == candidateCourseOption.CourseOptionId;\r\n })) {\r\n return [];\r\n }\r\n }\r\n\r\n if (candidateCourseOption) {\r\n flattenedSelectedOptions.push(candidateCourseOption);\r\n }\r\n\r\n // this functions tries to find a solution to the selections that have been made\r\n // i.e. it is possible to solve which options go in which slots in multiple different ways\r\n // but we must have at least one way to do\r\n // this also lets us figure out which options we still have left to choose\r\n // What we do is this:\r\n // Get all the session/slot combinations\r\n // Generate the permutations of all those combinations\r\n // Then work our way through each selected course option and generate the different possible assignments for that option\r\n var slotSessionCombos = flatten(map(courseScheduleSlotGroups, function (courseScheduleSlotGroup) { return courseScheduleSlotGroup; })); // all the session/slot pairs\r\n var permutedSlotSessionCombos = permute(slotSessionCombos); // all the session/slot pairs in all the permutations\r\n var solutions = [];\r\n for (var permIdx = 0; permIdx < permutedSlotSessionCombos.length; permIdx++) {\r\n var permutation = permutedSlotSessionCombos[permIdx]; // [{Session1, Slot1}, {Session2: Slot2} ...]\r\n var permutationSolutionsArray = []; // we build this up as we go (array of arrays i.e. each possible solution for this permutation is an entry in the array)\r\n\r\n for (var selIdx = 0; selIdx < flattenedSelectedOptions.length; selIdx++) {\r\n var courseOption = flattenedSelectedOptions[selIdx];\r\n var slotSession = permutation[selIdx];\r\n\r\n // we need to find the availability items that would allow us to satisfy the selected options\r\n // availabilities must have Total > 0\r\n // availabilities must match site with existing sessions\r\n if (selIdx === 0) {\r\n // we don't need to consider our previous selections\r\n var matchingAvailability = getAvailabilityForCourseOptionAndSessionSlot(\r\n this.props.availabilities,\r\n courseOption,\r\n slotSession.Session,\r\n slotSession.CourseScheduleSlot);\r\n if (!matchingAvailability.length) {\r\n break;;\r\n }\r\n\r\n if (flattenedSelectedOptions.length === 1) {\r\n if (returnFirst) {\r\n return [{ permutation: permutation, solution: [matchingAvailability[0]] }];\r\n }\r\n\r\n solutions.push.apply(solutions,\r\n map(matchingAvailability, function(availability) {\r\n return {\r\n permutation: permutation,\r\n solution: [availability]\r\n };\r\n })\r\n );\r\n\r\n break; // goes round to next permutation\r\n }\r\n\r\n permutationSolutionsArray = map(matchingAvailability,\r\n function(availabilityItem) {\r\n return [availabilityItem];\r\n });\r\n } else {\r\n // we need to loop through the current solutions and make sure we have another solution\r\n var nextPermutationSolutionsArray = [];\r\n for (var solIdx = 0; solIdx < permutationSolutionsArray.length; solIdx++) {\r\n var currentPossibleSolution = permutationSolutionsArray[solIdx];\r\n var previousSessionSelection = find(currentPossibleSolution,\r\n function(availabilityItem) {\r\n return availabilityItem.Session.SessionId === slotSession.Session.SessionId;\r\n }); // this will be null if we've not been constrained to a particular site for this session yet\r\n var matchingAvailability = getAvailabilityForCourseOptionAndSessionSlot(\r\n this.props.availabilities,\r\n courseOption,\r\n slotSession.Session,\r\n slotSession.CourseScheduleSlot,\r\n previousSessionSelection ? previousSessionSelection.Site : null);\r\n if (!matchingAvailability.length) {\r\n continue;\r\n }\r\n\r\n if (selIdx === flattenedSelectedOptions.length - 1) {\r\n // we're at the end of our selections and we have a solution!\r\n if (returnFirst) {\r\n return [{\r\n permutation: permutation,\r\n solution: currentPossibleSolution.concat(matchingAvailability[0])\r\n }];\r\n }\r\n\r\n solutions.push.apply(solutions,\r\n map(matchingAvailability, function (availability) {\r\n return {\r\n permutation: permutation,\r\n solution: currentPossibleSolution.concat(availability)\r\n };\r\n })\r\n );\r\n\r\n break;\r\n }\r\n\r\n for (var mIdx = 0; mIdx < matchingAvailability.length; mIdx++) {\r\n nextPermutationSolutionsArray.push(\r\n currentPossibleSolution.concat(matchingAvailability[mIdx]));\r\n }\r\n }\r\n\r\n if (!nextPermutationSolutionsArray.length) {\r\n break;\r\n }\r\n\r\n permutationSolutionsArray = nextPermutationSolutionsArray;\r\n }\r\n }\r\n }\r\n\r\n return solutions;\r\n\r\n function getAvailabilityForCourseOptionAndSessionSlot(availabilities, courseOption, session, courseScheduleSlot, site) {\r\n // returns those options that match the option, slot and session\r\n return filter(\r\n availabilities,\r\n function (availabilityItem) {\r\n return availabilityItem.CourseScheduleSlot.CourseScheduleSlotId === courseScheduleSlot.CourseScheduleSlotId\r\n && availabilityItem.Session.SessionId === session.SessionId\r\n && availabilityItem.CourseOption.CourseOptionId === courseOption.CourseOptionId\r\n && (!site || availabilityItem.Site.SiteId === site.SiteId)\r\n && availabilityItem.Total > 0\r\n && !availabilityItem.IsClosed;\r\n });\r\n } \r\n },\r\n\r\n // indicates if all slots have an option selected\r\n isValid: function (selectedOptions) {\r\n selectedOptions = selectedOptions || this.state.selectedOptions;\r\n return every(selectedOptions,\r\n function(groupSelections, key) {\r\n return groupSelections.length === this.state.courseScheduleSlotGroups[key].length;\r\n }.bind(this));\r\n },\r\n \r\n isDisabledForAgent: function (session, courseOption, courseScheduleSlot) {\r\n // TODO come back to this\r\n if (!this.props.agentAvailability || this.props.agentAvailability.length === 0) {\r\n return false;\r\n }\r\n\r\n var match = find(this.props.agentAvailability,\r\n function (availability) {\r\n return availability.SessionId === session.SessionId &&\r\n availability.CourseOptionId === courseOption.CourseOptionId &&\r\n availability.CourseScheduleSlotId === courseScheduleSlot.CourseScheduleSlotId;\r\n });\r\n\r\n return match == undefined ? true : match.Allocated >= match.Capacity;\r\n },\r\n\r\n chooseOption: function (courseScheduleSlotGroupId, // may be -1 if no slot group\r\n idx, // the index in to the list of choices that has been selected\r\n event // the course option that has been chosen\r\n ) {\r\n var courseOptionId = event.target.value;\r\n var courseOption = find(this.props.availabilities,\r\n function(option) { return option.CourseOption.CourseOptionId == courseOptionId; }).CourseOption;\r\n var selectedOptions = this.state.selectedOptions;\r\n selectedOptions[courseScheduleSlotGroupId].push(courseOption);\r\n this.setState({\r\n selectedOptions: selectedOptions\r\n });\r\n\r\n if (this.isValid()) {\r\n // take the first solution and provide those options as the selection\r\n this.props.onValid(map(this.getSolutions(this.state.courseScheduleSlotGroups, selectedOptions), function (solution) {\r\n return solution.solution;\r\n }));\r\n }\r\n },\r\n\r\n clearOption: function (courseScheduleSlotGroupId, idx) {\r\n var wasValid = this.isValid();\r\n var selectedOptions = this.state.selectedOptions;\r\n var groupSelectedOptions = selectedOptions[courseScheduleSlotGroupId];\r\n var oIdx = groupSelectedOptions.length - 1;\r\n while (oIdx >= idx) {\r\n groupSelectedOptions.pop();\r\n oIdx--;\r\n }\r\n\r\n this.setState({\r\n selectedOptions: selectedOptions\r\n });\r\n\r\n if (wasValid) {\r\n this.props.onInvalid();\r\n }\r\n },\r\n\r\n getSelectedOption: function(courseScheduleSlotGroup, idx) {\r\n var optionsArray = this.state.selectedOptions[courseScheduleSlotGroup];\r\n if (optionsArray.length <= idx) {\r\n return false;\r\n }\r\n\r\n return optionsArray[idx];\r\n },\r\n\r\n renderChoice: function(title, choiceElement) {\r\n return (\r\n
    \r\n \r\n
    \r\n {choiceElement}\r\n
    \r\n
    );\r\n },\r\n \r\n render: function () {\r\n var userAgent = navigator.userAgent;\r\n var removeDisabledOptions = some(['iPhone', 'iPad'], function (word) { return userAgent.indexOf(word) >= 0; });\r\n\r\n return
    \r\n {size(Object.values(this.state.courseScheduleSlotGroups)[0]) > 1\r\n ?

    Please note that the selection you make in one list may determine the availability in another list.

    \r\n : false}\r\n {map(this.state.courseScheduleSlotGroups, function (options, courseScheduleSlotGroupId) {\r\n var indicatorGroup = options[0].CourseScheduleSlotGroup;\r\n var name = indicatorGroup ? indicatorGroup.Name : false;\r\n\r\n var choiceElements = [];\r\n for (var i = 0; i < options.length; i++) {\r\n // we show selections where they've been made\r\n // we show a select box for the next choice they need to make\r\n // we show help text where they've not chosen a predecessor\r\n var selectedOptionForIdx = this.getSelectedOption(courseScheduleSlotGroupId, i);\r\n var optionTitle = (!!name\r\n ? name + ' '\r\n : 'Subject ') + (i + 1);\r\n\r\n if (selectedOptionForIdx) { // choice already made, just show it\r\n choiceElements.push(this.renderChoice(\r\n {optionTitle},\r\n \r\n \r\n {selectedOptionForIdx.Name}\r\n ));\r\n } else {\r\n if (i === 0 || this.getSelectedOption(courseScheduleSlotGroupId, i - 1)) { // it's the first slot in the group or it's the next slot after the last selected\r\n // show a selected box\r\n var groupAvailability = this.state.availabilityInCourseScheduleSlotGroups[courseScheduleSlotGroupId];\r\n var courseOptionAvailability = groupBy(\r\n groupAvailability,\r\n function(option) {\r\n return option.CourseOption.CourseOptionId;\r\n }); // { courseOptionId: [Availability, ...] }\r\n courseOptionAvailability = map(\r\n courseOptionAvailability,\r\n function (availability, courseOptionId) { //[Availability, ...]\r\n var courseOption = availability[0].CourseOption;\r\n return {\r\n CourseOption: courseOption,\r\n IsDisabled: this.getSolution(this.state.courseScheduleSlotGroups, this.state.selectedOptions, courseOption) === null,\r\n Options: availability\r\n };\r\n }.bind(this));\r\n\r\n if (removeDisabledOptions) {\r\n courseOptionAvailability = filter(courseOptionAvailability,\r\n function (courseOptionOption) {\r\n return !courseOptionOption.IsDisabled;\r\n });\r\n }\r\n\r\n choiceElements.push(this.renderChoice(\r\n {optionTitle},\r\n ));\r\n } else {\r\n // show a hint\r\n choiceElements.push(this.renderChoice(\r\n {optionTitle},\r\n ));\r\n }\r\n }\r\n }\r\n\r\n return
    {choiceElements}
    ;\r\n }.bind(this))}\r\n
    ;\r\n }\r\n});\r\n\r\nexport default OptionsPicker;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport AvailabilityStore from '../../stores/AvailabilityStore.js';\r\nimport AvailabilityActionCreators from '../../actions/AvailabilityActionCreators.js';\r\nimport OptionsStore from '../../stores/OptionsStore.js';\r\nimport OptionsPicker from '../optionspicker/options-picker.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport Loading from '../common/loading.jsx';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport PressEnter from './press-enter-to-continue.jsx';\r\nimport clone from 'lodash/clone';\r\nimport first from 'lodash/first';\r\nimport isArray from 'lodash/isarray';\r\n\r\nvar WhatSessionOptions = createReactClass({\r\n displayName: \"WhatSessionOptions\",\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function() {\r\n var data = this.props.wizard.state;\r\n return {\r\n isValid: true,\r\n options: OptionsStore.getOptions(data.Course, data.Intensity, data.Region, data.Sessions),\r\n optionsAvailabilities: OptionsStore.getAvailabilities(data.Course, data.Intensity, data.Region, data.Sessions)\r\n };\r\n },\r\n\r\n componentDidMount: function() {\r\n var data = this.props.wizard.state;\r\n AvailabilityActionCreators.getOptions(data.Course, data.Intensity, data.Region, data.Sessions);\r\n OptionsStore.addChangeListener(this.updateOptions);\r\n },\r\n\r\n componentWillUnmount: function() {\r\n OptionsStore.removeChangeListener(this.updateOptions);\r\n },\r\n\r\n updateOptions: function() {\r\n var data = this.props.wizard.state;\r\n this.setState({\r\n options: OptionsStore.getOptions(data.Course, data.Intensity, data.Region, data.Sessions),\r\n optionsAvailabilities: OptionsStore.getAvailabilities(data.Course, data.Intensity, data.Region, data.Sessions)\r\n });\r\n },\r\n\r\n render: function() {\r\n var isLoading = !this.state.options.length;\r\n if (isLoading) { return ; }\r\n\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n var region = clone(wizard.state.Region);\r\n region.Name = null;\r\n region.SiteId = null;\r\n\r\n return
    \r\n

    Great - just a couple more questions.

    \r\n \r\n \r\n \r\n \r\n\r\n \r\n
    \r\n
    ; \r\n },\r\n\r\n updateCourseOptions: function(results) {\r\n // if there is only one option to choose from, the options picker returns the solution [ { solution }]\r\n // usually it returns an array of arrays of solutions\r\n // and elsewhere, we assume the solutions are of the form [ [ {solution A}, ... ], [ {Solution B}, ... ]]\r\n if (!isArray(first(results))) {\r\n results = [results];\r\n }\r\n\r\n this.props.wizard.set({\r\n CourseOptionSolutions: results\r\n });\r\n },\r\n\r\n updateCourseOnInvalid: function() {\r\n this.props.wizard.set({\r\n CourseOptionSolutions: []\r\n });\r\n },\r\n\r\n isValid: function() {\r\n var isValid = true;\r\n if (!this.props.wizard.state.CourseOptionSolutions || !this.props.wizard.state.CourseOptionSolutions.length) { \r\n isValid = false;\r\n }\r\n\r\n this.setState({\r\n isValid: isValid\r\n });\r\n return isValid;\r\n }\r\n});\r\n\r\nexport default WhatSessionOptions;","import isArray from 'lodash/isarray';\r\nimport uri from 'urijs';\r\n\r\nvar search = global.location.search;\r\nvar params = {};\r\nif (search) {\r\n search = search.substring(1);\r\n var parts = search.split('&');\r\n for (var i = 0; i < parts.length; i++) {\r\n var bits = parts[i].split('=');\r\n var key = bits[0].toLowerCase();\r\n var value = bits.length > 1 ? tryParseValue(bits[1]) : true;\r\n if (params.hasOwnProperty(key)) {\r\n if (isArray(params[key])) {\r\n params[key].push(value);\r\n } else {\r\n var newValue = [params[key]];\r\n newValue.push(value);\r\n params[key] = newValue;\r\n }\r\n } else {\r\n params[key] = value;\r\n }\r\n }\r\n}\r\n\r\nfunction tryParseValue(value) {\r\n if (value) {\r\n switch (value.toLowerCase()) {\r\n case 'true':\r\n case 'on':\r\n case 'yes':\r\n value = true;\r\n break;\r\n\r\n case 'false':\r\n case 'off':\r\n case 'no':\r\n value = false;\r\n break;\r\n\r\n default:\r\n value = uri.decodeQuery(value);\r\n break;\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport default params;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport create from 'lodash/create';\r\nimport indexOf from 'lodash/indexOf';\r\nimport isArray from 'lodash/isarray';\r\nimport Store from './Store.js';\r\nimport uri from 'urijs';\r\nimport query from '../utilities/QueryStringParser.js';\r\n\r\nvar multipleFilters = ['selectedRegionIds', 'selectedCourseTypeIds'];\r\nvar state = {};\r\nvar courseTypes = [];\r\nvar sites = [];\r\n\r\n// handle initial load and setting filters from the url\r\nmaybeAddFilterFromUrl('subject');\r\nmaybeAddFilterFromUrl('regionid', 'selectedRegionIds', true);\r\nmaybeAddFilterFromUrl('age', 'selectedAge');\r\nmaybeAddFilterFromUrl('coursetypeid', 'selectedCourseTypeIds', true);\r\nmaybeAddFilterFromUrl('month', 'selectedMonth');\r\n\r\nfunction maybeAddFilterFromUrl(queryName, stateKey, isNumeric) {\r\n stateKey = stateKey || queryName;\r\n if (query.hasOwnProperty(queryName)) {\r\n var value = query[queryName];\r\n if (indexOf(multipleFilters, stateKey) > -1) {\r\n if (isArray(value)) {\r\n if (isNumeric) {\r\n for (var i = 0; i < value.length; i++) {\r\n value[i] = value[i] * 1.0;\r\n }\r\n }\r\n\r\n state[stateKey] = value;\r\n } else {\r\n if (isNumeric) {\r\n value = value * 1.0;\r\n }\r\n\r\n state[stateKey] = [value];\r\n }\r\n } else {\r\n if (isNumeric) {\r\n value = value * 1.0;\r\n }\r\n\r\n state[stateKey] = value;\r\n }\r\n }\r\n}\r\n\r\nfunction syncUrl() {\r\n var lookup = {\r\n selectedRegionIds: 'regionid',\r\n selectedAge: 'age',\r\n selectedCourseTypeIds: 'coursetypeid',\r\n selectedMonth: 'month',\r\n subject: 'subject'\r\n };\r\n if (window.history) {\r\n var newUrl = uri(location);\r\n for (var key in lookup) {\r\n if (lookup.hasOwnProperty(key)) {\r\n newUrl.removeSearch(lookup[key]);\r\n }\r\n }\r\n\r\n for (var key in state) {\r\n if (state.hasOwnProperty(key)) {\r\n var queryName = lookup[key];\r\n var value = state[key];\r\n if (isArray(value)) {\r\n for (var i = 0; i < value.length; i++) {\r\n newUrl.addSearch(queryName, value[i]);\r\n }\r\n } else {\r\n newUrl.addSearch(queryName, value);\r\n }\r\n }\r\n }\r\n\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n}\r\n\r\nfunction FiltersStore() {\r\n Store.call(this);\r\n}\r\n\r\nFiltersStore.prototype = create(Store.prototype, {\r\n 'constructor': FiltersStore,\r\n\r\n get: function (key) {\r\n if (state.hasOwnProperty(key)) {\r\n return state[key];\r\n }\r\n\r\n return indexOf(multipleFilters, key) > -1 ? [] : null;\r\n },\r\n\r\n getCourseTypes: function () {\r\n return courseTypes;\r\n },\r\n\r\n getSites: function() {\r\n return sites;\r\n }\r\n});\r\n\r\nvar filtersStore = new FiltersStore();\r\nfiltersStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.UPDATE_FILTER:\r\n state[payload.key] = payload.value;\r\n break;\r\n\r\n case ActionTypes.CLEAR_FILTERS:\r\n state = {};\r\n break;\r\n\r\n case ActionTypes.GET_ALL_COURSE_TYPES:\r\n courseTypes = payload.courseTypes;\r\n break;\r\n\r\n case ActionTypes.GET_ALL_SITES:\r\n sites = payload.sites;\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n syncUrl();\r\n filtersStore.emitChange();\r\n});\r\n\r\nexport default filtersStore;","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n getAll: function() {\r\n return http.get(options.apiEndpoint() + '/Site?take=999');\r\n }\r\n};","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport SiteService from '../utilities/SiteService.js';\r\n\r\nexport default {\r\n getAll: function() {\r\n SiteService.getAll().done(function (sites) {\r\n Dispatcher.dispatch({ type: ActionTypes.GET_ALL_SITES, sites: sites.Items });\r\n });\r\n }\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport Linkify from 'react-linkify';\r\nimport Loading from '../common/loading.jsx';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport PressEnter from './press-enter-to-continue.jsx';\r\nimport FiltersStore from '../../stores/FiltersStore.js';\r\nimport OptionsStore from '../../stores/OptionsStore.js';\r\nimport SiteActionCreators from '../../actions/SiteActionCreators.js';\r\nimport AvailabilityActionCreators from '../../actions/AvailabilityActionCreators.js';\r\nimport groupBy from 'lodash/groupBy';\r\nimport map from 'lodash/map';\r\nimport find from 'lodash/find';\r\nimport first from 'lodash/first';\r\nimport forOwn from 'lodash/forOwn';\r\nimport reduce from 'lodash/reduce';\r\nimport flatten from 'lodash/flatten';\r\nimport distinct from 'lodash/uniq';\r\nimport partial from 'lodash/partial';\r\nimport clone from 'lodash/clone';\r\nimport any from 'lodash/some';\r\nimport size from 'lodash/size';\r\nimport omit from 'lodash/omit';\r\nimport mapValues from 'lodash/mapValues';\r\nimport filter from 'lodash/filter';\r\nimport reject from 'lodash/reject';\r\n\r\nvar WhatSite = createReactClass({\r\n displayName: \"WhatSite\",\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function () {\r\n var state = {\r\n isValid: true,\r\n sites: FiltersStore.getSites(),\r\n forbiddenSitesBySession: {}\r\n };\r\n\r\n var wizardState = this.props.wizard.state;\r\n if (!wizardState.Course.hasCourseBreakdown) {\r\n state.availabilities = OptionsStore.getAvailabilities(wizardState.Course, wizardState.Intensity, wizardState.Region, wizardState.Sessions);\r\n }\r\n\r\n return state;\r\n },\r\n\r\n componentDidMount: function () {\r\n var wizardState = this.props.wizard.state;\r\n if (!wizardState.Course.hasCourseBreakdown) {\r\n AvailabilityActionCreators.getOptions(wizardState.Course, wizardState.Intensity, wizardState.Region, wizardState.Sessions);\r\n OptionsStore.addChangeListener(this.updateAvailability);\r\n }\r\n\r\n SiteActionCreators.getAll();\r\n FiltersStore.addChangeListener(this.updateSites);\r\n },\r\n\r\n componentWillUnmount: function() {\r\n FiltersStore.removeChangeListener(this.updateSites);\r\n OptionsStore.removeChangeListener(this.updateAvailability);\r\n },\r\n\r\n updateAvailability: function () {\r\n var wizardState = this.props.wizard.state;\r\n this.setState({\r\n availabilities: OptionsStore.getAvailabilities(wizardState.Course,\r\n wizardState.Intensity,\r\n wizardState.Region,\r\n wizardState.Sessions)\r\n });\r\n },\r\n \r\n updateSites: function() {\r\n var sites = FiltersStore.getSites();\r\n this.setState({\r\n sites: sites\r\n });\r\n },\r\n\r\n skipIfOnlyOneOption: function() {\r\n if (!this.state.sites || !this.state.availabilities.length) return;\r\n\r\n if (this.props.wizard.state.SessionPricing.IsNonResidentialAvailable) return; \r\n\r\n var sessionSitePairs = getPossibleSitesBySession(this.props.wizard.state, this.state.availabilities);\r\n if (Object.keys(sessionSitePairs).length === 1) {\r\n var sessionId = Object.keys(sessionSitePairs)[0];\r\n if (sessionSitePairs[sessionId].length === 1) {\r\n var session = find(this.props.wizard.state.Sessions, function (s) { return s.SessionId == Object.keys(sessionSitePairs) });\r\n var site = sessionSitePairs[session.SessionId];\r\n this.chooseSite(session, site, this.props.wizard.nextQuestion);\r\n }\r\n }\r\n },\r\n\r\n render: function() {\r\n var isLoading = !this.state.sites.length || (!this.props.wizard.state.Course.HasCourseBreakdown && !this.state.availabilities.length);\r\n if (isLoading) { return ; }\r\n\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n var student = wizard.state.Student;\r\n var isNonResidentialAvailable = wizard.state.SessionPricing.IsNonResidentialAvailable;\r\n var sessionSitePairs = getPossibleSitesBySession(wizard.state, this.state.availabilities);\r\n var isMultiSessionCourse = size(sessionSitePairs) > 1;\r\n\r\n var nonRezOption = (!isNonResidentialAvailable \r\n ? false \r\n :
    \r\n
      \r\n
    • \r\n

      Non-Residential (no accommodation)

      \r\n

      For this course, you can arrange your own accommodation and live off campus.\r\n For full details on what's included and what isn't in our non-residential packages,\r\n please contact us on admin@oxford-royale.co.uk or using our live chat facility.\r\n The price to take this course as non-residential is GBP {wizard.state.SessionPricing.NonResidentialPriceIncludingDiscount}\r\n

      \r\n \r\n
    • \r\n
    \r\n
    );\r\n\r\n return
    \r\n

    {is3rdPerson\r\n ? \"In which accommodation would \" + student.FirstName + \" like to stay?\"\r\n : \"In which accommodation would you like to stay?\"}\r\n

    \r\n\r\n \r\n {map(sessionSitePairs, function (sites, sessionId, self) {\r\n var session = find(wizard.state.Sessions, function (s) { return s.SessionId == sessionId });\r\n var isFirstInLoop = Object.keys(self)[0] === sessionId;\r\n\r\n var from = moment.utc(session.From).format(\"Do MMMM\");\r\n var to = moment.utc(session.To).format(\"Do MMMM YYYY\");\r\n\r\n return \r\n
    \r\n {isMultiSessionCourse\r\n ? \r\n

    For {from} - {to}

    \r\n

    \r\n We have the following accommodation options for {wizard.state.Course.Name} in {wizard.state.Region.RegionName}:\r\n

    \r\n
    \r\n :

    \r\n We have the following accommodation options for {wizard.state.Course.Name} in {wizard.state.Region.RegionName} for {from} - {to}:\r\n

    }\r\n\r\n
      \r\n {map(sites, function(basicSite) {\r\n var site = find(this.state.sites, function (s) { return s.SiteId === basicSite.SiteId });\r\n var currentAccommodation = wizard.state.Accommodation;\r\n \r\n var isSelected = !currentAccommodation.IsNonResidential && currentAccommodation[sessionId] && currentAccommodation[sessionId].SiteId == site.SiteId;\r\n var isForbidden = this.state.forbiddenSitesBySession[sessionId] && any(this.state.forbiddenSitesBySession[sessionId], function (s) { return s.SiteId == basicSite.SiteId });\r\n\r\n var buttonClass = \"btn \" + (isSelected ? \"btn-primary\" : \"btn-default\"); \r\n\r\n var hasEnsuite = any(this.state.availabilities, function (availability) { return availability.Site.SiteId === site.SiteId && availability[wizard.state.Student.Gender + 'Ensuite'] > 0 });\r\n \r\n return
    • \r\n
      \r\n {site.ThumbnailUrl ? \r\n \r\n
      \r\n
      \r\n \r\n : false}\r\n\r\n
      \r\n
      \r\n {hasEnsuite ?

      Ensuites Available

      : false}\r\n
      \r\n\r\n {isForbidden \r\n ?

      {site.Name} not compatible with your choice of accommodation in the {isFirstInLoop ? \"second\" : \"first\"} session. Please choose another.

      \r\n : false}\r\n \r\n

      {site.Introduction}

      \r\n
      \r\n {site.Url ?

      View more and photographs

      : false}\r\n \r\n
      \r\n
      \r\n
    • ;\r\n }.bind(this))}\r\n
    \r\n
    \r\n
    ;\r\n }.bind(this))}\r\n\r\n {nonRezOption}\r\n
    \r\n \r\n
    \r\n
    ;\r\n },\r\n\r\n chooseSite: function(session, site, wizardCallback) {\r\n var accom = clone(this.props.wizard.state.Accommodation);\r\n accom.IsNonResidential = false;\r\n accom[session.SessionId] = site;\r\n var naughtyList = whatsTheNaughtyList.call(this, session, site);\r\n \r\n // if any accommodation on the forbidden list is now prohibited, unselect it\r\n forOwn(naughtyList, function(sites, sessionId) {\r\n if (accom.hasOwnProperty(sessionId) &&\r\n any(sites, function(s) { return s.SiteId == accom[sessionId].SiteId })) {\r\n accom = omit(accom, sessionId);\r\n }\r\n });\r\n\r\n\r\n this.setState({ forbiddenSitesBySession: naughtyList }, function () {\r\n this.props.wizard.set({\r\n Accommodation: accom,\r\n }, wizardCallback);\r\n })\r\n },\r\n\r\n chooseNonRez: function() {\r\n var accom = { IsNonResidential: true };\r\n\r\n this.setState({ forbiddenSitesBySession: this.getInitialState().forbiddenSitesBySession }, function() {\r\n this.props.wizard.set({\r\n Accommodation: accom,\r\n });\r\n });\r\n },\r\n\r\n isValid: function() {\r\n var isValid = true;\r\n var wizard = this.props.wizard;\r\n var accommodation = wizard.state.Accommodation;\r\n if (!accommodation.hasOwnProperty(\"IsNonResidential\")) {\r\n isValid = false;\r\n } else if (!accommodation.IsNonResidential) {\r\n var anySessionsDontHaveASiteSelected = any(wizard.state.SessionIds, function (sId) { return accommodation[sId] === undefined });\r\n if (anySessionsDontHaveASiteSelected) {\r\n isValid = false;\r\n }\r\n }\r\n\r\n this.setState({\r\n isValid: isValid\r\n });\r\n return isValid;\r\n }\r\n});\r\n\r\n// todo what about the cases where you have solutions: [ Site A, Site B], [Site B, Site A] and they try to choose [Site A, Site A] ??\r\n// returns { sessionId: [{ Site A}, {Site B}....], sessionId: [...]}\r\nfunction getPossibleSitesBySession(wizardState, availabilities) {\r\n var course = wizardState.Course;\r\n\r\n if (course.HasCourseBreakdown) { // then we get it from the course option solutions\r\n var courseOptionSolutions = wizardState.CourseOptionSolutions;\r\n var sessionSitePairs = forOwn(\r\n groupBy(flatten(courseOptionSolutions), function (co) { return co.Session.SessionId }),\r\n function (value, key, self) { self[key] = map(distinct(value, false, function(co) {\r\n return co.Site.SiteId;\r\n }), \"Site\")}\r\n );\r\n\r\n return sessionSitePairs;\r\n }\r\n\r\n return mapValues(\r\n groupBy(\r\n filter(availabilities,\r\n function(a) { return !a.IsClosed && a.Total > 0 }),\r\n function(a) { return a.Session.SessionId }),\r\n function(array) { return distinct(map(array, function(a) { return a.Site; }), false, function(site) {\r\n return site.SiteId;\r\n }); }); \r\n}\r\n\r\n// e.g. the solutions said you could have for sessions 3 and 4 :\r\n// [ {3 : Site A, 4: Site B}, {3: Site B, 4: Site A}, {3: Site C, 4: Site C}]\r\n// user chooses Session 3, Site A\r\n// remove all solutions containing { 3 : Site A }, \r\n// then remove the Session 3\r\n// this is a list of sites in session 4 that cannot be chosen\r\nfunction whatsTheNaughtyList(session, site) {\r\n var state = this.props.wizard.state;\r\n var course = state.Course;\r\n\r\n if (!course.HasCourseBreakdown) {\r\n return this.getInitialState().forbiddenSitesBySession;\r\n }\r\n\r\n var courseOptionsSolutions = state.CourseOptionSolutions;\r\n // e.g [ {3: Site A, 4: SiteB }, {3: Site B, 4: Site A}, {3: Site C, 4: Site C} ]\r\n var sessionSiteCombos = map(courseOptionsSolutions, function(cos) {\r\n return mapValues(groupBy(cos, function (sol) { return sol.Session.SessionId; }), function(sols) {\r\n return first(distinct(map(sols, \"Site\"), false, \"SiteId\"));\r\n }); \r\n });\r\n\r\n // e.g [{ 3: Site B, 4: Site A}, {3: Site C, 4: Site C} ]\r\n var removeAnySolutionsAllowedBySessionChoice = reject(sessionSiteCombos,\r\n function (combo) {\r\n return any(combo,\r\n function (thisSite, sessionId) {\r\n return site.SiteId == thisSite.SiteId && sessionId == session.SessionId;\r\n });\r\n });\r\n\r\n // e.g. [{4: Site B}, {4: Site C}]\r\n var removeSelectedSessionKeys = map(\r\n removeAnySolutionsAllowedBySessionChoice, function (combo) {\r\n return omit(combo, session.SessionId);\r\n });\r\n\r\n // e.g. { 4: [Site A, Site C]}\r\n var forbiddenSitesBySessionId = reduce(removeSelectedSessionKeys, function (sessionAccumulator, sessionsAndSites) {\r\n forOwn(sessionsAndSites,\r\n function (site, sessionId) {\r\n if (!sessionAccumulator.hasOwnProperty(sessionId)) {\r\n sessionAccumulator[sessionId] = [];\r\n }\r\n if (!any(sessionAccumulator[sessionId], function (s) { return site.SiteId === s.SiteId })) {\r\n sessionAccumulator[sessionId].push(site);\r\n }\r\n });\r\n return sessionAccumulator;\r\n }, {});\r\n\r\n return forbiddenSitesBySessionId;\r\n}\r\n\r\nexport default WhatSite;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport BasketStore from '../stores/BasketStore.js';\r\nimport BasketService from '../utilities/BasketService.js';\r\n\r\nfunction getOptions(lineItem) {\r\n return BasketService.getUpsellOptions(lineItem || BasketStore.getCourses());\r\n}\r\n\r\nfunction error(response) {\r\n var responseJson = response.responseJSON;\r\n if (!responseJson) {\r\n try {\r\n responseJson = jQuery.parseJSON(response.responseText);\r\n } catch (e) {\r\n responseJson = { Message: 'There was an unknown error: ' + response.responseText };\r\n }\r\n }\r\n Dispatcher.dispatch({\r\n type: ActionTypes.SEND_UPSELL_REQUEST_FAILURE,\r\n response: responseJson\r\n });\r\n}\r\n\r\nexport default {\r\n getOptions: function (lineItem) {\r\n // issue the request to the api for making a reservation\r\n Dispatcher.dispatch({\r\n type: ActionTypes.SEND_UPSELL_REQUEST_BEGIN\r\n });\r\n\r\n getOptions({ \"dummy\": lineItem })\r\n .done(function (options) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.SEND_UPSELL_REQUEST_SUCCESS,\r\n options: { itemId: lineItem.ItemId, data: options }\r\n });\r\n })\r\n .fail(error);\r\n }\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport Linkify from 'react-linkify';\r\nimport Loading from '../common/loading.jsx';\r\nimport PressEnter from './press-enter-to-continue.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport UpsellActionCreators from '../../actions/UpsellActionCreators.js';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport some from 'lodash/some';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport partial from 'lodash/partial';\r\nimport flatten from 'lodash/flatten';\r\n\r\nvar Upsells = createReactClass({\r\n displayName: 'Upsells',\r\n\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function() {\r\n return {\r\n isSearching: true,\r\n upsellOptions: []\r\n };\r\n },\r\n\r\n componentDidMount: function () {\r\n UpsellActionCreators.getOptions(this.props.wizard.getLineItem());\r\n BasketStore.addChangeListener(this.updateBasket);\r\n },\r\n\r\n componentWillUnmount: function() {\r\n BasketStore.removeChangeListener(this.updateBasket);\r\n },\r\n\r\n isValid: function() {\r\n return true;\r\n },\r\n\r\n updateBasket: function() {\r\n var isSearching = BasketStore.isUpsellSearching();\r\n if (this.state.isSearching !== isSearching) {\r\n if (!isSearching) {\r\n var lineItem = this.props.wizard.getLineItem();\r\n if (!BasketStore.getUpsellOptions(lineItem).Options.length) {\r\n this.props.wizard.nextQuestion(function () {\r\n this.props.wizard.set({\r\n SkipUpsell: true // this removes the component from the wizard components and forwards us on,\r\n });\r\n }.bind(this)); \r\n return;\r\n }\r\n }\r\n\r\n this.setState({\r\n isSearching: isSearching,\r\n upsellOptions: BasketStore.getUpsellOptions(lineItem).Options\r\n });\r\n }\r\n },\r\n\r\n handleChangeOption: function(option, e) {\r\n var newSelectedOptions;\r\n if (this.optionSelected(option)) {\r\n newSelectedOptions = filter(this.props.wizard.state.SelectedUpsellOptions,\r\n function(selectedOption) {\r\n return option.LineItem.Course.CourseId !== selectedOption.LineItem.Course.CourseId;\r\n });\r\n } else {\r\n newSelectedOptions = this.props.wizard.state.SelectedUpsellOptions.concat(option);\r\n }\r\n\r\n this.props.wizard.set({\r\n SelectedUpsellOptions: newSelectedOptions\r\n });\r\n },\r\n\r\n optionSelected: function(option) {\r\n return some(this.props.wizard.state.SelectedUpsellOptions,\r\n function(selectedOption) {\r\n return option.LineItem.Course.CourseId === selectedOption.LineItem.Course.CourseId;\r\n });\r\n },\r\n \r\n render: function() {\r\n var isLoading = this.state.isSearching;\r\n if (isLoading) {\r\n return ;\r\n }\r\n\r\n return
    \r\n

    Would you like any of the following extras?

    \r\n\r\n {map(this.state.upsellOptions, function (upsellOption) {\r\n \r\n return
    \r\n

    {upsellOption.Title}

    \r\n
    \r\n {upsellOption.ImageUrl ? : false}\r\n \r\n

    {upsellOption.Description}

    \r\n
    \r\n
    \r\n
      \r\n {\r\n map(flatten(map(upsellOption.Options, \"Options\")), function (option) {\r\n return
    • \r\n {option.LineItem.Course.Name}\r\n \r\n
    • ;\r\n }.bind(this))\r\n }\r\n
    \r\n
    ;\r\n }.bind(this))}\r\n \r\n\r\n \r\n
    \r\n
    ;\r\n }\r\n});\r\n\r\nexport default Upsells;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport moment from 'moment';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport BasketActionCreators from '../../actions/BasketActionCreators.js';\r\nimport Ui from '../../utilities/Ui.js';\r\nimport RegionPrettyNameLookup from './region-pretty-name-lookup';\r\nimport first from 'lodash/first';\r\nimport last from 'lodash/last';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport map from 'lodash/map';\r\nimport uniq from 'lodash/uniq';\r\nimport sortBy from 'lodash/sortBy';\r\nimport groupBy from 'lodash/groupBy';\r\nimport flatten from 'lodash/flatten';\r\nimport filter from 'lodash/filter';\r\nimport some from 'lodash/some';\r\nimport partial from 'lodash/partial';\r\nimport partialRight from 'lodash/partialRight';\r\nimport reduce from 'lodash/reduce';\r\nvar sum = partialRight(reduce, function (total, n) { return total + n; });\r\n\r\nvar Summary = createReactClass({\r\n displayName: \"Summary\",\r\n getInitialState: function () {\r\n var totals = BasketStore.getBasketTotals();\r\n var bookings = BasketStore.getCourses();\r\n return {\r\n bookings: bookings,\r\n totalIncludingCourseDiscounts: totals.totalIncludingCourseDiscounts,\r\n totalIncludingBasketDiscounts: totals.totalIncludingBasketDiscounts,\r\n basketDeposit: totals.deposit,\r\n showUpsells: false,\r\n };\r\n },\r\n\r\n getDepositFromWizard: function () {\r\n var booking = this.props.wizard.state;\r\n var deposit = false;\r\n if (booking.SessionPricing) {\r\n deposit += booking.SessionPricing.Deposit;\r\n }\r\n\r\n if (booking.SelectedUpsellOptions && booking.SelectedUpsellOptions.length) {\r\n deposit += sum(map(booking.SelectedUpsellOptions, \"Deposit\"));\r\n }\r\n\r\n return deposit;\r\n },\r\n\r\n getTotalFromWizard: function () {\r\n var booking = this.props.wizard.state;\r\n return this.getPriceFromBooking(booking) + this.getPriceFromUpsells(booking);\r\n },\r\n\r\n getPriceFromBooking: function (booking) {\r\n return booking.SessionPricing &&\r\n booking.Accommodation &&\r\n booking.Accommodation.IsNonResidential\r\n ? booking.SessionPricing.NonResidentialPriceIncludingDiscount\r\n : (booking.SessionPricing ? booking.SessionPricing.PriceIncludingDiscount : false);\r\n },\r\n\r\n getPriceFromUpsells: function (booking) {\r\n if (booking.SelectedUpsellOptions && booking.SelectedUpsellOptions.length) {\r\n return sum(map(booking.SelectedUpsellOptions, function (option) { return option.Price; }));\r\n }\r\n\r\n if (booking.Course && booking.Course.CourseType.AvailabilityModel === 2) { // it's an upsell from the basket\r\n return booking.PriceExcludingDiscount;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n componentDidMount: function () {\r\n BasketStore.addChangeListener(this.change);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n BasketStore.removeChangeListener(this.change);\r\n },\r\n\r\n change: function () {\r\n var bookings = BasketStore.getCourses();\r\n var change = {};\r\n if (bookings !== this.state.bookings) {\r\n change.bookings = bookings;\r\n }\r\n\r\n var totals = BasketStore.getBasketTotals();\r\n var totalFromWizard = this.getTotalFromWizard();\r\n if (totals.totalIncludingBasketDiscounts !== this.state.totalIncludingBasketDiscounts ||\r\n totals.totalIncludingCourseDiscounts !== this.state.totalIncludingCourseDiscounts ||\r\n totals.deposit !== this.state.basketDeposit) {\r\n change.totalIncludingCourseDiscounts = totals.totalIncludingCourseDiscounts;\r\n change.totalIncludingBasketDiscounts = totals.totalIncludingBasketDiscounts;\r\n change.basketDeposit = totals.deposit;\r\n }\r\n\r\n if (!isEmpty(change)) {\r\n this.setState(change);\r\n }\r\n },\r\n\r\n handleRemove: function (booking) {\r\n var message = \"Are you sure you want to remove \" + booking.Course.Name + \" for \" + booking.Student.FirstName + \" \" + booking.Student.LastName + \"?\";\r\n\r\n if (confirm(message)) {\r\n BasketActionCreators.removeCourse(booking.ItemId);\r\n }\r\n },\r\n\r\n handleRemoveUpsell: function (upsell) {\r\n var message = \"Are you sure you want to remove \" + upsell.LineItem.Course.Name + \"?\";\r\n\r\n if (confirm(message)) {\r\n this.props.wizard.set({\r\n SelectedUpsellOptions: filter(this.props.wizard.state.SelectedUpsellOptions, function (u) { return u !== upsell })\r\n });\r\n }\r\n },\r\n\r\n handleChange: function (booking) {\r\n var course = BasketStore.getCourseByItemId(booking.ItemId);\r\n this.props.wizard.resetCourse();\r\n this.props.wizard.set({ \r\n CurrentItemId: booking.ItemId,\r\n Student: course.Student,\r\n Region: booking.Region\r\n }, () => this.props.wizard.jump('WhatCourse'));\r\n },\r\n\r\n jumpToCustomer: function () {\r\n this.props.wizard.jump('Customer');\r\n },\r\n\r\n jumpToStudent: function (itemId) {\r\n var course = BasketStore.getCourseByItemId(itemId);\r\n this.props.wizard.set({ \r\n CurrentItemId: itemId,\r\n Student: course.Student },\r\n () => this.props.wizard.jump('Student')); \r\n },\r\n\r\n clearBasket: function () {\r\n if (confirm('Are you sure you want to clear your basket?')) {\r\n BasketActionCreators.clearBasket();\r\n this.props.wizard.reset();\r\n }\r\n },\r\n\r\n render: function () {\r\n var wizard = this.props.wizard;\r\n\r\n var data = this.props.wizard.state;\r\n var basketBookings = this.getBookingDataFromBasket();\r\n var basketUpsells = filter(this.state.bookings, function (b) { return b.Course.CourseType.AvailabilityModel === 2 });\r\n var upsellsBasketTotal = isEmpty(basketUpsells) ? 0 : sum(map(basketUpsells, this.getPriceFromUpsells));\r\n\r\n var bookings = basketBookings;\r\n\r\n var depositTotal = this.state.basketDeposit;\r\n var upsellsTotal = upsellsBasketTotal;\r\n\r\n var renderBookings = partialRight(map, function (booking, index, bookingsCollection) {\r\n // don't render any booking stuff if all I have is student data\r\n if (!booking.IsBasketCase && !data.Region && !data.Course) {\r\n return false;\r\n }\r\n\r\n var price = this.getPriceFromBooking(booking);\r\n\r\n return \r\n
    \r\n
    \r\n {bookingsCollection.length > 1 ?\r\n
    \r\n {(index + 1)}\r\n
    : false\r\n }\r\n
    \r\n
    \r\n {\r\n booking.StudyMethod && booking.StudyMethod === \"online\" || (booking.Course && booking.Course.CourseType && booking.Course.CourseType.StudyMethod === 1)\r\n ?

    Online Summer School

    \r\n : false\r\n }\r\n {!booking.Course\r\n ? false\r\n :

    \r\n {booking.Course.Name}\r\n {!booking.CourseOptionSolutions || !booking.CourseOptionSolutions.length\r\n ? false\r\n :
      \r\n {map(booking.CourseOptionSolutions[0], function (co) { return
    • {co.CourseOption.Name}
    • ; })}\r\n
    }\r\n

    \r\n }\r\n {!booking.Region\r\n ? false :\r\n
    \r\n { booking.Region.RegionName === 'Oxford' || booking.Region.RegionName === \"Cambridge\" \r\n ? \"Studying in \" + booking.Region.RegionName \r\n : \"On the campus of \" \r\n + (RegionPrettyNameLookup.hasOwnProperty(booking.Region.RegionName) \r\n ? RegionPrettyNameLookup[booking.Region.RegionName] \r\n : booking.RegionName.RegionName)\r\n }\r\n
    \r\n }\r\n {!booking.Intensity || booking.Intensity.Name === 'Default'\r\n ? false\r\n :
    \r\n {!booking.SessionIds\r\n ? false\r\n : {map(booking.SessionDates, function (d) { return d.format(\"Do MMMM YYYY\") }).join(\" - \")}}\r\n
    \r\n }\r\n {isEmpty(booking.Accommodation) || !booking.Course || booking.Course.CourseType.AvailabilityModel === 2 || booking.Course.CourseType.StudyMethod === 1\r\n ? false\r\n :
    \r\n {booking.Accommodation.IsNonResidential\r\n ? \"Non Residential\"\r\n : filter(uniq(map(booking.Accommodation, function(a) { \r\n return a.Name === \"Oxford College Accommodation\"\r\n ? \"Accommodation in an Oxford College\"\r\n : a.Name === \"Cambridge College Accommodation\"\r\n ? \"Accommodation in a Cambridge College\"\r\n : a.Name;\r\n })), function (v) { return v; }).join(\" & \")}\r\n
    }\r\n {!booking.TimeZone\r\n ? false\r\n :
    \r\n {booking.TimeZone.Text}\r\n
    }\r\n
    \r\n
    \r\n
    \r\n {price\r\n ? £{Ui.formatWithCommas(price)}\r\n : false}\r\n {!booking.IsBasketCase\r\n ? false\r\n :
    \r\n change\r\n
    \r\n remove\r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n {map(filter(basketUpsells, function (upsell) { return upsell.ParentItemId === booking.ItemId }), function (booking) {\r\n return
    \r\n {bookingsCollection.length > 1 ?\r\n
    \r\n \r\n
    : false\r\n }\r\n

    + {booking.Course.Name}

    \r\n

    \r\n £{Ui.formatWithCommas(this.getPriceFromUpsells(booking))}\r\n remove\r\n

    \r\n
    \r\n }.bind(this))}\r\n
    ;\r\n }.bind(this));\r\n\r\n var bookingsByStudent = groupBy(bookings, function (booking) {\r\n return getStudentKey(booking.Student);\r\n });\r\n\r\n return
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n {!data.HasStartedWizard\r\n ? Watch your live summary update here as you make your selections!\r\n : \r\n {data.IsUserCustomer || data.IsUserCustomer === null\r\n ?
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    Customer
    \r\n \r\n
    {data.Customer.FirstName} {data.Customer.LastName}
    \r\n
    {data.Customer.Email}
    \r\n
    {data.Customer.Mobile}
    \r\n
    \r\n : false}\r\n\r\n {map(bookingsByStudent, function (bookings, studentIdentifier) {\r\n var student = bookings[0].Student;\r\n return
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    Student
    \r\n
    {student.FirstName} {student.LastName}
    \r\n
    {student.DateOfBirth ? (moment.utc().diff(student.DateOfBirth, 'years')) : false} / {student.Gender} / {student.Nationality ? student.Nationality.Name : false}
    \r\n\r\n {!data.IsUserCustomer \r\n ? \r\n
    {student.Email}
    \r\n
    {student.Mobile}
    \r\n
    \r\n : false}\r\n\r\n
    \r\n {renderBookings(bookings)}\r\n
    ;\r\n }.bind(this))}\r\n\r\n
    \r\n }\r\n
    \r\n
    ;\r\n },\r\n\r\n getBookingDataFromBasket: function () {\r\n var studentInWizard = this.props.wizard.state.Student;\r\n\r\n var courseBookings = filter(this.state.bookings, function (b) { return b.Course.CourseType.AvailabilityModel !== 2 });\r\n return map(courseBookings, function (data, courseKey) {\r\n var sessions = data.Options ? uniq(sortBy(map(data.Options, function (o) { return o.Session; }), \"From\"), false, \"SessionId\") : [];\r\n var wizardStateLikeData = {\r\n key: data.ItemId,\r\n ItemId: data.ItemId,\r\n SessionPricing: {\r\n PriceIncludingDiscount: data.PriceIncludingDiscount,\r\n PriceExcludingDiscount: data.PriceExcludingDiscount,\r\n Deposit: data.Deposit,\r\n NonResidentialPriceIncludingDiscount: data.PriceIncludingDiscount,\r\n NonResidentialPriceExcludingDiscount: data.PriceExcludingDiscount\r\n },\r\n Region: data.Region,\r\n Course: data.Course,\r\n Student: data.Student,\r\n CourseOptionSolutions: data.Course.HasCourseBreakdown ? [flatten(map(data.Options, \"Options\"))] : [],\r\n Intensity: data.Intensity,\r\n SessionIds: uniq(sessions, \"SessionId\"),\r\n SessionDates: sessions.length ? [moment.utc(first(sessions).From), moment.utc(last(sessions).To)] : [],\r\n Accommodation: some(map(data.Options, 'IsNonResidential')) ? { IsNonResidential: true } : uniq(map(data.Options, \"Site\"), false, \"SiteId\"),\r\n IsBasketCase: true\r\n };\r\n\r\n return wizardStateLikeData;\r\n });\r\n },\r\n\r\n toggleShowUpsells: function () {\r\n this.setState({\r\n showUpsells: !this.state.showUpsells\r\n });\r\n }\r\n});\r\n\r\nfunction getStudentKey(student) {\r\n return student.FirstName + \"|\" + student.LastName + \"|\" + moment.utc(student.DateOfBirth).format(\"YYYYMMDD\");\r\n}\r\n\r\nexport default Summary;\r\n","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport ApplySummary from './apply-summary.jsx';\r\nimport pick from 'lodash/pick';\r\nimport find from 'lodash/find';\r\nimport map from 'lodash/map';\r\nimport values from 'lodash/values';\r\nimport partial from 'lodash/partial';\r\nimport groupBy from 'lodash/groupBy';\r\nimport moment from 'moment';\r\nimport Ui from '../../utilities/Ui.js';\r\n\r\nvar WhatNext = createReactClass({\r\n displayName: 'WhatNext',\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n\r\n getInitialState: function() {\r\n return {\r\n countries: BasketStore.getCountries(),\r\n hasBookings: BasketStore.numberOfItems() > 0,\r\n courses: BasketStore.getCourses()\r\n }\r\n },\r\n\r\n componentDidMount: function () {\r\n BasketStore.addChangeListener(this.changeBasket);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n BasketStore.removeChangeListener(this.changeBasket);\r\n },\r\n\r\n changeBasket: function () {\r\n var newCountries = BasketStore.getCountries();\r\n var update = {};\r\n if (newCountries !== this.state.countries) {\r\n update.countries = newCountries;\r\n }\r\n\r\n var newHasBookings = BasketStore.numberOfItems() > 0;\r\n if (newHasBookings != this.state.hasBookings) {\r\n update.hasBookings = newHasBookings;\r\n }\r\n\r\n var newCourses = BasketStore.getCourses();\r\n if (newCourses !== this.state.courses) {\r\n update.courses = newCourses;\r\n }\r\n\r\n this.setState(update);\r\n },\r\n \r\n handleReserve: function () {\r\n this.props.wizard.jumpToBilling();\r\n },\r\n\r\n handleAnotherBookingForSameStudent: function(itemId) {\r\n this.props.wizard.newWizardForStudent(itemId);\r\n },\r\n\r\n handleAnotherBookingForDiffStudent: function() {\r\n // if the user is a student, and they're adding another student, then they ARE actually the customer sooo....\r\n if (!this.props.wizard.state.IsUserCustomer) {\r\n var student = this.props.wizard.state.Student;\r\n var newCustomer = pick(student, \"FirstName\", \"LastName\", \"Email\", \"Mobile\");\r\n newCustomer.Country = find(this.state.countries, function(c) { return c.CountryId === student.Nationality.CountryId });\r\n var wizState = {\r\n IsUserCustomer: true,\r\n Customer: newCustomer\r\n }\r\n\r\n this.props.wizard.set(wizState, this.props.wizard.newWizardForNewStudent);\r\n return;\r\n }\r\n this.props.wizard.newWizardForNewStudent();\r\n },\r\n\r\n handleChooseProgramme: function () {\r\n this.props.wizard.resetCourse();\r\n this.props.wizard.jump('Student');\r\n },\r\n\r\n render: function() {\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n \r\n var totals = BasketStore.getBasketTotals();\r\n var total = totals.totalIncludingBasketDiscounts;\r\n\r\n return
    \r\n

    Please check this summary of your application, then pay to confirm your place.

    \r\n
    \r\n\r\n
    \r\n \r\n\r\n {this.state.hasBookings ? false : }\r\n
    \r\n {\r\n this.state.hasBookings\r\n ?
    \r\n
    \r\n
    \r\n
    \r\n

    Total fees

    \r\n

    £{Ui.formatWithCommas(total)}

    \r\n
    \r\n
    \r\n

    Due now

    \r\n

    £{Ui.formatWithCommas(totals.deposit)}

    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n

    Alternatively, you can:

    \r\n\r\n {\r\n values(map(\r\n groupBy(values(this.state.courses), function (booking) {\r\n var student = booking.Student;\r\n return student.FirstName + \"|\" + student.LastName + \"|\" + moment.utc(student.DateOfBirth).format(\"YYYYMMDD\") + \"|\" + student.Gender;\r\n }), function (bookings, identifier) {\r\n var student = bookings[0].Student;\r\n return

    \r\n \r\n

    \r\n }.bind(this)))\r\n }\r\n\r\n

    \r\n \r\n

    \r\n\r\n

    Or, if you'd like to, you can:

    \r\n

    { if (confirm('Are you sure you want to remove all details and start again?')) { localStorage.clear(); location.reload(); }}}>Start again

    \r\n
    \r\n
    \r\n : false\r\n }\r\n \r\n
    \r\n
    ;\r\n },\r\n\r\n isValid: function() {\r\n return true;\r\n }\r\n});\r\n\r\nexport default WhatNext;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport Ui from '../../utilities/Ui.js';\r\n\r\nvar CheckoutPay = createReactClass({\r\n propTypes: {\r\n isAgentAllowedToCreateDraftOrder: PropTypes.bool,\r\n isWebAdminUser: PropTypes.bool,\r\n onPayDeposit: PropTypes.func,\r\n onPayTotal: PropTypes.func,\r\n onConfirm: PropTypes.func,\r\n deposit: PropTypes.number,\r\n total: PropTypes.number\r\n },\r\n\r\n renderButton: function (text, rightText, onClick, btnClass) {\r\n return
    \r\n \r\n
    ;\r\n },\r\n\r\n render: function() {\r\n return (\r\n
    \r\n {\r\n this.props.isWebAdminUser || this.props.isAgentAllowedToCreateDraftOrder\r\n ? this.renderButton('Create Draft Order',\r\n '',\r\n this.props.onConfirm,\r\n '')\r\n : false\r\n }\r\n {this.props.deposit\r\n ? this.renderButton('Pay enrolment fee: ',\r\n '£' + Ui.formatWithCommas(this.props.deposit),\r\n this.props.onPayDeposit,\r\n '')\r\n : false}\r\n {this.renderButton('Pay total: ',\r\n '£' + Ui.formatWithCommas(this.props.total),\r\n this.props.onPayTotal,\r\n '')}\r\n
    );\r\n }\r\n});\r\n\r\nexport default CheckoutPay;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport BasketActionCreators from '../../actions/BasketActionCreators.js';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport TelephoneInput from '../common/react-telephone-input.jsx';\r\nimport map from 'lodash/map';\r\nimport filter from 'lodash/filter';\r\nimport uniq from 'lodash/uniq';\r\nimport partial from 'lodash/partial';\r\nimport min from 'lodash/min';\r\nimport max from 'lodash/max';\r\n\r\nfunction getStudentKey(student) {\r\n return student.FirstName + '|' + student.LastName + '|' + student.DateOfBirth + '|' + student.Gender;\r\n}\r\n\r\nvar CustomerForm = createReactClass({\r\n propTypes: {\r\n showCustomerFields: PropTypes.bool,\r\n customer: PropTypes.object,\r\n errorState: PropTypes.object,\r\n onUpdate: PropTypes.func, // called whenever a field is blurred or changed considerably (for validation purposes), not called when text is being input for example\r\n courses: PropTypes.object,\r\n isThirdParty: PropTypes.bool,\r\n countries: PropTypes.array,\r\n },\r\n\r\n getDefaultProps: function () {\r\n return {\r\n countries: [],\r\n }\r\n },\r\n\r\n onChange: function (e) {\r\n BasketActionCreators.updateCustomer(e.target.name, e.target.value);\r\n if (this.props.isThirdParty) {\r\n if (e.target.name === 'Email') {\r\n BasketActionCreators.updateCustomer('ConfirmEmail', e.target.value);\r\n }\r\n }\r\n },\r\n\r\n onChangePhoneNumber: function (number) {\r\n BasketActionCreators.updateCustomer('Mobile', number);\r\n },\r\n\r\n onChooseStudent: function (student) {\r\n BasketActionCreators.chooseCustomer(student);\r\n },\r\n\r\n render: function () {\r\n var confirm = !this.props.isThirdParty ?
    \r\n \r\n \r\n \r\n
    : false;\r\n\r\n var mobile =
    \r\n \r\n \r\n \r\n
    ;\r\n\r\n var adultStudents = uniq(\r\n map(\r\n filter(\r\n this.props.courses,\r\n function (lineItem) {\r\n // find min of items in the age groups\r\n var minAge = (min(lineItem.Course.AgeGroups, function (ageGroup) {\r\n return ageGroup.LowerBound;\r\n })).LowerBound;\r\n\r\n return lineItem.Student\r\n && lineItem.Student.FirstName\r\n && lineItem.Student.LastName\r\n && lineItem.Student.DateOfBirth\r\n && lineItem.Student.Gender\r\n && minAge > 18;\r\n }\r\n ),\r\n function (lineItem) {\r\n return lineItem.Student;\r\n }\r\n ),\r\n getStudentKey);\r\n\r\n return (\r\n
    \r\n {\r\n adultStudents.length && this.props.showCustomerFields\r\n ?
    \r\n
    \r\n
      \r\n {map(adultStudents,\r\n function (student) {\r\n return
    • \r\n Use details of {student.FirstName} {student.LastName}\r\n
    • ;\r\n }.bind(this))}\r\n
    \r\n
    \r\n
    \r\n : false\r\n }\r\n {\r\n this.props.showCustomerFields\r\n ?
    \r\n
    \r\n

    Name and Contact Details:

    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n {this.props.isThirdParty ? mobile : confirm}\r\n
    \r\n {!this.props.isThirdParty\r\n ?
    {mobile}
    \r\n : false}\r\n
    \r\n : false\r\n }\r\n\r\n { this.props.showCustomerFields ?\r\n
    \r\n

    Billing Address:

    \r\n
    \r\n : false}\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n});\r\n\r\nexport default CustomerForm;","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport create from 'lodash/create';\r\nimport Store from './Store.js';\r\n\r\nvar user;\r\n\r\nfunction UserStore() {\r\n Store.call(this);\r\n}\r\n\r\nUserStore.prototype = create(Store.prototype, {\r\n 'constructor': UserStore,\r\n\r\n getUser: function() {\r\n return user;\r\n },\r\n\r\n isWebAdmin: function() {\r\n return location.href.indexOf('https://localhost:44300') === 0\r\n || location.href.indexOf('https://ora-app-uat.azurewebsites.net') === 0\r\n || location.href.indexOf('https://webadmin.oxford-royale.co.uk') === 0\r\n || location.href.indexOf('https://webadmin.oxford-royale.com') === 0\r\n || global.OraWidgets.Options.IsWebAdmin;\r\n }\r\n});\r\n\r\nvar userStore = new UserStore();\r\nuserStore.dispatchToken = Dispatcher.register(function (payload) {\r\n switch (payload.type) {\r\n case ActionTypes.WHO_AM_I_SUCCESS:\r\n user = payload.me;\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n userStore.emitChange(payload.context);\r\n});\r\n\r\nexport default userStore;","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n searchAgents: function (searchTerm) {\r\n return http.get(options.apiEndpoint() + '/Agent?take=30&search=' + searchTerm);\r\n }\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport map from 'lodash/map';\r\nimport isString from 'lodash/isstring';\r\nimport debounce from 'lodash/debounce';\r\n\r\nvar TypeAhead = createReactClass({\r\n propTypes: {\r\n dataSource: PropTypes.string,\r\n onChange: PropTypes.func,\r\n onSelect: PropTypes.func,\r\n placeHolder: PropTypes.string,\r\n value: PropTypes.string,\r\n autoSuggestEnabled: PropTypes.bool,\r\n className: PropTypes.string,\r\n func: PropTypes.func\r\n },\r\n\r\n getDefaultProps: function() {\r\n return {\r\n value: ''\r\n };\r\n },\r\n\r\n getInitialState: function() {\r\n return {\r\n selectedIdx: -1,\r\n items: [],\r\n isFocussed: false\r\n };\r\n },\r\n\r\n componentWillMount: function() {\r\n this.isMouseDown = false;\r\n this.func = this.props.autoSuggestEnabled ? this.props.func || generateFuncForUrl(this.props.dataSource) : function() {};\r\n jQuery(window).on('mousedown', this.pageClick);\r\n },\r\n\r\n componentWillUnmount: function() {\r\n jQuery(window).off('mousedown', this.pageClick);\r\n },\r\n\r\n pageClick: function() {\r\n if (this.isMouseDown) {\r\n return;\r\n }\r\n\r\n this.setState({ isFocussed: false });\r\n },\r\n\r\n mouseDown: function() {\r\n this.isMouseDown = true;\r\n },\r\n\r\n mouseUp: function() {\r\n this.isMouseDown = false;\r\n },\r\n\r\n onFocus: function() {\r\n this.setState({ isFocussed: true });\r\n },\r\n\r\n onBlur: function() {\r\n if (!this.isMouseDown) {\r\n this.setState({ isFocussed: false });\r\n }\r\n },\r\n\r\n onKeyDown: function(e) {\r\n var code = e.which ? e.which : e.keyCode;\r\n if (code === 40) {\r\n // down\r\n e.preventDefault();\r\n if (this.state.selectedIdx < this.state.items.length - 1) {\r\n\r\n //This looks odd, but we need to pass the whole \"e.target.value\" up a chain for the onChange event.\r\n e.target.value = this.state.items[this.state.selectedIdx + 1].Text;\r\n this.setState({ selectedIdx: (this.state.selectedIdx + 1) });\r\n\r\n this.props.onChange && this.props.onChange(e);\r\n }\r\n } else if (code === 38) {\r\n // up\r\n e.preventDefault();\r\n if (this.state.selectedIdx > -1) {\r\n\r\n //This looks odd, but we need to pass the whole \"e.target.value\" up a chain for the onChange event.\r\n e.target.value = this.state.items[this.state.selectedIdx - 1].Text;\r\n this.setState({ selectedIdx: this.state.selectedIdx - 1 });\r\n\r\n this.props.onChange && this.props.onChange(e);\r\n }\r\n }\r\n\r\n if (code === 13 || code === 9) {\r\n // enter or tab\r\n if (this.state.selectedIdx > -1) {\r\n this.select(this.state.items[this.state.selectedIdx]);\r\n } else {\r\n this.select(this.props.value);\r\n }\r\n } else {\r\n this.setState({ isFocussed: true });\r\n }\r\n\r\n this.lastKeyPress = code;\r\n },\r\n\r\n lastKeyPress: false,\r\n callback: function (items) {\r\n var newState = { items: items, selectedIdx: -1 };\r\n\r\n // if there's only one item and they've not pressed backspace set the text to the single result - SCRAP THAT, I DON'T LIKE IT\r\n //if (items.length === 1 && (!this.lastKeyPress || (this.lastKeyPress !== 8 && this.lastKeyPress !== 46))) {\r\n // newState.text = items[0];\r\n // this.props.onChange && this.props.onChange(items[0]);\r\n //}\r\n\r\n this.setState(newState);\r\n },\r\n\r\n onChange: function (e) {\r\n // update the search box\r\n this.setState({ text: e.target.value });\r\n\r\n // perform the search\r\n this.func(e.target.value, this.callback);\r\n\r\n // signal consumer\r\n this.props.onChange && this.props.onChange(e);\r\n },\r\n\r\n select: function (selectedItem) {\r\n //calling setState is not guaranteed to update synchronously\r\n var item;\r\n if (!selectedItem) {\r\n item = { Text: this.props.value };\r\n } else {\r\n if (isString(selectedItem)) {\r\n item = { Text: selectedItem };\r\n } else {\r\n item = selectedItem;\r\n }\r\n }\r\n\r\n var fakeEvent = { target: { value: this.props.value } };\r\n this.props.onChange && this.props.onChange(fakeEvent);\r\n this.props.onSelect && this.props.onSelect(item);\r\n this.setState({ isFocussed: false });\r\n },\r\n\r\n render: function () {\r\n var lists = map(this.state.items, function (item, idx) {\r\n var className = idx === this.state.selectedIdx ? 'active' : '';\r\n var click = function() {\r\n this.select(item);\r\n }.bind(this);\r\n\r\n var mouseOver = function() {\r\n this.setState({ selectedIdx: idx });\r\n }.bind(this);\r\n\r\n return
  • {item.Text}
  • ;\r\n }.bind(this));\r\n\r\n var div = false;\r\n if (this.state.isFocussed && this.props.value && this.props.value.length && this.props.autoSuggestEnabled) {\r\n div =
    \r\n
      {lists}\r\n
    \r\n
    ;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {div}\r\n
    \r\n\t\t);\r\n }\r\n});\r\n\r\nfunction generateFuncForUrl(url) {\r\n return debounce(function(word, callback) {\r\n jQuery.get(url + '?query=' + encodeURIComponent(word),\r\n function(response) {\r\n callback(response);\r\n });\r\n },\r\n 250);\r\n}\r\n\r\nfunction generateFuncForArrayOfStrings(array) {\r\n return function (word, callback) {\r\n var results = [];\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i].indexOf(word) > -1) {\r\n results.push(array[i]);\r\n }\r\n }\r\n\r\n callback(results);\r\n }\r\n}\r\n\r\nexport default TypeAhead;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport FormGroup from '../common/form-group.jsx';\r\nimport UserStore from '../../stores/UserStore.js';\r\nimport map from 'lodash/map';\r\nimport some from 'lodash/some';\r\nimport sortBy from 'lodash/sortBy';\r\nimport AgentService from '../../utilities/AgentService.js';\r\nimport TypeAhead from '../common/typeahead.jsx';\r\n\r\nvar AgentForm = createReactClass({\r\n propTypes: {\r\n isWebAdminUser: PropTypes.bool,\r\n isAgentBooking: PropTypes.bool,\r\n onUpdateIsAgentBooking: PropTypes.func,\r\n agentId: PropTypes.number,\r\n onUpdateAgentId: PropTypes.func,\r\n agentName: PropTypes.string,\r\n onUpdateAgentName: PropTypes.func,\r\n onUpdateAreFinancialsVisibleToCustomer: PropTypes.func,\r\n areFinancialsVisibleToCustomer: PropTypes.bool\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n agentSearchValue: '',\r\n areFinancialsVisibleToCustomerAgentDefault: false\r\n }\r\n },\r\n\r\n doAgentSearch: function (word, callback) {\r\n AgentService.searchAgents(word)\r\n .done(function (response) {\r\n callback(map(response.Items,\r\n function (item) {\r\n return {\r\n Text: item.Organisation.Name,\r\n Agent: item\r\n };\r\n }));\r\n });\r\n },\r\n\r\n agentSearchChange: function(e) {\r\n this.setState({ agentSearchValue: e.target.value });\r\n },\r\n\r\n agentSelectionChange: function (e) {\r\n this.setState({ agentSearchValue: e.Agent.Organisation.Name, areFinancialsVisibleToCustomerAgentDefault: e.Agent.AreFinancialsVisibleToCustomer });\r\n this.props.onUpdateAgentId(e);\r\n },\r\n\r\n agentCreateChange: function (e) {\r\n this.setState({ agentSearchValue: '' });\r\n this.props.onUpdateAgentName(e);\r\n },\r\n\r\n render: function () {\r\n if (this.props.isWebAdminUser) {\r\n var inner = [\r\n
    \r\n \r\n
    ];\r\n\r\n if (this.props.isAgentBooking) {\r\n inner.push(
    \r\n
    \r\n \r\n \r\n \r\n {this.props.agentId && some(this.state.agents, function (agent) {\r\n return agent.AgentId == this.props.agentId && agent.IsUsingCappedAvailabilityModel;\r\n }.bind(this)) ?

    The agent you have selected is on the capped availability model and may have limited or no spaces available for this course

    : false}\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    );\r\n\r\n inner.push(
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Would you like the customer to be able to see the financial details (total fees, invoices, outstanding balance etc)?

    \r\n {!!this.props.agentId ?\r\n (this.props.areFinancialsVisibleToCustomer && !this.state.areFinancialsVisibleToCustomerAgentDefault ?\r\n

    This agent does NOT show financials by default

    : (this.state.areFinancialsVisibleToCustomerAgentDefault ?

    This agent shows financials by default

    :

    This agent does NOT show financials by default

    ))\r\n : false}\r\n \r\n
    \r\n
    );\r\n }\r\n\r\n return
    {inner}
    ;\r\n }\r\n }\r\n});\r\n\r\nexport default AgentForm;\r\n","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport WidgetOptions from '../../utilities/WidgetOptions.js';\r\nimport CustomerForm from './customer-form.jsx';\r\nimport UserStore from '../../stores/UserStore.js';\r\nimport AgentForm from './agent-form.jsx';\r\nimport map from 'lodash/map';\r\nimport isArray from 'lodash/isarray';\r\n\r\nvar CheckoutCustomer = createReactClass({\r\n displayName: 'CheckoutCustomer',\r\n propTypes: {\r\n showCustomerFields: PropTypes.bool,\r\n customer: PropTypes.object,\r\n errorState: PropTypes.object,\r\n onUpdate: PropTypes.func, // called whenever a field is blurred or changed considerably (for validation purposes), not called when text is being input for example\r\n courses: PropTypes.object,\r\n countries: PropTypes.array,\r\n isWebAdminUser: PropTypes.bool,\r\n onUpdateIsOptedInToMarketing: PropTypes.func,\r\n isOptedInToMarketing: PropTypes.bool,\r\n termsAndConditions: PropTypes.array,\r\n hasAcceptedTermsAndConditions: PropTypes.bool,\r\n hasAcceptedPrivacyPolicy: PropTypes.bool,\r\n onUpdateTermsAndConditions: PropTypes.func,\r\n onUpdatePrivacyPolicy: PropTypes.func,\r\n onUpdateOverrideAgeConstraints: PropTypes.func,\r\n hasOverrideAgeConstraints: PropTypes.bool,\r\n isAgentBooking: PropTypes.bool,\r\n onUpdateIsAgentBooking: PropTypes.func,\r\n agentId: PropTypes.number,\r\n onUpdateAgentId: PropTypes.func,\r\n agentName: PropTypes.string,\r\n onUpdateAgentName: PropTypes.func,\r\n onUpdateAreFinancialsVisibleToCustomer: PropTypes.func,\r\n areFinancialsVisibleToCustomer: PropTypes.bool,\r\n skipTermsAndConditions: PropTypes.bool,\r\n skipPrivacyPolicy: PropTypes.bool\r\n },\r\n\r\n getDefaultProps: function () {\r\n var emptyFunction = function() {};\r\n return {\r\n showCustomerFields: true,\r\n hasOverrideAgeConstraints: false,\r\n onUpdateOverrideAgeConstraints: emptyFunction,\r\n isAgentBooking: false,\r\n onUpdateIsAgentBooking: emptyFunction,\r\n agentName: null,\r\n onUpdateAgentName: emptyFunction,\r\n agentId: null,\r\n onUpdateAgentId: emptyFunction,\r\n areFinancialsVisibleToCustomer: true,\r\n onUpdateAreFinancialsVisibleToCustomer: emptyFunction,\r\n skipTermsAndConditions: false,\r\n skipPrivacyPolicy: false\r\n }\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n isPotentialAlumni: document.cookie.match(/^(.*;)?\\s*AlumniDiscount\\s*=\\s*[^;]+(.*)?$/)\r\n }\r\n },\r\n\r\n updateTermsAndConditions: function (e) {\r\n this.props.onUpdateTermsAndConditions(e.target.checked);\r\n },\r\n\r\n updatePrivacyPolicy: function(e) {\r\n this.props.onUpdatePrivacyPolicy(e.target.checked);\r\n },\r\n\r\n render: function () {\r\n var marketing = (\r\n
    \r\n \r\n
    \r\n );\r\n\r\n var termsAndConditions = false;\r\n var privacyPolicy = false;\r\n if (!this.props.isWebAdminUser && !this.props.agentId) {\r\n if (this.props.termsAndConditions === false) {\r\n termsAndConditions = (\r\n
    \r\n
    \r\n Calculating applicable terms and conditions ...\r\n
    \r\n
    \r\n );\r\n } else {\r\n var links = map(this.props.termsAndConditions, function (termsAndConditionsDocument, idx) {\r\n var url = WidgetOptions.apiEndpoint() + '/TermsAndConditions/' + termsAndConditionsDocument.DocumentId;\r\n var joinText = idx === this.props.termsAndConditions.length - 1 ? '' : ' and the ';\r\n return {termsAndConditionsDocument.Name}{joinText};\r\n }.bind(this));\r\n \r\n\r\n var validation = this.props.errorState\r\n && this.props.errorState.termsAndConditionsState\r\n && this.props.errorState.termsAndConditionsState === 'invalid'\r\n ?
    {isArray(this.props.errorState.termsAndConditionsErrors) ? (this.props.errorState.termsAndConditionsErrors.length ? this.props.errorState.termsAndConditionsErrors[0] : '') : this.props.errorState.termsAndConditionsErrors}
    \r\n : false;\r\n if (!this.props.skipPrivacyPolicy) {\r\n privacyPolicy =(\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n \r\n if (links.length && !this.props.skipTermsAndConditions) {\r\n termsAndConditions = (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n }\r\n }\r\n\r\n var thirdParty = [];\r\n if (this.props.isWebAdminUser) {\r\n thirdParty.push(\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n if (this.props.isWebAdminUser) {\r\n thirdParty.push();\r\n } else if (this.props.agentId) {\r\n //TODO - make this a component\r\n thirdParty.push(\r\n
    \r\n \r\n
    );\r\n }\r\n \r\n var alumniMessage = \"It looks like you've booked with us before. Your Alumni discount will be applied once you click 'Pay' and will appear in the Portal. Any problems just get in contact with us.\";\r\n\r\n return (\r\n
    \r\n {\r\n this.props.showCustomerFields\r\n ?\r\n
    \r\n
    \r\n

    2. Customer Details

    \r\n
    \r\n
    \r\n : false\r\n }\r\n {this.state.isPotentialAlumni ? (

    {alumniMessage}

    ) : false}\r\n \r\n {\r\n thirdParty.length\r\n ?

    {thirdParty}

    \r\n : false\r\n }\r\n
    \r\n {marketing}\r\n {privacyPolicy}\r\n {termsAndConditions}\r\n
    \r\n
    );\r\n }\r\n});\r\n\r\nexport default CheckoutCustomer;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport map from 'lodash/map';\r\n\r\nvar CardIcons = createReactClass({\r\n render: function () {\r\n var iconNames = [\r\n 'payments-accepts-01.svg', // Visa\r\n 'payments-accepts-02.svg', // MasterCard\r\n 'payments-accepts-03.svg', // Amex\r\n //'payments-accepts-04.svg', // Google Pay\r\n // 'payments-accepts-05.svg' // Apple Pay\r\n ];\r\n\r\n return (\r\n
    \r\n {map(iconNames, function (iconName) {\r\n return (\r\n
    \r\n \r\n
    );\r\n })}\r\n
    \r\n );\r\n }\r\n});\r\n\r\nexport default CardIcons;","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n getAll: function() {\r\n return http.get(options.apiEndpoint() + '/TermsAndConditions');\r\n }\r\n};","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport TermsAndConditionsService from '../utilities/TermsAndConditionsService.js';\r\n\r\nexport default {\r\n getAll: function() {\r\n TermsAndConditionsService.getAll().done(function (termsAndConditions) {\r\n Dispatcher.dispatch({ type: ActionTypes.GET_ALL_TERMS_AND_CONDITIONS, termsAndConditions: termsAndConditions });\r\n }).fail(function () {\r\n Dispatcher.dispatch({ type: ActionTypes.GET_ALL_TERMS_AND_CONDITIONS, termsAndConditions: [] });\r\n });\r\n }\r\n};","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n makeReservation: function (customer, lineItems, isOptingOutOfMarketing, acceptedTermsAndConditions, isOraReservation, overrideAgeConstraints, isAgentBooking, agentId, agentName, financesVisibleToCustomer, sendPaymentEmail, isOnlyPayingDeposit, basketIdentifier) {\r\n var data = {\r\n title: customer.Title,\r\n firstName: customer.FirstName,\r\n lastName: customer.LastName,\r\n email: customer.Email,\r\n mobile: customer.Mobile,\r\n country: customer.Country,\r\n billingAddressLine1: customer.BillingLine1,\r\n billingAddressLine2: customer.BillingLine2,\r\n billingCity: customer.BillingCity,\r\n billingCounty: customer.BillingCounty,\r\n billingCountry: customer.BillingCountry,\r\n billingPostCode : customer.BillingPostcode,\r\n lineItems: lineItems,\r\n acceptedTermsAndConditions: [],\r\n IsOptingOutOfMarketing: isOptingOutOfMarketing,\r\n AcceptedTermsAndConditions: acceptedTermsAndConditions,\r\n IsOraReservation: isOraReservation,\r\n OverrideAgeConstraints: isOraReservation && overrideAgeConstraints,\r\n IsAgentBooking: isAgentBooking,\r\n SendPaymentEmail: sendPaymentEmail,\r\n IsOnlyPayingDeposit: isOnlyPayingDeposit,\r\n BasketIdentifier: basketIdentifier\r\n };\r\n\r\n if (isAgentBooking) {\r\n if (agentId) {\r\n data.AgentId = agentId;\r\n } else {\r\n data.AgentName = agentName;\r\n }\r\n\r\n data.FinancesVisibleToCustomer = financesVisibleToCustomer;\r\n }\r\n\r\n return http.post(options.apiEndpoint() + '/Reservation', data);\r\n },\r\n\r\n completeBooking: function(reservationId, sendPaymentEmail) {\r\n return http.post(options.apiEndpoint() + '/Order', {\r\n Reservation: { ReservationId: reservationId },\r\n SendPaymentEmail: !!sendPaymentEmail,\r\n IsOraOrder: true,\r\n IsDraftOrder: true\r\n });\r\n },\r\n\r\n getPaymentIntent: function (reservationId, paymentIntentId, orderId) {\r\n if (!!orderId) {\r\n return http.get(options.apiEndpoint() + '/Flywire/PaymentIntent?orderId=' + orderId + '&paymentIntentId=' + paymentIntentId);\r\n } else {\r\n return http.get(options.apiEndpoint() + '/Flywire/PaymentIntent?reservationId=' + reservationId + '&paymentIntentId=' + paymentIntentId);\r\n }\r\n },\r\n\r\n createPaymentIntentForOrder: function (orderId, transactionIds) {\r\n return http.post(options.apiEndpoint() + '/Order/' + orderId + '/PaymentIntent',\r\n {\r\n Ids: transactionIds\r\n });\r\n }\r\n};","import Dispatcher from '../utilities/OraDispatcher.js';\r\nimport { ActionTypes } from '../constants/Constants.js';\r\nimport BasketStore from '../stores/BasketStore.js';\r\nimport BookingService from '../utilities/BookingService.js';\r\nimport map from 'lodash/map';\r\nimport partial from 'lodash/partial';\r\nimport moment from 'moment';\r\nimport { DATE_FORMAT } from '../constants/Constants.js';\r\n\r\nfunction makeReservation(isOptingOutOfMarketing, isOraReservation, overrideAgeConstraints, isAgentBooking, agentId, agentName, financesVisibleToCustomer, sendPaymentEmail, isOnlyPayingDeposit) {\r\n var basketIdentifier = BasketStore.getBasketIdentifier();\r\n return BookingService.makeReservation(BasketStore.getCustomer(),\r\n map(BasketStore.getCourses(), function(course) {\r\n var courseCopy = JSON.parse(JSON.stringify(course)); // create a copy as we're manipulating to send\r\n var dateOfBirth = course.Student.DateOfBirth;\r\n if (typeof dateOfBirth === 'string') {\r\n dateOfBirth = moment.utc(dateOfBirth, [moment.ISO_8601, DATE_FORMAT]);\r\n }\r\n\r\n courseCopy.Student.DateOfBirth = dateOfBirth.format('YYYY-MM-DDT00:00:00');\r\n return courseCopy;\r\n }),\r\n isOptingOutOfMarketing,\r\n map(BasketStore.getApplicableTermsAndConditions(), 'DocumentId'),\r\n isOraReservation,\r\n overrideAgeConstraints,\r\n isAgentBooking,\r\n agentId,\r\n agentName,\r\n financesVisibleToCustomer,\r\n sendPaymentEmail,\r\n isOnlyPayingDeposit,\r\n basketIdentifier);\r\n}\r\n\r\nfunction checkoutError(response, actionType) {\r\n var responseJson = response.responseJSON;\r\n if (!responseJson) {\r\n try {\r\n responseJson = jQuery.parseJSON(response.responseText);\r\n } catch (e) {\r\n responseJson = { Message: 'There was an unknown error: ' + response.responseText };\r\n }\r\n }\r\n Dispatcher.dispatch({\r\n type: actionType,\r\n response: responseJson\r\n });\r\n}\r\n\r\nfunction reservationError(response) {\r\n checkoutError(response, ActionTypes.MAKE_RESERVATION_FAILURE);\r\n}\r\n\r\nvar pollingStart;\r\n\r\nfunction beginPollPaymentStatus(paymentIntentId, orderId) {\r\n setTimeout(function () {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.POLL_PAYMENT_START\r\n });\r\n }, 1000);\r\n\r\n pollingStart = new Date();\r\n pollPaymentStatus(paymentIntentId, orderId);\r\n}\r\n\r\nfunction pollPaymentStatus(paymentIntentId, orderId) {\r\n var reservation = BasketStore.getReservation();\r\n var reservationId = reservation ? reservation.ReservationId : null;\r\n\r\n BookingService.getPaymentIntent(reservationId, paymentIntentId, orderId).done(function (response) {\r\n // success or failure response\r\n // - if the user comes back to this page and they've paid successfully, we want them to be able to continue regardless of whether we're checking the correct attempt.\r\n // - if the payment has failed, we want to ensure that we are checking the current attempt.\r\n if (response.Status === 2 || (response.Status === 3)) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.POLL_PAYMENT_FINISHED,\r\n paymentStatus: response.Status,\r\n paymentFailureReason: response.Error,\r\n redirectUri: response.RedirectUri,\r\n order: response.Order\r\n });\r\n } else if ((new Date() - pollingStart) > 1000 * 60 * 30) { // Poll for 30 mins\r\n Dispatcher.dispatch({\r\n type: ActionTypes.POLL_PAYMENT_FINISHED,\r\n paymentStatus: 3,\r\n paymentFailureReason: 'Payment timed out waiting from a response from Flywire',\r\n redirectUri: null,\r\n order: null\r\n });\r\n } else {\r\n setTimeout(partial(pollPaymentStatus, paymentIntentId, orderId), 2000);\r\n }\r\n });\r\n}\r\n\r\nexport default {\r\n makeReservation: function(isOptingOutOfMarketing,\r\n isOraReservation,\r\n overrideAgeConstraints,\r\n isAgentBooking,\r\n agentId,\r\n agentName,\r\n financesVisibleToCustomer,\r\n doPay,\r\n isOnlyPayingDeposit) {\r\n // issue the request to the api for making a reservation\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_RESERVATION_STARTED\r\n });\r\n\r\n makeReservation(isOptingOutOfMarketing,\r\n isOraReservation,\r\n overrideAgeConstraints,\r\n isAgentBooking,\r\n agentId,\r\n agentName,\r\n financesVisibleToCustomer,\r\n null,\r\n isOnlyPayingDeposit)\r\n .done(function(reservation) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_RESERVATION_SUCCESS,\r\n reservation: reservation,\r\n makePayment: doPay\r\n });\r\n })\r\n .fail(reservationError);\r\n },\r\n\r\n confirmBooking: function(isOptingOutOfMarketing,\r\n isOraReservation,\r\n overrideAgeConstraints,\r\n isAgentBooking,\r\n agentId,\r\n agentName,\r\n financesVisibleToCustomer,\r\n sendPaymentEmail,\r\n bookingCompleteUrl) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_RESERVATION_STARTED\r\n });\r\n\r\n makeReservation(isOptingOutOfMarketing,\r\n isOraReservation,\r\n overrideAgeConstraints,\r\n isAgentBooking,\r\n agentId,\r\n agentName,\r\n financesVisibleToCustomer)\r\n .done(function(reservation) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_BOOKING_STARTED\r\n });\r\n\r\n // make the order\r\n BookingService.completeBooking(reservation.ReservationId, sendPaymentEmail).done(\r\n function(orderResponse) {\r\n if (orderResponse.WasSuccessful) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_BOOKING_SUCCESS\r\n });\r\n if (confirm('The order has been made. Would you like to view the order?') &&\r\n bookingCompleteUrl) {\r\n location.assign(bookingCompleteUrl + \"/\" + orderResponse.Order.OrderId);\r\n }\r\n } else {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_RESERVATION_FAILURE,\r\n response: { Message: 'The reservation was successful but the booking failed' }\r\n });\r\n }\r\n }).fail(function() {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.MAKE_RESERVATION_FAILURE,\r\n response: { Message: 'The reservation was successful but the booking failed' }\r\n });\r\n });\r\n })\r\n .fail(reservationError);\r\n },\r\n\r\n beginPolling: function (paymentIntentId, orderId) {\r\n if (paymentIntentId === null) {\r\n paymentIntentId = BasketStore.getPaymentIntentId();\r\n }\r\n\r\n beginPollPaymentStatus(paymentIntentId, orderId);\r\n },\r\n\r\n createPaymentIntentForOrder: function(orderId, transactionIds) {\r\n if (orderId !== null) {\r\n BookingService.createPaymentIntentForOrder(orderId, transactionIds).done(function(orderResponse) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.CREATE_PAYMENT_INTENT_SUCCESS,\r\n paymentIntentId: orderResponse.PaymentIntentId\r\n });\r\n });\r\n }\r\n }\r\n};","\r\nfunction invalid(object, key, errorMessage, errorObject, fieldNameOverride) {\r\n errorObject[key + 'State'] = 'invalid';\r\n var error = errorMessage || 'The ' + (!!fieldNameOverride ? fieldNameOverride : key) + ' is required';\r\n if (!errorObject[key + 'Errors']) {\r\n errorObject[key + 'Errors'] = [];\r\n }\r\n\r\n errorObject[key + 'Errors'].push(error);\r\n}\r\n\r\nexport default {\r\n required: function (object, key, errorMessage, errorObject, fieldNameOverride) {\r\n if (!object.hasOwnProperty(key) || !object[key]) {\r\n invalid(object, key, errorMessage, errorObject, fieldNameOverride);\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n invalid: invalid\r\n};","import isEmail from 'validator/es/lib/isEmail';\r\nimport trim from 'validator/es/lib/trim';\r\nimport normalizeEmail from 'validator/es/lib/normalizeEmail';\r\nimport common from './Common.js';\r\n\r\n// validates a student object, adding state variables and error messages where necessary\r\n// returns an array of error messages\r\n// indicating that an empty array indicates a valid student\r\nexport default function (customer, billingOnly) {\r\n // sanitisation\r\n var email = customer.Email && isEmail(trim(customer.Email)) ? normalizeEmail(trim(customer.Email), { remove_dots: false }) : customer.Email;\r\n var confirmEmail = customer.ConfirmEmail && isEmail(trim(customer.ConfirmEmail)) ? normalizeEmail(trim(customer.ConfirmEmail), { remove_dots: false }) : customer.ConfirmEmail;\r\n\r\n // errors\r\n var errorObject = {};\r\n if (!billingOnly) {\r\n common.required(customer, 'FirstName', 'The first name is required', errorObject);\r\n common.required(customer, 'LastName', 'The last name is required', errorObject);\r\n common.required(customer, 'Email', 'The email is required', errorObject);\r\n if (!isEmail(email)) {\r\n common.invalid(customer, 'Email', 'The email is not valid', errorObject);\r\n }\r\n\r\n common.required(customer, 'ConfirmEmail', 'The email confirmation is required', errorObject);\r\n if (email != confirmEmail) {\r\n common.invalid(customer, 'ConfirmEmail', 'The email confirmation does not match', errorObject);\r\n }\r\n\r\n common.required(customer, 'Mobile', 'The mobile number is required', errorObject);\r\n }\r\n\r\n common.required(customer, 'BillingLine1', '', errorObject, 'first line of the billing address');\r\n common.required(customer, 'BillingCity', '', errorObject, 'billing city');\r\n common.required(customer, 'BillingCountry', '', errorObject, 'billing country');\r\n\r\n return errorObject;\r\n};","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport CheckoutPay from '../checkout/checkout-pay.jsx';\r\nimport CheckoutCustomer from '../checkout/checkout-customer.jsx';\r\nimport CardIcons from '../checkout/card-icons.jsx';\r\nimport Loading from '../common/loading.jsx';\r\nimport NavigationButtons from './navigation-buttons.jsx';\r\nimport TermsAndConditionsCreators from '../../actions/TermsAndConditionsCreators.js';\r\nimport CheckoutActionCreators from '../../actions/CheckoutActionCreators.js';\r\nimport AdManagerService from '../../utilities/AdManagerService.js';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport CustomerValidator from '../../validators/Customer.js';\r\nimport Ui from '../../utilities/Ui.js';\r\nimport isEmpty from 'lodash/isEmpty';\r\n\r\nvar Billing = createReactClass({\r\n displayName: 'Billing',\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n \r\n getInitialState: function () {\r\n return {\r\n customer: BasketStore.getCustomer(),\r\n courses: BasketStore.getCourses(),\r\n countries: BasketStore.getCountries(),\r\n discounts: BasketStore.getDiscounts(),\r\n isCustomerFormValidationEnabled: false,\r\n customerErrors: {},\r\n hasCompletedForm: false,\r\n isReserving: BasketStore.isReserving(),\r\n reservationFailureResponse: BasketStore.getReservationFailureResponse(),\r\n reservation: BasketStore.getReservation(),\r\n hasAcceptedTermsAndConditions: false,\r\n hasAcceptedPrivacyPolicy: false,\r\n termsAndConditions: BasketStore.getApplicableTermsAndConditions(),\r\n bookingCompleteUrl: this.props.bookingCompleteUrl,\r\n isOptedInToMarketing: false\r\n };\r\n },\r\n\r\n componentDidMount: function () {\r\n BasketStore.addChangeListener(this.changeBasket);\r\n TermsAndConditionsCreators.getAll();\r\n\r\n var totals = BasketStore.getBasketTotals();\r\n var total = totals.totalIncludingBasketDiscounts;\r\n var applyTotalDiscount = totals.deposit > 0 && totals.deposit < total && global.OraWidgets.Options.payTotalDiscount > 0;\r\n var discount = 0;\r\n if (applyTotalDiscount) {\r\n discount = Number(Math.round(total * global.OraWidgets.Options.payTotalDiscount) + 'e-2');\r\n total -= discount;\r\n }\r\n\r\n AdManagerService.beginCheckoutTag(total, this.state.courses);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n BasketStore.removeChangeListener(this.changeBasket);\r\n },\r\n\r\n changeBasket: function () {\r\n var reservationFailureResponse = BasketStore.getReservationFailureResponse();\r\n var reservation = BasketStore.getReservation();\r\n\r\n var data = {\r\n customer: BasketStore.getCustomer(),\r\n courses: BasketStore.getCourses(),\r\n countries: BasketStore.getCountries(),\r\n discounts: BasketStore.getDiscounts(),\r\n isReserving: BasketStore.isReserving(),\r\n reservationFailureResponse: reservationFailureResponse,\r\n reservation: reservation,\r\n termsAndConditions: BasketStore.getApplicableTermsAndConditions()\r\n };\r\n\r\n if (!this.state.reservationFailureResponse && reservationFailureResponse) {\r\n data.currentStage = this.stages[2];\r\n }\r\n\r\n this.setState(data);\r\n },\r\n\r\n onUpdateTermsAndConditions: function (confirmed) {\r\n this.setState({ hasAcceptedTermsAndConditions: confirmed }, this.onUpdate);\r\n },\r\n\r\n onUpdatePrivacyPolicy: function (confirmed) {\r\n this.setState({ hasAcceptedPrivacyPolicy: confirmed }, this.onUpdate);\r\n },\r\n\r\n onUpdateIsOptedInToMarketing: function (e) {\r\n this.setState({ isOptedInToMarketing: e.target.checked });\r\n },\r\n\r\n payDeposit: function () {\r\n this.reserve(true, true);\r\n },\r\n\r\n payTotal: function () {\r\n this.reserve(false, true);\r\n },\r\n\r\n reserve: function (deposit, doPay) {\r\n if (!this.isValid()) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n hasClickedPay: true\r\n });\r\n\r\n CheckoutActionCreators.makeReservation(!this.state.isOptedInToMarketing, this.state.isWebAdminUser, this.state.hasOverrideAgeConstraints, this.state.isAgentBooking || !!this.props.agentId, this.state.agentId !== null ? this.state.agentId : this.props.agentId, this.state.agentName, this.state.areFinancialsVisibleToCustomer, doPay, deposit);\r\n this.props.wizard.set({ PaymentError: false, hasClickedPayDeposit: deposit });\r\n this.props.wizard.nextQuestion();\r\n },\r\n\r\n getErrorMessage: function () {\r\n var errorMessage = false;\r\n if (this.state.reservationFailureResponse) {\r\n errorMessage = this.state.reservationFailureResponse.Message;\r\n } else if (this.state.termsAndConditions === false\r\n && this.state.hasClickedPay) {\r\n errorMessage = \"Apologies, we've been unable to download the terms and conditions. Please refresh the page to try again; your data has been saved.\";\r\n } else if ((((this.state.termsAndConditions === false\r\n || (this.state.termsAndConditions.length\r\n && !this.state.hasAcceptedTermsAndConditions)))\r\n || (!this.state.hasAcceptedPrivacyPolicy))\r\n && this.state.hasClickedPay) {\r\n errorMessage = \"Please indicate that you have accepted the Terms and Conditions and the Privacy Policy\";\r\n } else if (this.state.hasPaymentFailed) {\r\n errorMessage = this.state.paymentFailureReason;\r\n } else if (this.props.wizard.state.PaymentError) {\r\n errorMessage = this.props.wizard.state.PaymentError;\r\n }\r\n\r\n var errorContainer = errorMessage ?
    {errorMessage}
    : false;\r\n\r\n return errorContainer;\r\n },\r\n\r\n contactUs: function() {\r\n if (global.$zopim) {\r\n global.$zopim.livechat.window.show();\r\n } else {\r\n global.location.assign('https://www.oxford-royale.com/contact-us/');\r\n }\r\n },\r\n\r\n render: function () {\r\n if (!this.state.countries.length) {\r\n return ;\r\n }\r\n\r\n var wizard = this.props.wizard;\r\n var is3rdPerson = wizard.state.IsUserCustomer;\r\n // TODO DRY THIS UP\r\n var totals = BasketStore.getBasketTotals();\r\n var total = totals.totalIncludingBasketDiscounts;\r\n var applyTotalDiscount = totals.deposit > 0 && totals.deposit < total && global.OraWidgets.Options.payTotalDiscount > 0;\r\n var discount = 0;\r\n if (applyTotalDiscount) {\r\n discount = Number(Math.round(total * global.OraWidgets.Options.payTotalDiscount) + 'e-2');\r\n total -= discount;\r\n }\r\n\r\n var errorMessage = this.getErrorMessage();\r\n return
    \r\n

    Reserve and Pay

    \r\n {errorMessage}\r\n

    Please enter your billing address in order to start your payment

    \r\n \r\n\r\n \r\n \r\n \r\n\r\n {applyTotalDiscount\r\n ?

    Pay in full now for a saving of GBP {Ui.maybeFormat2Dp(discount.toFixed(2))}

    \r\n : false\r\n }\r\n

    \r\n Prefer to pay by Bank Transfer or another payment method? Click to Contact Us\r\n

    \r\n\r\n
    \r\n
    ;\r\n },\r\n\r\n onUpdate: function () {\r\n if (this.state.isCustomerFormValidationEnabled) {\r\n this.isValid();\r\n }\r\n },\r\n\r\n isValid: function() {\r\n // if validation isn't enabled, it is now\r\n if (!this.state.isCustomerFormValidationEnabled) {\r\n this.setState({ isCustomerFormValidationEnabled: true });\r\n }\r\n\r\n //validate\r\n var customerErrorState = CustomerValidator(this.state.customer, true);\r\n if (!this.state.isWebAdminUser\r\n && !this.props.agentId\r\n && ((!this.props.skipTermsAndConditions\r\n && (this.state.termsAndConditions === false || (this.state.termsAndConditions.length && !this.state.hasAcceptedTermsAndConditions)))\r\n || (!this.props.skipPrivacyPolicy && !this.state.hasAcceptedPrivacyPolicy))) {\r\n customerErrorState.termsAndConditionsState = 'invalid';\r\n customerErrorState.termsAndConditionsErrors = 'Please indicate that you have accepted the Terms and Conditions and the Privacy Policy';\r\n }\r\n\r\n // update our state\r\n if (!isEmpty(customerErrorState) || !isEmpty(this.state.customerErrors)) {\r\n this.setState({ customerErrors: customerErrorState });\r\n }\r\n\r\n return isEmpty(customerErrorState);\r\n }\r\n});\r\n\r\nexport default Billing;\r\n","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport partial from 'lodash/partial';\r\nimport ActionCreators from '../../actions/CheckoutActionCreators.js';\r\nimport map from 'lodash/map';\r\nimport Loading from '../common/loading.jsx';\r\n\r\nvar FlyWireForm = createReactClass({\r\n propTypes: {\r\n destination: PropTypes.string,\r\n country: PropTypes.string,\r\n amountToPay: PropTypes.number,\r\n firstName: PropTypes.string,\r\n lastName: PropTypes.string,\r\n email: PropTypes.string,\r\n mobile: PropTypes.string,\r\n studentFirstName: PropTypes.string,\r\n studentLastName: PropTypes.string,\r\n handleBasketChanged: PropTypes.func,\r\n billingLine1: PropTypes.string,\r\n billingLine2: PropTypes.string,\r\n billingCity: PropTypes.string,\r\n billingCounty: PropTypes.string,\r\n billingPostCode: PropTypes.string,\r\n callbackId: PropTypes.string,\r\n orderId: PropTypes.number,\r\n shouldCloseModal: PropTypes.bool,\r\n flywireModalClosedHandler: PropTypes.func,\r\n onInvalidInput: PropTypes.func\r\n },\r\n\r\n getDefaultProps: function() {\r\n return {\r\n destination: global.OraWidgets.Options.defaultFlywireDestination,\r\n country: 'GB',\r\n billingLine1: '',\r\n billingLine2: '',\r\n billingCity: '',\r\n billingCounty: '',\r\n billingPostCode: '',\r\n shouldCloseModal: false,\r\n isDraftOrder: false,\r\n onInvalidInput: function() {}\r\n };\r\n },\r\n\r\n getInitialState: function() {\r\n return {\r\n flywireModal: {},\r\n showPollingMessage: false,\r\n showPendingMessage: false,\r\n showErrorMessage: false\r\n };\r\n },\r\n\r\n componentDidMount: function() {\r\n this.initFlywire();\r\n this.tryShowPaymentInstructions();\r\n },\r\n\r\n removeCountdownTimers: function (parentElement) {\r\n var topLevelElement = !!parentElement ? parentElement : document;\r\n\r\n // remove the countdown timer(s)\r\n var countdownElements = topLevelElement.getElementsByClassName('payment-instructions');\r\n\r\n if (countdownElements.length < 1) {\r\n return;\r\n }\r\n\r\n // remove elements in reverse\r\n for (var i = countdownElements.length - 1; i >= 0; i--) {\r\n countdownElements[i].remove();\r\n }\r\n },\r\n\r\n closeFlywireModal: function () {\r\n this.removeCountdownTimers();\r\n // finally close the modal\r\n this.state.flywireModal.close(function() {}); // flywire has asked us to pass an empty function for now\r\n },\r\n\r\n shouldComponentUpdate: function(nextProps, nextState) {\r\n if (!this.props.shouldCloseModal && nextProps.shouldCloseModal) {\r\n this.closeFlywireModal();\r\n }\r\n\r\n return true;\r\n },\r\n\r\n onPaymentComplete: function (args) { //TODO: maybe move this to the parent component(s) if we need to add \"rejected\"/\"cancelled\" messages, or to let them handle the success messages?\r\n if (args.status === 'success') {\r\n ActionCreators.beginPolling(this.props.callbackId, this.props.orderId); // this will forward us on as necessary at the end\r\n this.setState({ showPollingMessage: true });\r\n } else if (args.status === 'pending') {\r\n this.setState({ showPendingMessage: true });\r\n } else {\r\n this.setState({ showErrorMessage: true });\r\n }\r\n },\r\n\r\n onInvalidInput: function(errors) {\r\n this.closeFlywireModal();\r\n this.props.onInvalidInput(errors);\r\n },\r\n\r\n initFlywire: function() {\r\n var flywireModal = global.FlywirePayment.initiate({\r\n env: global.OraWidgets.Options.paymentEnvironment,\r\n recipientCode: this.props.destination,\r\n amount: (this.props.amountToPay / 100),\r\n country: this.props.country,\r\n address: this.props.billingLine1,\r\n city: this.props.billingCity,\r\n email: this.props.email,\r\n firstName: this.props.firstName,\r\n lastName: this.props.lastName,\r\n phone: this.props.mobile,\r\n callbackUrl: global.OraWidgets.Options.callBackUrl,\r\n callbackId: this.props.callbackId,\r\n read_only: \"amount\",\r\n //theme: {\r\n // brandColor: \"#3498db\",\r\n // chat: false,\r\n // footer: false\r\n //}\r\n recipientFields: {\r\n web_admin_payment_id: this.props.callbackId\r\n },\r\n onCompleteCallback: this.onPaymentComplete,\r\n onCancel: this.props.flywireModalClosedHandler,\r\n onInvalidInput: this.onInvalidInput\r\n });\r\n\r\n this.setState({ flywireModal: flywireModal });\r\n\r\n flywireModal.render();\r\n },\r\n\r\n tryShowPaymentInstructions: function () {\r\n var flywireForm = this;\r\n\r\n window.setTimeout(function () {\r\n var elements = document.getElementsByName('fwp.window');\r\n var iframe;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].nodeName === 'IFRAME') {\r\n iframe = elements[i];\r\n break;\r\n }\r\n }\r\n\r\n if (!iframe) {\r\n return;\r\n }\r\n\r\n // remove existing countdown elements\r\n flywireForm.removeCountdownTimers(iframe.parentElement);\r\n\r\n var countdownElements = document.getElementsByClassName('payment-instructions');\r\n\r\n if (countdownElements.length < 1) {\r\n return;\r\n }\r\n\r\n iframe.parentElement.prepend(countdownElements[0]);\r\n }, 3000);\r\n },\r\n\r\n render: function () {\r\n if (!this.props.callbackId) {\r\n return false;\r\n }\r\n\r\n if (this.state.showPollingMessage) {\r\n return
    ;\r\n }\r\n\r\n var title, text;\r\n if (this.state.showPendingMessage) {\r\n title = global.OraWidgets.Options.flywirePendingMessageTitle;\r\n text = global.OraWidgets.Options.flywirePendingMessageText;\r\n } else if (this.state.showErrorMessage) {\r\n title = global.OraWidgets.Options.flywireErrorMessageTitle;\r\n text = global.OraWidgets.Options.flywireErrorMessageText;\r\n }\r\n\r\n return (\r\n
    {!!title ?\r\n
    \r\n

    {title}

    \r\n {!!text && text.length ? (\r\n
    \r\n
    \r\n {map(text, function (message) {\r\n return

    {message}

    ;\r\n })}\r\n
    ) : false}\r\n {this.state.showErrorMessage ?

    Alternatively, refresh the page to try the payment again

    : false}\r\n
    \r\n : false}\r\n
    \r\n);\r\n}\r\n});\r\n\r\nexport default FlyWireForm;","import BasketStore from '../../stores/BasketStore.js';\r\nimport ActionCreators from '../../actions/CheckoutActionCreators.js';\r\nimport AdManagerService from '../../utilities/AdManagerService.js';\r\nimport scrollToElement from 'scroll-to-element';\r\n\r\nexport default {\r\n returnToStepBeforePayment: function (errorMessage) {\r\n this.setState({\r\n fatalPaymentError: errorMessage\r\n });\r\n\r\n this.previous();\r\n },\r\n\r\n scrollToTop: function (refParam) {\r\n if (!!refParam) {\r\n scrollToElement('body');\r\n }\r\n },\r\n\r\n handleBasketChangedFlywire: function () {\r\n // seems unnecessary given that checkout.jsx has a changeBasket as well\r\n var countries = BasketStore.getCountries();\r\n if (countries !== this.state.countries) {\r\n this.setState({ countries: countries });\r\n }\r\n \r\n var paymentIntentId = BasketStore.getPaymentIntentId();\r\n if (paymentIntentId !== this.state.callbackId) {\r\n this.setState({ callbackId: paymentIntentId });\r\n }\r\n\r\n if (BasketStore.hasPaymentIntentPollingStarted()) {\r\n if (BasketStore.isPaymentIntentCreated()) {\r\n this.setState({\r\n isPollingPayment: true,\r\n hasPaymentSucceeded: false,\r\n hasPaymentFailed: false\r\n });\r\n } else if (BasketStore.isPaymentIntentSucceeded()) {\r\n this.setState({\r\n isPollingPayment: false,\r\n hasPaymentSucceeded: true\r\n });\r\n\r\n if (!!this.stages && this.stages.length) {\r\n this.setState({\r\n currentStage: this.stages[4]\r\n });\r\n }\r\n\r\n // redirect\r\n var order = BasketStore.getOrder();\r\n var redirectUri = BasketStore.getRedirectUri();\r\n if (order.HasTriggeredAnalyticsPurchaseEvent) {\r\n global.location.href = redirectUri;\r\n } else {\r\n AdManagerService.purchaseTag(order, redirectUri);\r\n }\r\n } else if (BasketStore.isPaymentIntentFailed()) {\r\n var failureReason = BasketStore.getPaymentIntentFailureReason();\r\n this.setState({\r\n isPollingPayment: false,\r\n hasPaymentFailed: true,\r\n paymentFailureReason: failureReason\r\n });\r\n\r\n this.onPaymentCancelled();\r\n }\r\n }\r\n },\r\n\r\n onPaymentCancelled: function () { } // gets overridden in derived classes\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport createReactClass from 'create-react-class';\r\nimport moment from 'moment';\r\n\r\nvar secondsInOneMinute = 60;\r\n\r\nvar Timer = createReactClass({\r\n propTypes: {\r\n expiryTime: PropTypes.object,\r\n onCountdownComplete: PropTypes.func\r\n },\r\n\r\n getInitialState: function () {\r\n return {\r\n secondsRemaining: this.getRemainingSeconds()\r\n };\r\n },\r\n\r\n getRemainingSeconds: function() {\r\n return moment(this.props.expiryTime).diff(moment.utc(), 'seconds');\r\n },\r\n\r\n componentDidMount: function () {\r\n this.timerId = setInterval(this.countDown, 1000);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n clearInterval(this.timerId);\r\n },\r\n \r\n countDown: function() {\r\n // Remove one second, set state so a re-render happens.\r\n var seconds = this.getRemainingSeconds();\r\n this.setState({\r\n secondsRemaining: seconds\r\n });\r\n\r\n // Check if we're at zero.\r\n if (seconds <= 0) {\r\n this.props.onCountdownComplete();\r\n }\r\n },\r\n\r\n render: function () {\r\n var classes = 'countdown-timer' + (this.state.secondsRemaining < secondsInOneMinute ? ' timer-danger' : '');\r\n var secsPart = this.state.secondsRemaining % secondsInOneMinute;\r\n var minsPart = (this.state.secondsRemaining - secsPart) / secondsInOneMinute;\r\n \r\n return (\r\n {minsPart + ' minute' + (minsPart !== 1 ? 's' : '') + ' and ' + secsPart + ' second' + (secsPart !== 1 ? 's' : '')}\r\n );\r\n }\r\n});\r\n\r\nexport default Timer;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport Loading from '../common/loading.jsx';\r\nimport TermsAndConditionsCreators from '../../actions/TermsAndConditionsCreators.js';\r\nimport FlywireForm from '../flywire/flywire-form.jsx';\r\nimport baseFlywireContainer from '../common/BaseCheckoutFlywireContainer.js';\r\nimport CountdownTimer from '../flywire/countdown-timer.jsx';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\nimport assign from 'lodash/assign';\r\n\r\nvar Flywire = createReactClass(assign({}, baseFlywireContainer, {\r\n displayName: 'Flywire',\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n \r\n getInitialState: function () {\r\n return {\r\n customer: BasketStore.getCustomer(),\r\n isReserving: BasketStore.isReserving(),\r\n reservationFailureResponse: BasketStore.getReservationFailureResponse(),\r\n reservation: BasketStore.getReservation(),\r\n bookingCompleteUrl: this.props.bookingCompleteUrl,\r\n \r\n isPollingPayment: false,\r\n hasPaymentSucceeded: false,\r\n hasPaymentFailed: false,\r\n fatalPaymentError: false,\r\n\r\n hasClickedSendPayment: false,\r\n\r\n shouldClosePaymentModal: false\r\n };\r\n },\r\n\r\n returnToStepBeforePayment: function (errorMessage) {\r\n this.props.wizard.set({ PaymentError: errorMessage });\r\n this.props.wizard.previousQuestion();\r\n },\r\n\r\n onCountdownComplete: function () {\r\n this.setState({ shouldClosePaymentModal: true });\r\n this.returnToStepBeforePayment('Your reservation has expired. Please try again.');\r\n },\r\n\r\n onPaymentCancelled: function() {\r\n this.props.wizard.previousQuestion();\r\n },\r\n\r\n onInvalidInput: function (errors) {\r\n if (!errors || !errors.length) {\r\n errors = [{ msg: 'There was an unexpected error. Please refresh the page and try again' }];\r\n }\r\n\r\n this.props.wizard.set({ PaymentError: errors[0].msg });\r\n this.props.wizard.previousQuestion();\r\n },\r\n\r\n componentWillMount: function() {\r\n if (!this.state.isReserving && !this.state.reservation) {\r\n this.props.wizard.previousQuestion();\r\n }\r\n },\r\n\r\n componentDidMount: function () {\r\n BasketStore.addChangeListener(this.changeBasket);\r\n BasketStore.addChangeListener(this.handleBasketChangedFlywire);\r\n TermsAndConditionsCreators.getAll();\r\n },\r\n\r\n componentWillUnmount: function () {\r\n BasketStore.removeChangeListener(this.changeBasket);\r\n BasketStore.removeChangeListener(this.handleBasketChangedFlywire);\r\n },\r\n\r\n changeBasket: function () {\r\n var reservationFailureResponse = BasketStore.getReservationFailureResponse();\r\n var reservation = BasketStore.getReservation();\r\n\r\n var data = {\r\n customer: BasketStore.getCustomer(),\r\n isReserving: BasketStore.isReserving(),\r\n reservationFailureResponse: reservationFailureResponse,\r\n reservation: reservation\r\n };\r\n\r\n if (!this.state.reservationFailureResponse && reservationFailureResponse) {\r\n this.props.wizard.previousQuestion();\r\n }\r\n\r\n this.setState(data);\r\n },\r\n \r\n render: function () {\r\n if (!this.state.isReserving && !this.state.reservation) {\r\n // happens when the state is reserialized from localstorage\r\n // our componentWillMount takes us back to the previous question but the render still executes\r\n return
    ;\r\n }\r\n\r\n if (this.state.hasPaymentSucceeded) {\r\n return ;\r\n }\r\n\r\n if (this.state.isPollingPayment) {\r\n return ;\r\n }\r\n\r\n if (this.state.isReserving) {\r\n return ;\r\n }\r\n\r\n var timer = ;\r\n var amountToPay = this.props.wizard.state.hasClickedPayDeposit\r\n ? this.state.reservation.Deposit\r\n : this.state.reservation.Total;\r\n\r\n return
    \r\n
    \r\n
    \r\n {timer &&

    Reservation held for: {timer}

    }\r\n
    \r\n \r\n
    \r\n
    ;\r\n },\r\n\r\n isValid: function() {\r\n return true;\r\n }\r\n}));\r\n\r\nexport default Flywire;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport CourseStore from '../../stores/CourseStore';\r\nimport NavigationButtons from './navigation-buttons';\r\n\r\nvar NoCoursesAvailable = createReactClass({ \r\n displayName: 'NoCoursesAvailable',\r\n getInitialState: function() {\r\n return { courses: CourseStore.getCourses() }\r\n },\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n \r\n render: function() {\r\n var wizard = this.props.wizard;\r\n \r\n var studentAgeNow = moment().diff(wizard.state.Student.DateOfBirth, 'years');\r\n\r\n // var isAfterSeptember = moment.utc().month() >= 8;\r\n // var studentAgeInSummer =\r\n // isAfterSeptember \r\n // ? moment([moment.utc().year() + 1, 7, 1]).diff(wizard.state.Student.DateOfBirth, 'years')\r\n // : moment([moment.utc().year(), 7, 1]).diff(wizard.state.Student.DateOfBirth, 'years');\r\n\r\n const lowerAgeBound = 14;\r\n const upperAgeBound = 18;\r\n return
    \r\n\r\n

    Unfortunately we are not currently offering courses for students aged {studentAgeNow}.

    \r\n\r\n {studentAgeNow >= 25 \r\n ?

    \r\n Please check you've entered the right details for the student who will be attending the course.\r\n You can go back and change their details if required.\r\n

    \r\n : false}\r\n \r\n

    \r\n We currently offer a variety of courses for students aged {lowerAgeBound} - {upperAgeBound} through our website, if you're interested in opportunities for older or youger students, please contact our enrolment team.\r\n

    \r\n \r\n
    \r\n \r\n
    ;\r\n }\r\n});\r\n\r\nexport default NoCoursesAvailable;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport map from 'lodash/map';\r\n\r\nconst circleBaseCss = \" before:w-[0.85rem] before:h-[0.85rem] before:z-20 before:rounded-[50%] before:transition-all before:ease-linear before:content-[''] \";\r\nconst circleSelectedCss = \" before:scale-125 before:bg-navy-700 \";\r\nconst circleFutureCss = \" before:bg-white \";\r\nconst circleCompletedCss = \" before:bg-navy-700 \";\r\n\r\nconst textBaseCss = \" rounded-0 indent-[-82.5rem] relative m-0 cursor-default border-none bg-transparent px-1.5 pb-0.5 pt-5 text-[#344767] outline-none transition-all ease-linear before:absolute before:top-0 before:left-1/2 before:z-30 before:box-border before:block before:-translate-x-1/2 before:border-2 before:border-solid before:border-current sm:indent-0 \";\r\n\r\nconst lineBaseCss = \" after:top-[5px] after:absolute after:left-[calc(-50%-13px/2)] after:z-10 after:block after:w-full after:transition-all after:ease-linear after:content-[''] \";\r\nconst lineFutureCss = \" after:bg-gray-400 after:h-0.5 \";\r\nconst lineCompletedCss = \" after:bg-navy-700 after:h-1 \";\r\n\r\nvar StepIndicator = createReactClass({\r\n props: {\r\n props: {\r\n wizard: PropTypes.object\r\n },\r\n },\r\n render: function() {\r\n\r\n var steps = ['Customer', 'Student', 'Programme', 'Enrol'];\r\n var currentComponentDisplayName = this.props.wizard.state.CurrentComponentDisplayName;\r\n var currentStepIdx = currentComponentDisplayName === 'Customer'\r\n ? 0 \r\n : currentComponentDisplayName === 'Student' ? 1\r\n : ['WhatNext', 'Billing', 'Flywire', 'End'].indexOf(currentComponentDisplayName) > -1 ? 3\r\n : 2; \r\n\r\n return
    \r\n {map(steps, function (stepName, idx) {\r\n var circleCss = circleBaseCss;\r\n var textCss;\r\n if (currentStepIdx == idx) {\r\n circleCss += circleSelectedCss;\r\n textCss = ' text-navy-700 font-semibold ';\r\n } else if (currentStepIdx > idx) {\r\n circleCss += circleCompletedCss;\r\n textCss = ' text-gray-400 ';\r\n } else {\r\n circleCss += circleFutureCss;\r\n textCss = ' text-gray-400 ';\r\n }\r\n\r\n var lineCss = '';\r\n if (idx > 0) {\r\n lineCss = lineBaseCss;\r\n if (currentStepIdx > idx - 1) {\r\n lineCss += lineCompletedCss;\r\n } else {\r\n lineCss += lineFutureCss;\r\n }\r\n }\r\n\r\n var css = circleCss + textBaseCss + lineCss;\r\n return \r\n })}\r\n
    ;\r\n }\r\n});\r\n\r\nexport default StepIndicator;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\n\r\nvar ErrorBoundary = createReactClass({ \r\n displayName: 'ErrorBoundary',\r\n\r\n componentDidCatch: function(error, errorInfo) { \r\n // You can also log the error to an error reporting service \r\n if (!window.rg4js) {\r\n return;\r\n } \r\n\r\n rg4js('send', {\r\n error: error,\r\n customData: { info: errorInfo }\r\n });\r\n },\r\n\r\n getInitialState: function () {\r\n return { hasError: false };\r\n },\r\n\r\n restartApp: function () {\r\n localStorage.clear();\r\n location.reload();\r\n },\r\n\r\n render: function() {\r\n if (this.state.hasError) { \r\n // You can render any custom fallback UI \r\n return
    \r\n

    Well, this is unexpected...

    \r\n

    Sorry, this is not working properly. We've sent the mistake to our tech team so that they can get it fixed asap.

    \r\n

    Usually it's a temporary issue and just starting the application again works.

    \r\n

    \r\n

    (Sometimes it's a more permanent error - in that case, please contact us below and we'll get your application finished)

    \r\n
    ;\r\n }\r\n \r\n return this.props.children; \r\n }\r\n});\r\n\r\nErrorBoundary.getDerivedStateFromError = function (error) {\r\n // Update state so the next render will show the fallback UI. \r\n return { hasError: true }; \r\n}\r\n\r\nexport default ErrorBoundary;","import React from 'react';\r\nimport createReactClass from 'create-react-class';\r\nimport moment from 'moment';\r\nimport map from 'lodash/map';\r\nimport find from 'lodash/find';\r\nimport filter from 'lodash/filter';\r\nimport every from 'lodash/every';\r\nimport some from 'lodash/some';\r\nimport any from 'lodash/some';\r\nimport assign from 'lodash/assign.js';\r\n\r\nimport deepLinkParse from './deep-link-parser.js';\r\n\r\nimport Begin from './begin.jsx';\r\nimport Customer from './customer/customer.jsx';\r\nimport BasketActionCreators from '../../actions/BasketActionCreators.js';\r\nimport Student from './student/student.jsx';\r\nimport HowToStudy from './how-to-study.jsx';\r\nimport TimeZone from './what-timezone.jsx';\r\nimport WhatRegion from './what-region.jsx';\r\nimport WhatCourse from './what-course.jsx';\r\nimport WhatSessionOptions from './what-session-options.jsx';\r\nimport WhatSite from './what-site.jsx';\r\nimport Upsells from './upsells.jsx';\r\nimport WhatNext from './what-next.jsx';\r\nimport Billing from './billing.jsx';\r\nimport Flywire from './flywire.jsx';\r\nimport NoCoursesAvailable from './no-courses-available.jsx';\r\nimport StepIndicator from './step-indicator.jsx';\r\nimport ErrorBoundary from './error-boundary.jsx';\r\n\r\nvar End = createReactClass({ render: function() { return

    Le Fin

    That's all for now folks

    ; } });\r\n\r\nimport isMatch from 'lodash/isMatch';\r\nimport forEach from 'lodash/forEach';\r\nimport rest from 'lodash/rest';\r\nimport set from 'lodash/set';\r\nimport get from 'lodash/get';\r\nvar NOT_THERE = \"__NOT_THERE__\";\r\nimport storage from '../../utilities/LocalStorage.js';\r\nimport BasketStore from '../../stores/BasketStore.js';\r\n\r\nimport CourseStore from '../../stores/CourseStore.js';\r\n\r\nvar ApplyWizard = createReactClass({\r\n displayName: 'ApplyWizard',\r\n getInitialState: function () {\r\n var tryGetFromStorage = deserialize();\r\n if (tryGetFromStorage) {\r\n tryGetFromStorage.Component = React.createRef();\r\n return tryGetFromStorage;\r\n }\r\n\r\n return this.getDefaultState();\r\n },\r\n\r\n getDefaultState: function() {\r\n // if you add to this make sure serialization and the set() method work\r\n return {\r\n CurrentComponentDisplayName: Begin.displayName,\r\n Component: React.createRef(),\r\n HasStartedWizard: false,\r\n IsUserCustomer: true, // used to be editable, now is not\r\n Customer: {},\r\n Student: {},\r\n CurrentItemId: false,\r\n Booking: {},\r\n Accommodation: {},\r\n SkipUpsell: false,\r\n SelectedUpsellOptions: [],\r\n PaymentError: false,\r\n hasClickedPayDeposit: false,\r\n StudyMethod: 'onsite',\r\n TimeZone: null,\r\n Region: null,\r\n Course: null,\r\n SessionIds: null,\r\n SessionDates: null,\r\n Sessions: null,\r\n SessionPricing: null,\r\n Intensity: null,\r\n CourseOptionSolutions: null,\r\n StudentTooOldOrTooYoung: false\r\n };\r\n },\r\n\r\n set: function (state, callback) {\r\n // when something updates the state of the wizard we need to reset other bits of the wizard\r\n // i.e. if you change the course, the sessionIds no longer match so they need to be reset\r\n // this bit of code sorts that\r\n var derivedState = assign({}, state);\r\n forEach(consequentResetterFor, function(resetter, prop) {\r\n if (!derivedState.hasOwnProperty(prop)) {\r\n return;\r\n }\r\n\r\n var oldValue = get(this.state, prop, NOT_THERE);\r\n var newValue = get(derivedState, prop, NOT_THERE);\r\n if (oldValue !== NOT_THERE\r\n // and the current prop has been set\r\n && newValue !== NOT_THERE \r\n // and they have been changed\r\n && ((typeof oldValue == \"object\" && ((resetter.hasOwnProperty('match') && !resetter.match(oldValue, newValue)) || (!resetter.hasOwnProperty('match') && !isMatch(oldValue, newValue))))\r\n || (typeof oldValue != \"object\" && oldValue !== newValue))) {\r\n // iterate through the properties, if they're being set\r\n // in this update we ignore them, otherwise we reset them\r\n forEach(resetter.reset, function(resetProp) {\r\n if (derivedState.hasOwnProperty(resetProp)) {\r\n return;\r\n }\r\n\r\n var reset = resetFunc(this, resetProp);\r\n derivedState = assign(derivedState, reset);\r\n }.bind(this))\r\n }\r\n }.bind(this));\r\n\r\n return this.setState(derivedState, callback);\r\n },\r\n \r\n componentDidMount: function () {\r\n CourseStore.addChangeListener(this.updateCourseList);\r\n },\r\n\r\n componentWillUnmount: function () {\r\n CourseStore.removeChangeListener(this.updateCourseList);\r\n },\r\n\r\n updateCourseList: function () {\r\n var courses = CourseStore.getCourses();\r\n if (this.state.Student.DateOfBirth) {\r\n var result = deepLinkParse(getCoursesForAgeGroup(courses, this.state.Student.DateOfBirth), this.state) || {};\r\n if (result.hasOwnProperty('Region')) {\r\n this.set(result);\r\n }\r\n }\r\n\r\n function getCoursesForAgeGroup(courses, studentDob) {\r\n return filter(courses, function (c) {\r\n return any(c.Dates, function (cd) {\r\n var studentAgeOnDate = moment.utc(cd.From).diff(studentDob, 'years');\r\n \r\n function isStudentAgeEligible(ag) {\r\n return (!ag.LowerBound || ag.LowerBound <= studentAgeOnDate) && (!ag.UpperBound || studentAgeOnDate <= ag.UpperBound);\r\n }\r\n \r\n return any(c.AgeGroups, isStudentAgeEligible);\r\n });\r\n });\r\n }\r\n },\r\n\r\n componentDidUpdate: function(prevProps, prevState) {\r\n serialize(this.state);\r\n },\r\n\r\n getCurrentComponent: function() {\r\n return this.getComponentByName(this.state.CurrentComponentDisplayName);\r\n },\r\n\r\n getComponentByName: function(name) {\r\n var availableComponents = getAvailableComponents(this.state);\r\n return find(availableComponents,\r\n function (component) {\r\n return component.displayName === name;\r\n }.bind(this));\r\n },\r\n\r\n getCurrentComponentIdx: function () {\r\n return this.getComponentIdx(this.state.CurrentComponentDisplayName);\r\n },\r\n\r\n getComponentIdx: function (name) {\r\n var availableComponents = getAvailableComponents(this.state);\r\n for (var i = 0; i < availableComponents.length; i++) {\r\n if (availableComponents[i].displayName === name) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n },\r\n\r\n nextQuestion: function (callback) { \r\n if (!this.state.Component.current.hasOwnProperty(\"isValid\") ||\r\n !(this.state.Component.current.isValid instanceof Function)) {\r\n throw \"Component must have an isValid() method\";\r\n }\r\n\r\n if (!this.state.Component.current.isValid()) {\r\n return;\r\n }\r\n\r\n if (this.state.Component.current.hasOwnProperty('onSubmit')) {\r\n if (!this.state.Component.current.onSubmit()) {\r\n return;\r\n }\r\n }\r\n\r\n var components = getAvailableComponents(this.state);\r\n var currentIdx = this.getCurrentComponentIdx();\r\n var componentDisplayName = currentIdx < components.length - 1 ? components[currentIdx + 1].displayName : this.state.CurrentComponentDisplayName;\r\n \r\n this.jump(componentDisplayName, callback); \r\n },\r\n\r\n previousQuestion: function() {\r\n var components = getAvailableComponents(this.state);\r\n var currentIdx = this.getCurrentComponentIdx();\r\n var componentDisplayName = currentIdx > 0 ? components[currentIdx - 1].displayName : this.state.CurrentComponentDisplayName;\r\n\r\n this.jump(componentDisplayName);\r\n },\r\n\r\n jumpToBilling: function () {\r\n this.resetCourse();\r\n this.jump(Billing);\r\n },\r\n\r\n jumpToWhatNext: function(preventCourseUpdate) {\r\n this.jump(WhatNext, this.resetCourse, preventCourseUpdate);\r\n },\r\n \r\n newWizardForStudent: function (itemId) {\r\n var course = BasketStore.getCourseByItemId(itemId);\r\n this.resetCourse();\r\n this.setState({ \r\n Student: course.Student\r\n }, () => this.jump('WhatRegion'));\r\n },\r\n\r\n newWizardForNewStudent: function () {\r\n this.resetCourse();\r\n this.resetStudent();\r\n this.jump(Student);\r\n },\r\n\r\n reset: function() {\r\n this.setState(this.getDefaultState());\r\n global.localStorage.removeItem('__ora_widget_apply_wizard');\r\n },\r\n\r\n jump: function (component, callback, preventCourseUpdate) {\r\n if (typeof component === \"string\") {\r\n component = this.getComponentByName(component);\r\n }\r\n\r\n var func = () => {\r\n if (component.displayName === WhatNext.displayName && !preventCourseUpdate) {\r\n var currentComponent = this.getCurrentComponent();\r\n var creatableComponents = [WhatCourse, TimeZone, WhatSessionOptions, WhatSite, Upsells];\r\n if (some(creatableComponents, c => c.displayName === currentComponent.displayName)) {\r\n var price = this.getPrice();\r\n var itemId = new Date().getTime() + '_'; \r\n BasketActionCreators.addCourse(\r\n this.state.Course,\r\n this.state.Intensity,\r\n this.getLineItemOptions(),\r\n this.state.Region,\r\n this.state.Student,\r\n price.PriceExcludingDiscount,\r\n price.PriceIncludingDiscount,\r\n price.Deposit,\r\n this.state.TimeZone,\r\n itemId);\r\n\r\n if (this.state.SelectedUpsellOptions && this.state.SelectedUpsellOptions.length) {\r\n forEach(this.state.SelectedUpsellOptions,\r\n function(upsellOption) {\r\n BasketActionCreators.addCourse(\r\n upsellOption.LineItem.Course,\r\n upsellOption.LineItem.Intensity,\r\n [],\r\n null,\r\n this.state.Student,\r\n upsellOption.Price,\r\n upsellOption.Price,\r\n upsellOption.Deposit,\r\n null,\r\n null,\r\n itemId);\r\n }.bind(this));\r\n }\r\n\r\n if (this.state.CurrentItemId) {\r\n BasketActionCreators.removeCourse(this.state.CurrentItemId);\r\n }\r\n }\r\n }\r\n\r\n var state = { CurrentComponentDisplayName: component.displayName };\r\n this.setState(state, function() {\r\n scrollTo(0, 0);\r\n if (callback && typeof callback === \"function\") {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n if (!document.startViewTransition) {\r\n setTimeout(func, 0);\r\n return;\r\n }\r\n \r\n // With a transition: \r\n var currentIdx = this.getCurrentComponentIdx();\r\n var newIdx = this.getComponentIdx(component.displayName);\r\n this.writeTransition(newIdx > currentIdx);\r\n var transition = document.startViewTransition(func); \r\n },\r\n\r\n writeTransition: function (ltr) {\r\n var id = 'view-transition';\r\n var style = document.getElementById(id);\r\n if (style) {\r\n style.remove();\r\n }\r\n\r\n style = document.createElement('style');\r\n style.id = id;\r\n style.innerHTML = `\r\n @keyframes fade-in {\r\n from { opacity: 0; }\r\n }\r\n \r\n @keyframes fade-out {\r\n to { opacity: 0; }\r\n }\r\n \r\n @keyframes slide-from-right {\r\n from { transform: translateX(300px); }\r\n }\r\n \r\n @keyframes slide-to-left {\r\n to { transform: translateX(-300px); }\r\n }\r\n \r\n @keyframes slide-from-left {\r\n from { transform: translateX(-300px); }\r\n }\r\n \r\n @keyframes slide-to-right {\r\n to { transform: translateX(300px); }\r\n }\r\n \r\n ::view-transition-old(root) {\r\n animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out,\r\n 300ms cubic-bezier(0.4, 0, 0.2, 1) both ${(ltr ? 'slide-to-left' : 'slide-to-right')} ;\r\n }\r\n \r\n ::view-transition-new(root) {\r\n animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,\r\n 300ms cubic-bezier(0.4, 0, 0.2, 1) both ${(ltr ? 'slide-from-right' : 'slide-from-left')};\r\n } \r\n `;\r\n document.head.append(style);\r\n },\r\n\r\n resetCourse: function() {\r\n var resetState = resetFunc(this,\r\n \"CurrentItemId\",\r\n \"StudyMethod\",\r\n \"TimeZone\",\r\n \"Region\",\r\n \"Course\",\r\n \"SessionIds\",\r\n \"SessionDates\",\r\n \"Sessions\",\r\n \"SessionPricing\",\r\n \"Intensity\",\r\n \"CourseOptionSolutions\",\r\n \"Accommodation\",\r\n \"SelectedUpsellOptions\",\r\n \"SkipUpsell\");\r\n this.setState(resetState);\r\n },\r\n\r\n resetStudent: function() {\r\n var resetState = resetFunc(this, \"Student\");\r\n this.setState(resetState);\r\n },\r\n\r\n getOptionsSolution: function () {\r\n if (!this.state.Course.HasCourseBreakdown) {\r\n return null;\r\n }\r\n\r\n if (this.state.Accommodation.IsNonResidential) {\r\n // just take the first solution if non-residential\r\n return this.state.CourseOptionSolutions[0];\r\n }\r\n\r\n // iterate through all the solutions until we find one\r\n // that contains the correct session/site mix \r\n // according to the desired site choices\r\n return find(\r\n this.state.CourseOptionSolutions,\r\n function (solution) {\r\n return every(this.state.Sessions,\r\n function(session) {\r\n var sessionSite = this.state.Accommodation[session.SessionId];\r\n return some(\r\n solution,\r\n function(courseOptionSlot) {\r\n return courseOptionSlot.Session.SessionId === session.SessionId &&\r\n courseOptionSlot.Site.SiteId === sessionSite.SiteId;\r\n });\r\n }.bind(this));\r\n }.bind(this));\r\n },\r\n\r\n getLineItemOptions: function() {\r\n return map(this.state.Sessions,\r\n function(session) {\r\n return {\r\n Session: session,\r\n IsNonResidential: this.state.Course.CourseType.StudyMethod === 1 ||\r\n this.state.Accommodation.IsNonResidential,\r\n Site: this.state.Course.CourseType.StudyMethod === 0 &&\r\n !this.state.Accommodation.IsNonResidential &&\r\n this.state.Accommodation.hasOwnProperty(session.SessionId)\r\n ? this.state.Accommodation[session.SessionId]\r\n : null,\r\n Options: this.state.Course.HasCourseBreakdown\r\n ? filter(\r\n this.getOptionsSolution(),\r\n function(availability) {\r\n return availability.Session.SessionId === session.SessionId;\r\n })\r\n : null\r\n };\r\n }.bind(this));\r\n },\r\n\r\n getPrice: function() {\r\n var lineItem = this.getLineItem();\r\n if (some(lineItem.Options,\r\n function(option) {\r\n return option.IsNonResidential;\r\n })) {\r\n return {\r\n PriceIncludingDiscount: this.state.SessionPricing.NonResidentialPriceIncludingDiscount || this.state.SessionPricing.PriceIncludingDiscount,\r\n PriceExcludingDiscount: this.state.SessionPricing.NonResidentialPriceExcludingDiscount || this.state.SessionPricing.PriceExcludingDiscount,\r\n Deposit: this.state.SessionPricing.Deposit\r\n };\r\n }\r\n\r\n return {\r\n PriceIncludingDiscount: this.state.SessionPricing.PriceIncludingDiscount,\r\n PriceExcludingDiscount: this.state.SessionPricing.PriceExcludingDiscount,\r\n Deposit: this.state.SessionPricing.Deposit\r\n }\r\n },\r\n\r\n getLineItem: function () {\r\n return {\r\n Course: this.state.Course,\r\n Student: this.state.Student,\r\n Intensity: this.state.Intensity,\r\n Options: this.getLineItemOptions(),\r\n Region: this.state.Region\r\n };\r\n },\r\n \r\n render: function() {\r\n var component = this.getCurrentComponent(); \r\n \r\n return \r\n
    \r\n
    \r\n \r\n \"Oxford\r\n \r\n
    \r\n
    \r\n Application Form for Oxford Royale's 2024 Courses\r\n Apply for Oxford Royale's 2024 Courses\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n { this.state.CurrentComponentDisplayName !== Begin.displayName \r\n ? \r\n : false\r\n }\r\n
    \r\n {React.createElement(component, { wizard: this, ref: this.state.Component })}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    ;\r\n }\r\n});\r\n\r\n\r\nfunction getAvailableComponents (state) {\r\n var components = [];\r\n components.push(Begin);\r\n components.push(Customer);\r\n components.push(Student);\r\n\r\n if (!state.StudyMethod) {\r\n components.push(HowToStudy);\r\n }\r\n\r\n if (state.StudentTooOldOrTooYoung) {\r\n components.push(NoCoursesAvailable)\r\n }\r\n\r\n if (state.StudyMethod === \"onsite\") {\r\n components.push(WhatRegion);\r\n }\r\n\r\n components.push(WhatCourse);\r\n if (state.StudyMethod === 'online') {\r\n components.push(TimeZone);\r\n }\r\n\r\n if (state.Course && state.Course.HasCourseBreakdown) {\r\n components.push(WhatSessionOptions);\r\n }\r\n\r\n if (state.StudyMethod === \"onsite\") {\r\n components.push(WhatSite);\r\n }\r\n\r\n if (!state.SkipUpsell) {\r\n components.push(Upsells);\r\n }\r\n\r\n components.push(WhatNext);\r\n components.push(Billing);\r\n components.push(Flywire);\r\n components.push(End);\r\n return components;\r\n}\r\n\r\nfunction serialize(state) {\r\n if (!global.localStorage || global.OraWidgets.Options.IsStorageDisabled) {\r\n return;\r\n }\r\n if (!state) {\r\n return;\r\n }\r\n\r\n storage.setItem('__ora_widget_apply_wizard',\r\n JSON.stringify({\r\n HasStartedWizard: state.HasStartedWizard,\r\n CurrentComponentDisplayName: state.CurrentComponentDisplayName,\r\n IsUserCustomer: state.IsUserCustomer,\r\n Customer: state.Customer,\r\n CurrentItemId: state.CurrentItemId,\r\n Student: state.Student,\r\n\r\n // Booking-y stuff\r\n StudyMethod: state.StudyMethod,\r\n Region: state.Region,\r\n Course: state.Course,\r\n SessionIds: state.SessionIds,\r\n SessionDates: state.SessionDates,\r\n Sessions: state.Sessions,\r\n SessionPricing: state.SessionPricing,\r\n Intensity: state.Intensity,\r\n TimeZone: state.TimeZone,\r\n CourseOptionSolutions: state.CourseOptionSolutions,\r\n Accommodation: state.Accommodation,\r\n SkipUpsell: state.SkipUpsell,\r\n SelectedUpsellOptions: state.SelectedUpsellOptions,\r\n StudentTooOldOrTooYoung: state.StudentTooOldOrTooYoung,\r\n }));\r\n\r\n}\r\n\r\nfunction deserialize() {\r\n if (!global.localStorage || global.OraWidgets.Options.IsStorageDisabled) {\r\n return;\r\n }\r\n\r\n var state = JSON.parse(storage.getItem('__ora_widget_apply_wizard'));\r\n if (state) {\r\n if (state.Student && state.Student.DateOfBirth) {\r\n state.Student.DateOfBirth = moment.utc(state.Student.DateOfBirth);\r\n }\r\n\r\n if (state.SessionDates) {\r\n state.SessionDates = map(state.SessionDates, function (d) { return moment.utc(d); });\r\n }\r\n }\r\n return state;\r\n}\r\n\r\n// if any particular state changes, what other things should be reset? This has the answers.\r\n// These cascade in a tree of causality. TODO be really smart and batch them into one reset/setState call\r\nvar consequentResetterFor = {\r\n \"Student.DateOfBirth\": {\r\n reset: [\"StudyMethod\"]\r\n },\r\n StudyMethod: {\r\n reset: ['Region','Course']\r\n },\r\n \"Student.Gender\": {\r\n reset:[ \"SessionIds\",\r\n \"Intensity\"\r\n ]\r\n },\r\n Region: {\r\n reset: [\"Course\"],\r\n match1: function (a, b) {\r\n return !b || (!a && !b) || (a && b && a.RegionId == b.RegionId);\r\n }\r\n }, \r\n Course: {\r\n reset: [ \"SessionIds\",\r\n \"Intensity\"\r\n ],\r\n \r\n match1: function (a,b) {\r\n return !b || (!a && !b) || (a && b && a.CourseId == b.CourseId);\r\n }\r\n },\r\n SessionIds: {\r\n reset: [ \"CourseOptionSolutions\",\r\n \"Accommodation\",\r\n \"SelectedUpsellOptions\",\r\n \"SkipUpsell\",\r\n \"TimeZone\"]\r\n },\r\n CourseOptionSolutions: {\r\n reset: [\"Accommodation\"]\r\n },\r\n Accommodation: {\r\n reset: [\"SelectedUpsellOptions\", \"SkipUpsell\"]\r\n }\r\n}\r\n\r\n\r\nvar resetFunc = rest(function(thisArg, props) {\r\n var initial = thisArg.getDefaultState();\r\n var resetState = {};\r\n\r\n forEach(props, function(prop) {\r\n var nullOrDefault = initial.hasOwnProperty(prop) ? initial[prop] : null;\r\n set(resetState, prop, nullOrDefault);\r\n });\r\n\r\n return resetState;\r\n}, 1);\r\n\r\nexport default ApplyWizard;\r\n","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n getById: function(courseId) {\r\n return http.get(options.apiEndpoint() + '/Course/' + courseId);\r\n },\r\n\r\n getCourses: function() {\r\n return http.get(options.apiEndpoint() + global.OraWidgets.Options.coursesPath);\r\n }\r\n};","import Dispatcher from \"../utilities/OraDispatcher.js\";\r\nimport { ActionTypes } from \"../constants/Constants.js\";\r\nimport CourseService from \"../utilities/CourseService.js\";\r\n\r\nvar coursesRequested = {};\r\n\r\nexport function getById(courseId) {\r\n if (coursesRequested.hasOwnProperty(courseId)) {\r\n return;\r\n }\r\n\r\n coursesRequested[courseId] = true;\r\n CourseService.getById(courseId).done(function (course) {\r\n Dispatcher.dispatch({ type: ActionTypes.GET_COURSE, course: course });\r\n });\r\n}\r\n\r\nexport function getCourses() {\r\n CourseService.getCourses().done(function (courses) {\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_COURSES,\r\n courses: courses,\r\n });\r\n });\r\n}\r\n","import options from './WidgetOptions.js';\r\nimport http from './Http.js';\r\n\r\nexport default {\r\n getAll: function() {\r\n return http.get(options.apiEndpoint() + '/Country?take=999');\r\n }\r\n};","import Dispatcher from \"../utilities/OraDispatcher.js\";\r\nimport { ActionTypes } from \"../constants/Constants.js\";\r\nimport CountryService from \"../utilities/CountryService.js\";\r\n\r\nexport function getAll() {\r\n CountryService.getAll().done(function (countries) {\r\n // normal API returns paged result. public API returns a list.\r\n if (countries.Items) {\r\n countries = countries.Items;\r\n }\r\n\r\n Dispatcher.dispatch({\r\n type: ActionTypes.GET_ALL_COUNTRIES,\r\n countries: countries,\r\n });\r\n });\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport ApplyWizard from './components/applywizard/apply-wizard.jsx';\r\nimport { getCourses } from './actions/CourseActionCreators.js';\r\nimport { getAll } from './actions/CountryActionCreators.js';\r\n\r\nvar applyWizard = function(div, options) {\r\n getCourses();\r\n getAll();\r\n ReactDOM.render(, div);\r\n}\r\n\r\njQuery(\"*[data-ora-application]\").each(function() {\r\n applyWizard(this, {});\r\n});\r\n\r\nexport default applyWizard;","import './options.js';\r\nimport \"../index.css\";\r\nimport applyWizard from './applywizard.jsx';\r\n//require('./ai.js');\r\n\r\n// load the public facing widgets\r\n//var basket = require('./basket.jsx');\r\n//var applyBasket = require('./applybasket.jsx');\r\n\r\n//var checkout = require('./checkout.jsx');\r\n//var checkoutUpsell = require('./checkoutupsell.jsx');\r\n//var stripePaymentForm = require('./stripepaymentform.jsx');\r\n//var flywirePaymentForm = require('./flywirepaymentform.jsx');\r\n//var optionsPicker = require('./optionspicker.jsx');\r\n//var AdManagerService = require('./utilities/AdManagerService.js');\r\n//var CourseStore = require('./stores/CourseStore.js');\r\n//var BasketStore = require('./stores/BasketStore.js');\r\n\r\nglobal.OraWidgets.IsWebsite = true;\r\n//global.OraWidgets.Basket = basket;\r\n//global.OraWidgets.ApplyBasket = applyBasket;\r\nglobal.OraWidgets.ApplyWizard = applyWizard;\r\n//global.OraWidgets.Checkout = checkout;\r\n//global.OraWidgets.CheckoutUpsell = checkoutUpsell;\r\n//global.OraWidgets.StripePaymentForm = stripePaymentForm;\r\n\r\n//global.OraWidgets.FlywirePaymentForm = flywirePaymentForm;\r\n\r\n//global.OraWidgets.OptionsPicker = optionsPicker;\r\n//global.OraWidgets.GetBasketIdentifierAndSecret = BasketStore.getBasketIdentifierAndSecret;\r\n//var basketStoreListeners = [];\r\n//global.OraWidgets.LoadBasket = basket.prototype.load;\r\n//global.OraWidgets.GetBasketCount = BasketStore.numberOfItems;\r\n//global.OraWidgets.AddBasketListener = function(listener) {\r\n// basketStoreListeners.push(listener);\r\n//};\r\n\r\n//BasketStore.addChangeListener(function() {\r\n// for (var i = 0; i < basketStoreListeners.length; i++) {\r\n// basketStoreListeners[i](BasketStore.getCourses());\r\n// }\r\n//});\r\n\r\n//// check for product details views and product details clicks\r\n//if (jQuery('*[data-ora-course-availability-button]').length) {\r\n// // we're on a course details page\r\n// var courseId = jQuery('*[data-ora-course-availability-button]').data('courseid');\r\n// CourseStore.addChangeListener(sentCourseDetailsGtm);\r\n//}\r\n\r\n//function sentCourseDetailsGtm() {\r\n// var course = CourseStore.getById(courseId);\r\n// if (course) {\r\n// var isProductClick = query.hasOwnProperty('r') && query['r'] === 'w';\r\n// var positionInSearch = query.hasOwnProperty('pis') ? query['pis'] : null;\r\n\r\n// // Find region by looking for data-regionid on availability button and then finding that region within course.Sites\r\n// var regionId = jQuery('*[data-ora-course-availability-button]').data('regionid');\r\n// var region = '';\r\n// if (regionId) {\r\n// var siteInRegion = find(course.Sites,\r\n// function (site) {\r\n// return site.Region && site.Region.RegionId == regionId;\r\n// });\r\n// if (siteInRegion) {\r\n// region = siteInRegion.Region.Name;\r\n// }\r\n// }\r\n\r\n// var product = { id: course.CourseId, name: course.Name, category: course.CourseType, variant: region };\r\n\r\n// AdManagerService.productDetailsTag(\r\n// 'productDetailsView',\r\n// 'ecommerce',\r\n// 'detail view',\r\n// product.name,\r\n// product);\r\n\r\n// if (isProductClick) {\r\n// AdManagerService.productClicksTag(\r\n// 'productClick',\r\n// 'ecommerce',\r\n// 'product click',\r\n// product.name,\r\n// positionInSearch ? 'Search Results' : 'Menu',\r\n// product,\r\n// positionInSearch);\r\n// }\r\n\r\n// CourseStore.removeChangeListener(sentCourseDetailsGtm);\r\n// }\r\n//}"],"names":["isLive","Dispatcher","DATE_FORMAT","ActionTypes","keyMirror","Store","callback","indexOf","context","i","options$1","options","originalOptions","jqXhr","get","url","dataType","ajax","post","data","put","del","standardiseRequest","handleError","getQ","queue","postQ","putQ","delQ","queues","activeRequests","queueName","deferred","promise","deferredOpts","clonedOptions","enqueue","dequeue","cb","xhr","nextCallback","lastError","response","isQueueRunning","qname","isAnyQueueRunning","http","storage","key","expiry","value","now","resolvedPromise","dfd","getRequestData","customer","courses","basketIdentifier","lastBasketData","lastDiscountRequestData","BasketService","coursesAsJson","isEmpty","requestData","basketId","requestDataAsJson","courseId","sessionIds","regionId","query","map","sessionId","upgradeBasket","basket","copyAndDeleteProp","obj","from","to","StudentEquals","left","right","BasketUtilities","prices","discounts","lineItems","isReserving","isConfirming","isConfirmed","isPollingPaymentStatus","isUpsellSearching","countries","reservation","reservationFailureResponse","paymentIntentStatus","paymentIntentFailureResponse","paymentIntentId","stripeClientSecret","order","termsAndConditions","upsells","uuidv4","referralSecret","successRedirectUri","paymentStatusEnum","isFetchingCourseData","courseOptionsData","reset","BasketStore","deserialize","updateBasketCookie","notifyApi","create","size","lineItem","lineItemOption","itemId","totalExcludingDiscounts","totalIncludingCourseDiscounts","deposit","forEach","totalIncludingBasketDiscounts","discount","lineItemKeyMaker","clone","applicableTermsAndConditions","courseItem","termsAndConditionsDocument","courseTypePropertyMatches","find","documentProperty","effectiveFrom","moment","effectiveTo","date","min","uniq","keyBits","serialize","mapValues","item","serialized","shouldResetBasket","course","filter","price","debouncedNotifyApi","debounce","searchId","getDiscounts","mySearchId","basketStore","debouncedGetDiscounts","payload","newItemId","getNextItemId","newCourse","assign","websiteGetDiscounts","omitBy","id","propChange","update","option","currentStudent","updateBasketFromStorage","parseDeepLinks","wizardState","deepLinks","getDeepLinkedCourseSlugs","regionSlugs","courseSlugs","courseCandidates","search","result","intent","s","regionSlug","courseSlug","bestRegionMatch","maxBy","uniqBy","flatMap","site","sumBy","slug","regionPair","some","slugsToCourse","possibleCourses","val","bestCourseMatch","c","courseName","courseMatch","Begin","createReactClass","intentParams","intentSplashImage","jsxs","jsx","AvailabilityService","agentId","widgetOptions","intensity","message","regions","region","emailAddress","phoneNumber","studentName","studentGender","sessions","Cookies","b","injectCJPixel","slimOrder","src","cjEvent","product","idx","queryIdx","img","sendGTMPurchaseTag","redirectUri","tagToPush","AdManagerService","courseTypeName","o","event","category","action","label","addCourse","student","priceExcludingDiscount","priceIncludingDiscount","timeZone","parentItemId","BasketActionCreators","timezone","courseType","eventCategory","eventAction","productVariant","productOptions","flatten","sessionOption","otherSessionOption","cachedLineItem","dispatchedGetLineItemDataSuccess","property","person","forOwn","CustomerBase","PropTypes","React","prop","ENTER","pressEnter","FormGroup","desc","validation","isArray","className","classNames","registeredComponents","handlers","IGNORE_CLASS","isSourceFound","source","localNode","onClickOutside","fn","eventHandler","evt","found","ReactDOM","pos","allCountries","allCountryCodes","addCountryCode","iso2","dialCode","priority","index","j","countryData","validateNumber","inputNumber","country","startsWith","isModernBrowser","keys","ReactTelephoneInput","selectedCountryGuess","selectedCountryGuessIndex","findIndex","formattedNumber","preferredCountries","any","preferredCountry","middle","container","containerHeight","containerOffset","containerTop","containerBottom","element","elementOffset","elementHeight","elementTop","elementBottom","newScrollTop","middleOffset","heightDifference","text","pattern","formattedObject","reduce","acc","character","first","tail","skipFocus","input","len","memoize","secondBestGuess","trim","bestGuess","selectedCountry","newSelectedCountry","freezeSelection","caretPosition","oldFormattedText","diff","countryIso2Code","currentSelectedCountry","nextSelectedCountry","newNumber","direction","highlightCountryIndex","queryString","probableCountries","probableCandidate","probableCandidateIndex","self","_moveHighlight","countryDropDownList","itemClasses","inputFlagClasses","dashedLi","dropDownClasses","arrowClasses","inputClasses","flagViewClasses","NavigationButtons","Loading","cubeStyle","cubes","countriesDictionary","guessCountry","langCode","usersIso2CountryCode","usersCountry","CountryMap","Customer","newCountries","newIsEditMode","wizard","guessUserCountry","sortBy","TelephoneInput","PressEnter","firstNameError","lastNameError","emailErrors","mobileErrors","isEmail","countryError","countryId","StudentBase","nationalities","nationalities$1","n","individualCourseLookup","CourseStore","courseStore","Student","isAdditionalCourse","init","dob","extend","customerCountry","getClassNameForButton","isSelected","partial","genderError","dobErrors","nationalityError","parseDate","isRealisticDateOfBirth","jumpToNextQuestion","parsedDob","studentDob","coursesInAgeGroup","getCoursesForAgeGroup","deepLinkParse","selectedNationality","nationality","state","dateObj","pick","str","momentDate","cd","studentAgeOnDate","isStudentAgeEligible","ag","isStudentBetween13and18","dateOfBirth","start","end","ageStart","ageEnd","HowToStudy","method","showOnline","is3rdPerson","selectedStudyMethod","methodChooser","displayName","pictureUrl","description","isComingSoon","getClassNameForStudyMethod","isValid","courseAvailability","courseSuggestions","agentAvailability","availabilitySelections","dateSelections","enquiryRequests","regionSessionGroups","AvailabilityStore","availabilityStore","courseAvailabilityKey","agentAvailabilityKey","AvailabilityActionCreators","cachedAvailability","dispatchGetAvailability","availability","cached","d","startDate","dates","weeks","hours","suggestions","timeZonesLookup","TimeZonesStore","timeZonesStore","dispatcher","calcTime","currentTime","offset","utc","nd","TimeZone","inner","RegionPrettyNameLookup","WhatRegion","allCourses","loading","isAfterSeptember","regionsForStudentAge","getRegions","regionName","hasError","allowedRegions","r","regionsFromCourses","datesFromSessions","max","datesFromCourseItem","descriptionFromCourseItem","slotOption","to2Dp","number","precision","multiplier","wholeNumber","num","formatWithCommas","x","bits","formatted","maybeFormat2Dp","formattedBits","Ui","WhatSession","selectedIntensity","intensityId","distinct","a","imageStyleSrc","isLoading","hasIntensities","intensitiesWithAnySessions","isSelectedRegion","isSameIntensity","sessionsByPrice","hasJustOnePrice","intensitySessions","filterAvailabilities","seasonSessions","groupBy","session","allUnavailable","all","pair","availabilities","getStartAndEndDates","studentAgeOnSession","isStudentAgeOutOfRange","seasonId","placesForStudent","bookButtonClass","hasWaitlistBeenJoined","datePair","omit","currentNotifyDates","dateOrderedSessions","last","WhatCourse","excludeCoursesByStudyMethodAndAgeRange","studentAge","isPreselected","containerClassNames","GetRegionName","renderCourses","CourseSessionPicker","optionsLookup","optionsAvailabilitiesLookup","OptionsStore","optionsStore","mapOptions","ReactPropTypes","width","permute","permutation","length","k","p","OptionsPicker","availabilityGroupedInToCourseScheduleSlotGroups","courseScheduleSlotGroups","optionsArray","courseScheduleSlotGroupId","indicator","selectedOptions","selectedOption","candidateCourseOption","solutions","returnFirst","flattenedSelectedOptions","groupCourseOptions","courseOption","slotSessionCombos","courseScheduleSlotGroup","permutedSlotSessionCombos","permIdx","permutationSolutionsArray","selIdx","slotSession","matchingAvailability","getAvailabilityForCourseOptionAndSessionSlot","availabilityItem","nextPermutationSolutionsArray","solIdx","currentPossibleSolution","previousSessionSelection","mIdx","courseScheduleSlot","every","groupSelections","match","courseOptionId","solution","wasValid","groupSelectedOptions","oIdx","title","choiceElement","userAgent","removeDisabledOptions","word","indicatorGroup","name","choiceElements","selectedOptionForIdx","optionTitle","groupAvailability","courseOptionAvailability","courseOptionOption","WhatSessionOptions","results","params","parts","tryParseValue","newValue","uri","multipleFilters","courseTypes","sites","maybeAddFilterFromUrl","queryName","stateKey","isNumeric","syncUrl","lookup","newUrl","FiltersStore","filtersStore","SiteService","SiteActionCreators","WhatSite","sessionSitePairs","getPossibleSitesBySession","isNonResidentialAvailable","isMultiSessionCourse","nonRezOption","isFirstInLoop","basicSite","currentAccommodation","isForbidden","buttonClass","hasEnsuite","Linkify","wizardCallback","accom","naughtyList","whatsTheNaughtyList","accommodation","anySessionsDontHaveASiteSelected","sId","courseOptionSolutions","co","array","courseOptionsSolutions","sessionSiteCombos","cos","sol","sols","removeAnySolutionsAllowedBySessionChoice","reject","combo","thisSite","removeSelectedSessionKeys","forbiddenSitesBySessionId","sessionAccumulator","sessionsAndSites","getOptions","error","responseJson","UpsellActionCreators","Upsells","isSearching","e","newSelectedOptions","upsellOption","sum","partialRight","total","Summary","totals","bookings","booking","change","upsell","u","basketBookings","basketUpsells","renderBookings","bookingsCollection","v","bookingsByStudent","getStudentKey","studentIdentifier","courseBookings","courseKey","wizardStateLikeData","WhatNext","newHasBookings","newCourses","newCustomer","wizState","ApplySummary","values","identifier","CheckoutPay","rightText","onClick","btnClass","CustomerForm","confirm","mobile","adultStudents","minAge","user","UserStore","userStore","AgentService","searchTerm","TypeAhead","generateFuncForUrl","code","items","newState","selectedItem","isString","fakeEvent","lists","click","mouseOver","div","AgentForm","agent","CheckoutCustomer","emptyFunction","marketing","privacyPolicy","links","WidgetOptions","joinText","thirdParty","alumniMessage","CardIcons","iconNames","iconName","TermsAndConditionsService","TermsAndConditionsCreators","BookingService","isOptingOutOfMarketing","acceptedTermsAndConditions","isOraReservation","overrideAgeConstraints","isAgentBooking","agentName","financesVisibleToCustomer","sendPaymentEmail","isOnlyPayingDeposit","reservationId","orderId","transactionIds","makeReservation","courseCopy","checkoutError","actionType","reservationError","pollingStart","beginPollPaymentStatus","pollPaymentStatus","ActionCreators","doPay","bookingCompleteUrl","orderResponse","invalid","object","errorMessage","errorObject","fieldNameOverride","common","CustomerValidator","billingOnly","email","normalizeEmail","confirmEmail","Billing","applyTotalDiscount","confirmed","CheckoutActionCreators","errorContainer","customerErrorState","FlyWireForm","parentElement","topLevelElement","countdownElements","nextProps","nextState","args","errors","flywireModal","flywireForm","elements","iframe","baseFlywireContainer","refParam","scrollToElement","failureReason","secondsInOneMinute","Timer","seconds","classes","secsPart","minsPart","Flywire","timer","CountdownTimer","amountToPay","FlywireForm","NoCoursesAvailable","studentAgeNow","lowerAgeBound","upperAgeBound","circleBaseCss","circleSelectedCss","circleFutureCss","circleCompletedCss","textBaseCss","lineBaseCss","lineFutureCss","lineCompletedCss","StepIndicator","steps","currentComponentDisplayName","currentStepIdx","stepName","circleCss","textCss","lineCss","css","ErrorBoundary","errorInfo","End","NOT_THERE","ApplyWizard","tryGetFromStorage","derivedState","consequentResetterFor","resetter","oldValue","isMatch","resetProp","resetFunc","prevProps","prevState","availableComponents","getAvailableComponents","component","components","currentIdx","componentDisplayName","preventCourseUpdate","func","currentComponent","creatableComponents","newIdx","ltr","style","resetState","sessionSite","courseOptionSlot","rest","thisArg","props","initial","nullOrDefault","set","CourseService","getCourses","CountryService","getAll","applyWizard"],"mappings":"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B,aAAcA,CAAE,EAElD,EAMA,sBAAuB,UAAY,CAC/B,IAAIA,EAAK,KAAK,sBACV,UAAY,OACH,SAAA,oBAAoB,YAAaA,CAAE,EACnC,SAAA,oBAAoB,aAAcA,CAAE,EAErD,CACJ,EC1FA,IAAIM,GAAe,CACf,CACE,6BACA,KACA,IACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,iBACA,KACA,MACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,WACA,KACA,MACD,EACD,CACE,sBACA,KACA,MACD,EACD,CACE,YACA,KACA,IACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,YACA,KACA,KACA,iBACD,EACD,CACE,uBACA,KACA,IACD,EACD,CACE,0BACA,KACA,KACD,EACD,CACE,UACA,KACA,MACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,wBACA,KACA,KACD,EACD,CACE,WACA,KACA,MACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACA,kBACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,UACA,KACA,MACD,EACD,CACE,iBACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,+CACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,kBACA,KACA,IACD,EACD,CACE,iCACA,KACA,KACD,EACD,CACE,yBACA,KACA,MACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,sBACA,KACA,KACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,sBACA,KACA,KACD,EACD,CACE,SACA,KACA,IACA,oBACA,EACA,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CAC/R,EACD,CACE,0BACA,KACA,KACD,EACD,CACE,wBACA,KACA,MACA,GACA,CACD,EACD,CACE,iBACA,KACA,MACD,EACD,CACE,uDACA,KACA,KACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,QACA,KACA,IACD,EACD,CACE,aACA,KACA,KACA,iBACD,EACD,CACE,WACA,KACA,IACD,EACD,CACE,yBACA,KACA,KACD,EACD,CACE,iDACA,KACA,KACD,EACD,CACE,uCACA,KACA,KACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,aACA,KACA,MACA,gBACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,OACA,KACA,IACD,EACD,CACE,UACA,KACA,MACA,GACA,CACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,mCACA,KACA,KACD,EACD,CACE,oBACA,KACA,KACA,iBACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,WACA,KACA,MACD,EACD,CACE,4CACA,KACA,IACA,GACA,EACA,CAAC,MAAO,MAAO,KAAK,CACrB,EACD,CACE,UACA,KACA,KACD,EACD,CACE,iBACA,KACA,IACD,EACD,CACE,cACA,KACA,MACA,gBACD,EACD,CACE,wCACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,oCACA,KACA,KACD,EACD,CACE,0BACA,KACA,KACD,EACD,CACE,OACA,KACA,KACD,EACD,CACE,kBACA,KACA,MACA,mBACD,EACD,CACE,SACA,KACA,KACA,mBACD,EACD,CACE,mCACA,KACA,KACD,EACD,CACE,yCACA,KACA,KACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,wBACA,KACA,KACA,iBACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,YACA,KACA,KACD,EACD,CACE,kBACA,KACA,IACD,EACD,CACE,+BACA,KACA,KACD,EACD,CACE,UACA,KACA,MACD,EACD,CACE,aACA,KACA,MACA,GACA,CACD,EACD,CACE,OACA,KACA,MACD,EACD,CACE,YACA,KACA,MACA,gBACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,+BACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,QACA,KACA,MACA,gBACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,iBACA,KACA,MACA,gBACD,EACD,CACE,yBACA,KACA,IACD,EACD,CACE,mBACA,KACA,MACA,eACD,EACD,CACE,eACA,KACA,KACA,iBACD,EACD,CACE,YACA,KACA,IACD,EACD,CACE,kBACA,KACA,IACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,UACA,KACA,MACA,iBACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,iBACA,KACA,KACA,iBACA,CACD,EACD,CACE,UACA,KACA,MACD,EACD,CACE,aACA,KACA,KACA,iBACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,yBACA,KACA,IACA,mBACA,CACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,0BACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,sBACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,iCACA,KACA,KACD,EACD,CACE,4BACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,WACA,KACA,KACA,kBACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,OACA,KACA,KACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,4BACA,KACA,KACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,kBACA,KACA,IACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,8BACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,yBACA,KACA,KACD,EACD,CACE,aACA,KACA,MACD,EACD,CACE,sBACA,KACA,KACD,EACD,CACE,0BACA,KACA,KACD,EACD,CACE,2BACA,KACA,IACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,0BACA,KACA,KACA,iBACD,EACD,CACE,qCACA,KACA,KACD,EACD,CACE,cACA,KACA,KACA,kBACD,EACD,CACE,YACA,KACA,KACD,EACD,CACE,gBACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,OACA,KACA,KACD,EACD,CACE,iBACA,KACA,KACD,EACD,CACE,+BACA,KACA,KACD,EACD,CACE,2BACA,KACA,MACD,EACD,CACE,iBACA,KACA,KACA,gBACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,wBACA,KACA,KACA,iBACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,wBACA,KACA,KACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,cACA,KACA,IACD,EACD,CACE,cACA,KACA,KACA,cACD,EACD,CACE,kBACA,KACA,KACA,iBACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,cACA,KACA,IACA,GACA,EACA,CAAC,MAAO,KAAK,CACd,EACD,CACE,iBACA,KACA,KACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,oBACA,KACA,IACD,EACD,CACE,kBACA,KACA,IACA,mBACA,CACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,sCACA,KACA,MACA,GACA,CACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,wBACA,KACA,MACD,EACD,CACE,cACA,KACA,MACD,EACD,CACE,iDACA,KACA,MACA,GACA,CACD,EACD,CACE,uDACA,KACA,KACD,EACD,CACE,mCACA,KACA,MACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,8CACA,KACA,KACD,EACD,CACE,6CACA,KACA,KACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,YACA,KACA,KACA,eACD,EACD,CACE,eACA,KACA,MACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,kBACA,KACA,KACD,EACD,CACE,uBACA,KACA,KACD,EACD,CACE,eACA,KACA,IACD,EACD,CACE,qBACA,KACA,IACD,EACD,CACE,gCACA,KACA,KACD,EACD,CACE,iBACA,KACA,KACA,iBACD,EACD,CACE,0BACA,KACA,IACD,EACD,CACE,qBACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,YACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACA,kBACD,EACD,CACE,wBACA,KACA,KACA,kBACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,cACA,KACA,KACD,EACD,CACE,aACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,EACD,CACE,iBACA,KACA,IACD,EACD,CACE,cACA,KACA,KACD,EACD,CACE,OACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,QACA,KACA,KACD,EACD,CACE,sBACA,KACA,MACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACA,mBACD,EACD,CACE,eACA,KACA,KACD,EACD,CACE,2BACA,KACA,MACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,sBACA,KACA,MACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,qDACA,KACA,KACD,EACD,CACE,iBACA,KACA,KACA,iBACD,EACD,CACE,gBACA,KACA,IACA,oBACA,CACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,2BACA,KACA,KACD,EACD,CACE,UACA,KACA,KACD,EACD,CACE,oCACA,KACA,KACA,mBACA,CACD,EACD,CACE,YACA,KACA,IACD,EACD,CACE,qBACA,KACA,IACD,EACD,CACE,oBACA,KACA,KACD,EACD,CACE,mBACA,KACA,KACD,EACD,CACE,SACA,KACA,KACD,EACD,CACE,WACA,KACA,KACD,CACL,EAGIC,GAAkB,CAAA,EAClBC,GAAiB,SAAUC,EAAMC,EAAUC,EAAU,CAC/CD,KAAYH,KACdA,GAAgBG,CAAQ,EAAI,IAEhC,IAAIE,EAAQD,GAAY,EACxBJ,GAAgBG,CAAQ,EAAEE,CAAK,EAAIH,CACvC,EAaA,QAAShR,GAAI,EAAGA,GAAI6Q,GAAa,OAAQ7Q,KAAK,CAE1C,IAAIsL,EAAIuF,GAAa7Q,EAAC,EAatB,GAZA6Q,GAAa7Q,EAAC,EAAI,CACd,KAAMsL,EAAE,CAAC,EACT,KAAMA,EAAE,CAAC,EACT,SAAUA,EAAE,CAAC,EACb,SAAUA,EAAE,CAAC,GAAK,CAC1B,EAEQA,EAAE,CAAC,IACHuF,GAAa7Q,EAAC,EAAE,OAASsL,EAAE,CAAC,GAI5BA,EAAE,CAAC,EAAG,CACNuF,GAAa7Q,EAAC,EAAE,aAAe,GAC/B,QAASoR,GAAI,EAAGA,GAAI9F,EAAE,CAAC,EAAE,O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"}