{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/javascript/app/parsley/parsley-fr.js","webpack:///./src/assets/javascript/app/ring.js","webpack:///./src/assets/javascript/app/parsley/parsley-cn.js","webpack:///./src/assets/javascript/app/parsley/parsley-de.js","webpack:///./src/assets/javascript/app/parsley/parsley-es.js","webpack:///./src/assets/javascript/app/parsley/parsley-jp.js","webpack:///./src/assets/javascript/app/parsley/parsley-ko.js","webpack:///./src/assets/javascript/app/parsley/parsley-se.js","webpack:///./src/assets/javascript/app/parsley/parsley-th.js","webpack:///./src/assets/javascript/app/ring-data.js","webpack:///./src/assets/javascript/app/landing-page.js","webpack:///./src/assets/javascript/app/config.js","webpack:///./src/assets/javascript/app/utilities/index.js","webpack:///./src/assets/javascript/app/featured-panel.js","webpack:///./src/assets/javascript/app/results-panel.js","webpack:///./src/assets/javascript/app/search-modal.js","webpack:///./src/assets/javascript/app/locale-modal.js","webpack:///./src/assets/javascript/app/enter-story-data-panel.js","webpack:///./src/assets/javascript/app/upload-image-panel.js","webpack:///./src/assets/javascript/app/enter-sweeps-data-panel.js","webpack:///./src/assets/javascript/app/view-course-panel.js","webpack:///./src/assets/javascript/app/view-story-panel.js","webpack:///./src/assets/javascript/app/thanks-panel.js","webpack:///./src/assets/javascript/app/rules-panel.js","webpack:///./src/assets/javascript/app/add-course-panel.js","webpack:///./src/assets/javascript/app/map-page.js","webpack:///./src/assets/javascript/app/index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","ParsleyConfig","i18n","fr","jQuery","extend","defaultMessage","type","email","url","number","integer","digits","alphanum","notblank","required","pattern","min","max","range","minlength","maxlength","mincheck","maxcheck","check","equalto","ParsleyValidator","addCatalog","Ring","google","maps","OverlayView","constructor","position","courseData","repeat","super","this","containerDiv","document","createElement","classList","add","dotDiv","appendChild","hitAreaDiv","storyCount","ringDiv","ring2Div","ring3Div","hoverDiv","innerHTML","grow","gsap","to","width","height","opacity","shrink","onComplete","mapPage","removeRing","highlight","duration","unhighlight","remove","onAdd","getPanes","floatPane","addEventListener","ringClicked","onRemove","removeEventListener","parentElement","removeChild","draw","divPosition","getProjection","fromLatLngToDivPixel","display","Math","abs","x","y","style","left","top","zh_cn","de","es","ja","ko","sv","th","ringData","id","location","lat","lng","LandingPage","elementId","_singletonInstance","initialize","console","log","textureFile","getElementById","getAttribute","globe","Globe","animateIn","globeImageUrl","ringsData","ringColor","ringPropagationSpeed","ringRepeatPeriod","pointsData","pointColor","pointAltitude","pointRadius","backgroundColor","onGlobeReady","directionalLight","scene","children","find","obj3d","intensity","ambientLight","innerWidth","controls","enabled","enablePointerInteraction","resizeGlobe","setTimeout","startImages","pointOfView","altitude","showAtmosphere","enableZoom","autoRotate","autoRotateSpeed","leftImageStrip","rightImageStrip","mobileImageStrip","lastTime","leftY","rightY","mobileX","props","speed","mobileSpeed","clientHeight","set","clientWidth","requestAnimationFrame","animateImages","undefined","movement","Date","now","mobileMovement","ease","startGlobe","setInterval","startRing","ringIndex","ringPoint","filter","circlePoint","config","mapId","mobileWidth","panelOffset","openDuration","closeDuration","maxResults","detailZoomLevel","clickZoomLevel","mapData","default","initialZoom","initialPosition","initialCourses","au","ca","cn","ie","jp","my","se","sg","uk","trackEvent","category","action","label","dataLayer","completedEvt","event","eventCategory","eventAction","eventLabel","app","ga","getQueryStringVariable","variable","vars","search","substring","split","pair","FeaturedPanel","self","panelElement","panelContent","querySelector","recentElement","openButton","closeButton","storyButton","menuButton","searchInput","noResultsMessage","noResults","openClicked","closePanel","closeAllPanels","searchModal","open","hideNoResults","isOpen","featuredData","rotationTimerId","recentStoryIndex","setRecentStoryContent","recent","firstName","lastName","courseName","courseLocation","openPanel","recentStoryClicked","e","storyData","courseID","setNewCourseData","moveToCourse","storyClicked","nextRecentStory","clearTimeout","alpha","killTweensOf","xTarget","isMobile","loadFeaturedStories","getURL","fetch","then","json","error","showErrorMessage","featuredElement","toString","featured","src","imageData","secure_url","featuredStoryClicked","setFeaturedContent","catch","err","showNoResults","close","ResultsPanel","addCourseLink","loadingMessage","showAreaButton","addCoursePanel","resultsData","highlightResult","target","highlightRing","unhighlightResult","unhighlightRing","resultClicked","ul","firstChild","map","getMap","getBounds","toJSON","bodyData","locale","JSON","stringify","options","method","headers","body","courses","course","li","setAttribute","drawRings","isSearching","setResultsContent","searchForCourses","hideAreaButton","SearchModal","modes","EXPLORE","featuredPanel","SUBMIT","LocaleModal","blockerElement","EnterStoryDataPanel","nextButton","valid","$","parsley","isValid","validate","ele","querySelectorAll","checked","uploadImagePanel","getSelectedCourseData","clear","prop","setCourseData","scrollTop","UploadImagePanel","uploadButton","uploadWidget","cloudinary","createUploadWidget","cloudName","uploadPreset","folder","sources","showAdvancedOptions","multiple","defaultSource","info","thumbnail_url","setUploadedImageData","enterSweepsDataPanel","EnterSweepsDataPanel","rulesLink","localeLink","privacyLink","backButton","isSweepsOnly","submitSweeps","submitStory","thanksPanel","rulesPanel","localeModal","isSweeps","ViewCoursePanel","storiesElement","noResultsElement","enterStoryDataPanel","sampleElement","postData","stories","story","cloneElement","cloneNode","storyID","genericImage","getGenericImage","getCourseStories","ViewStoryPanel","tellButton","getSelectedStoryData","list","text","ballElement","storyBall","dataElement","flight","feel","longSpin","shortSpin","setStoryContent","ThanksPanel","showSuccessMessage","RulesPanel","RULES","landingPageURL","href","AddCoursePanel","nameInput","locationInput","MapPage","resultsPanel","viewCoursePanel","viewStoryPanel","searchAreaButton","genericImageContainer","oldWidth","newWidth","selectedCourseData","selectedStoryData","uploadedImageData","rings","require","checkLocale","initMap","Map","zoom","center","minZoom","maxZoom","disableDefaultUI","zoomControl","mapTypeControl","scaleControl","streetViewControl","rotateControl","fullscreenControl","clickableIcons","gestureHandling","featuredInput","featuredSearchBox","places","SearchBox","featuredSearchButton","modalInput","modalSearchBox","modalSearchButton","boundsDelay","addListener","setBounds","getZoom","placesChanged","trigger","keyCode","startInitialRings","ringIntervalId","searchBox","panel","getPlaces","bounds","LatLngBounds","forEach","place","geometry","viewport","union","fitBounds","getCenter","arr","a","floor","random","shuffle","intervalTime","ring","LatLng","setMap","timerId","clearAllRings","clearInterval","index","featureClicked","panTo","setZoom","radios","address","address2","city","state","postalCode","gender","mostOftenBall","selectedIndex","teamOptIn","sweeps","Accept","genericIndex","img","landingPage"],"mappings":"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AER,CACEH,GAAI,MACJvH,KAAM,sBACNwH,SAAU,sBACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,+BACNwH,SAAU,WACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,oBACNwH,SAAU,UACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,6BACNwH,SAAU,GACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,yBACNwH,SAAU,UACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,yBACNwH,SAAU,aACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,6BACNwH,SAAU,WACVlD,WAAY,EACZmD,IAAK,SACLC,IAAK,UAEP,CACEH,GAAI,MACJvH,KAAM,oBACNwH,SAAU,UACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,uBACNwH,SAAU,SACVlD,WAAY,EACZmD,IAAK,QACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,sBACNwH,SAAU,YACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,mBACNwH,SAAU,SACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,oBACNwH,SAAU,WACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,0BACNwH,SAAU,QACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,oBACNwH,SAAU,UACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,sBACNwH,SAAU,sBACVlD,WAAY,EACZmD,IAAK,SACLC,KAAM,UAER,CACEH,GAAI,MACJvH,KAAM,+BACNwH,SAAU,WACVlD,WAAY,EACZmD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","file":"bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./dist/assets/javascript/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([122,\"vendor\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.fr = jQuery.extend(window.ParsleyConfig.i18n.fr || {}, {\r\n defaultMessage: \"Cette valeur semble non valide.\",\r\n type: {\r\n email: \"Cette valeur n'est pas une adresse email valide.\",\r\n url: \"Cette valeur n'est pas une URL valide.\",\r\n number: \"Cette valeur doit être un nombre.\",\r\n integer: \"Cette valeur doit être un entier.\",\r\n digits: \"Cette valeur doit être numérique.\",\r\n alphanum: \"Cette valeur doit être alphanumérique.\"\r\n },\r\n notblank: \"Cette valeur ne peut pas être vide.\",\r\n required: \"Ce champ est requis.\",\r\n pattern: \"Cette valeur semble non valide.\",\r\n min: \"Cette valeur ne doit pas être inférieure à %s.\",\r\n max: \"Cette valeur ne doit pas excéder %s.\",\r\n range: \"Cette valeur doit être comprise entre %s et %s.\",\r\n minlength: \"Cette chaîne est trop courte. Elle doit avoir au minimum %s caractères.\",\r\n maxlength: \"Cette chaîne est trop longue. Elle doit avoir au maximum %s caractères.\",\r\n length: \"Cette valeur doit contenir entre %s et %s caractères.\",\r\n mincheck: \"Vous devez sélectionner au moins %s choix.\",\r\n maxcheck: \"Vous devez sélectionner %s choix maximum.\",\r\n check: \"Vous devez sélectionner entre %s et %s choix.\",\r\n equalto: \"Cette valeur devrait être identique.\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('fr', window.ParsleyConfig.i18n.fr, true);\r\n","/**\r\n * An animated Ring/Dot on the map.\r\n */\r\nclass Ring extends google.maps.OverlayView {\r\n constructor(position, courseData, repeat) {\r\n // console.log('Ring() ', courseData)\r\n super()\r\n this.position = position\r\n this.courseData = courseData\r\n this.containerDiv = document.createElement('div')\r\n this.containerDiv.classList.add('ring-container')\r\n this.dotDiv = document.createElement('div')\r\n this.dotDiv.classList.add('dot')\r\n // this.dotDiv.classList.add('grow')\r\n this.containerDiv.appendChild(this.dotDiv)\r\n this.hitAreaDiv = document.createElement('div')\r\n this.hitAreaDiv.classList.add('hit-area')\r\n this.containerDiv.appendChild(this.hitAreaDiv)\r\n if (courseData.storyCount > 0) {\r\n this.ringDiv = document.createElement('div')\r\n this.ringDiv.classList.add('ring')\r\n if (repeat === false) {\r\n this.ringDiv.classList.add('no-repeat')\r\n }\r\n this.containerDiv.appendChild(this.ringDiv)\r\n\r\n this.ring2Div = document.createElement('div')\r\n this.ring2Div.classList.add('ring2')\r\n if (repeat === false) {\r\n this.ring2Div.classList.add('no-repeat')\r\n }\r\n this.containerDiv.appendChild(this.ring2Div)\r\n\r\n this.ring3Div = document.createElement('div')\r\n this.ring3Div.classList.add('ring3')\r\n if (repeat === false) {\r\n this.ring3Div.classList.add('no-repeat')\r\n }\r\n this.containerDiv.appendChild(this.ring3Div)\r\n }\r\n // hover content\r\n this.hoverDiv = document.createElement('div')\r\n this.hoverDiv.innerHTML = courseData.name\r\n this.hoverDiv.classList.add('title')\r\n this.containerDiv.appendChild(this.hoverDiv)\r\n this.grow()\r\n }\r\n\r\n grow() {\r\n // console.log('Ring.grow ', this.dotDiv)\r\n gsap.to(this.dotDiv, { width: 6, height: 6, opacity: 1 })\r\n // this.dotDiv.classList.remove('grow')\r\n // this.dotDiv.classList.add('shrink')\r\n }\r\n\r\n shrink() {\r\n // console.log('Ring.shrink ', this.dotDiv)\r\n gsap.to(this.dotDiv, {\r\n width: 0,\r\n height: 0,\r\n opacity: 0,\r\n onComplete: () => {\r\n window.mapPage.removeRing(this)\r\n },\r\n })\r\n // this.dotDiv.classList.remove('grow')\r\n // this.dotDiv.classList.add('shrink')\r\n }\r\n\r\n highlight() {\r\n // console.log('Ring.highlight ' + this)\r\n this.containerDiv.classList.add('hover')\r\n gsap.to(this.dotDiv, {\r\n duration: 0.3,\r\n width: 12,\r\n height: 12,\r\n })\r\n }\r\n\r\n unhighlight() {\r\n // console.log('Ring.unhighlight ' + this)\r\n this.containerDiv.classList.remove('hover')\r\n gsap.to(this.dotDiv, {\r\n duration: 0.3,\r\n width: 6,\r\n height: 6,\r\n })\r\n }\r\n\r\n /** Called when the Ring is added to the map. */\r\n onAdd() {\r\n // console.log('Ring.onAdd')\r\n this.getPanes().floatPane.appendChild(this.containerDiv)\r\n this.containerDiv.addEventListener('click', this.ringClicked.bind(this))\r\n this.containerDiv.addEventListener('mouseover', this.highlight.bind(this))\r\n this.containerDiv.addEventListener('mouseout', this.unhighlight.bind(this))\r\n }\r\n\r\n ringClicked() {\r\n window.mapPage.ringClicked(this.courseData)\r\n // trackEvent('Validate Map Button', 'Map Ring Marker', this.courseData.name)\r\n }\r\n\r\n /** Called when the Ring is removed from the map. */\r\n onRemove() {\r\n // console.log('Ring.onRemove')\r\n this.containerDiv.removeEventListener('click', this.ringClicked.bind(this))\r\n this.containerDiv.removeEventListener(\r\n 'mouseover',\r\n this.highlight.bind(this)\r\n )\r\n this.containerDiv.removeEventListener(\r\n 'mouseout',\r\n this.unhighlight.bind(this)\r\n )\r\n if (this.containerDiv.parentElement) {\r\n // TODO: do i need to remove children elements too?\r\n this.containerDiv.parentElement.removeChild(this.containerDiv)\r\n }\r\n }\r\n\r\n /** Called each frame when the Ring needs to draw itself. */\r\n draw() {\r\n const divPosition = this.getProjection().fromLatLngToDivPixel(this.position)\r\n // Hide the Ring when it is far out of view.\r\n const display =\r\n Math.abs(divPosition.x) < 4000 && Math.abs(divPosition.y) < 4000\r\n ? 'block'\r\n : 'none'\r\n\r\n if (display === 'block') {\r\n this.containerDiv.style.left = divPosition.x + 'px'\r\n this.containerDiv.style.top = divPosition.y + 'px'\r\n }\r\n\r\n if (this.containerDiv.style.display !== display) {\r\n this.containerDiv.style.display = display\r\n }\r\n }\r\n}\r\n\r\n// export default Ring\r\nmodule.exports = {\r\n Ring: Ring,\r\n}\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.zh_cn = jQuery.extend(window.ParsleyConfig.i18n.zh_cn || {}, {\r\n defaultMessage: \"不正确的值\",\r\n type: {\r\n email: \"请输入一个有效的电子邮箱地址\",\r\n url: \"请输入一个有效的链接\",\r\n number: \"请输入正确的数字\",\r\n integer: \"请输入正确的整数\",\r\n digits: \"请输入正确的号码\",\r\n alphanum: \"请输入字母或数字\"\r\n },\r\n notblank: \"请输入值\",\r\n required: \"必填项\",\r\n pattern: \"格式不正确\",\r\n min: \"输入值请大于或等于 %s\",\r\n max: \"输入值请小于或等于 %s\",\r\n range: \"输入值应该在 %s 到 %s 之间\",\r\n minlength: \"请输入至少 %s 个字符\",\r\n maxlength: \"请输入至多 %s 个字符\",\r\n length: \"字符长度应该在 %s 到 %s 之间\",\r\n mincheck: \"请至少选择 %s 个选项\",\r\n maxcheck: \"请选择不超过 %s 个选项\",\r\n check: \"请选择 %s 到 %s 个选项\",\r\n equalto: \"输入值不同\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('zh_cn', window.ParsleyConfig.i18n.zh_cn, true);\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.de = jQuery.extend(window.ParsleyConfig.i18n.de || {}, {\r\n defaultMessage: \"Die Eingabe scheint nicht korrekt zu sein.\",\r\n type: {\r\n email: \"Die Eingabe muss eine gültige E-Mail-Adresse sein.\",\r\n url: \"Die Eingabe muss eine gültige URL sein.\",\r\n number: \"Die Eingabe muss eine Zahl sein.\",\r\n integer: \"Die Eingabe muss eine Zahl sein.\",\r\n digits: \"Die Eingabe darf nur Ziffern enthalten.\",\r\n alphanum: \"Die Eingabe muss alphanumerisch sein.\"\r\n },\r\n notblank: \"Die Eingabe darf nicht leer sein.\",\r\n required: \"Dies ist ein Pflichtfeld.\",\r\n pattern: \"Die Eingabe scheint ungültig zu sein.\",\r\n min: \"Die Eingabe muss größer oder gleich %s sein.\",\r\n max: \"Die Eingabe muss kleiner oder gleich %s sein.\",\r\n range: \"Die Eingabe muss zwischen %s und %s liegen.\",\r\n minlength: \"Die Eingabe ist zu kurz. Es müssen mindestens %s Zeichen eingegeben werden.\",\r\n maxlength: \"Die Eingabe ist zu lang. Es dürfen höchstens %s Zeichen eingegeben werden.\",\r\n length: \"Die Länge der Eingabe ist ungültig. Es müssen zwischen %s und %s Zeichen eingegeben werden.\",\r\n mincheck: \"Wählen Sie mindestens %s Angaben aus.\",\r\n maxcheck: \"Wählen Sie maximal %s Angaben aus.\",\r\n check: \"Wählen Sie zwischen %s und %s Angaben.\",\r\n equalto: \"Dieses Feld muss dem anderen entsprechen.\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('de', window.ParsleyConfig.i18n.de, true);\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\nwindow.ParsleyConfig.i18n.es = jQuery.extend(window.ParsleyConfig.i18n.es || {}, {\r\n defaultMessage: \"Este valor parece ser inválido.\",\r\n type: {\r\n email: \"Este valor debe ser un correo válido.\",\r\n url: \"Este valor debe ser una URL válida.\",\r\n number: \"Este valor debe ser un número válido.\",\r\n integer: \"Este valor debe ser un número válido.\",\r\n digits: \"Este valor debe ser un dígito válido.\",\r\n alphanum: \"Este valor debe ser alfanumérico.\"\r\n },\r\n notblank: \"Este valor no debe estar en blanco.\",\r\n required: \"Este valor es requerido.\",\r\n pattern: \"Este valor es incorrecto.\",\r\n min: \"Este valor no debe ser menor que %s.\",\r\n max: \"Este valor no debe ser mayor que %s.\",\r\n range: \"Este valor debe estar entre %s y %s.\",\r\n minlength: \"Este valor es muy corto. La longitud mínima es de %s caracteres.\",\r\n maxlength: \"Este valor es muy largo. La longitud máxima es de %s caracteres.\",\r\n length: \"La longitud de este valor debe estar entre %s y %s caracteres.\",\r\n mincheck: \"Debe seleccionar al menos %s opciones.\",\r\n maxcheck: \"Debe seleccionar %s opciones o menos.\",\r\n check: \"Debe seleccionar entre %s y %s opciones.\",\r\n equalto: \"Este valor debe ser idéntico.\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('es', window.ParsleyConfig.i18n.es, true);\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.ja = jQuery.extend(window.ParsleyConfig.i18n.ja || {}, {\r\n defaultMessage: \"無効な値です。\",\r\n type: {\r\n email: \"正しいメールアドレスを入力してください。\",\r\n url: \"正しいURLを入力してください。\",\r\n number: \"正しい数字を入力してください。\",\r\n integer: \"正しい数値を入力してください。\",\r\n digits: \"正しい桁数で入力してください。\",\r\n alphanum: \"正しい英数字を入力してください。\"\r\n },\r\n notblank: \"この値を入力してください\",\r\n required: \"この値は必須です。\",\r\n pattern: \"この値は無効です。\",\r\n min: \"%s 以上の値にしてください。\",\r\n max: \"%s 以下の値にしてください。\",\r\n range: \"%s から %s の値にしてください。\",\r\n minlength: \"%s 文字以上で入力してください。\",\r\n maxlength: \"%s 文字以下で入力してください。\",\r\n length: \"%s から %s 文字の間で入力してください。\",\r\n mincheck: \"%s 個以上選択してください。\",\r\n maxcheck: \"%s 個以下選択してください。\",\r\n check: \"%s から %s 個選択してください。\",\r\n equalto: \"値が違います。\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('ja', window.ParsleyConfig.i18n.ja, true);\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.ko = jQuery.extend(window.ParsleyConfig.i18n.ko || {}, {\r\n defaultMessage: \"입력하신 내용이 올바르지 않습니다.\",\r\n type: {\r\n email: \"입력하신 이메일이 유효하지 않습니다.\",\r\n url: \"입력하신 URL이 유효하지 않습니다.\",\r\n number: \"입력하신 전화번호가 올바르지 않습니다.\",\r\n integer: \"입력하신 URL이 유효하지 않습니다.\",\r\n digits: \"숫자를 입력하여 주십시오.\",\r\n alphanum: \"입력하신 내용은 알파벳과 숫자의 조합이어야 합니다.\"\r\n },\r\n notblank: \"공백은 입력하실 수 없습니다.\",\r\n required: \"필수 입력사항입니다.\",\r\n pattern: \"입력하신 내용이 올바르지 않습니다.\",\r\n min: \"입력하신 내용이 %s보다 크거나 같아야 합니다. \",\r\n max: \"입력하신 내용이 %s보다 작거나 같아야 합니다.\",\r\n range: \"입력하신 내용이 %s보다 크고 %s 보다 작아야 합니다.\",\r\n minlength: \"%s 이상의 글자수를 입력하십시오. \",\r\n maxlength: \"%s 이하의 글자수를 입력하십시오. \",\r\n length: \"입력하신 내용의 글자수가 %s보다 크고 %s보다 작아야 합니다.\",\r\n mincheck: \"최소한 %s개를 선택하여 주십시오. \",\r\n maxcheck: \"%s개 또는 그보다 적게 선택하여 주십시오.\",\r\n check: \"선택하신 내용이 %s보다 크거나 %s보다 작아야 합니다.\",\r\n equalto: \"같은 값을 입력하여 주십시오.\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('ko', window.ParsleyConfig.i18n.ko, true);\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {}\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {}\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.sv = jQuery.extend(\r\n window.ParsleyConfig.i18n.sv || {},\r\n {\r\n defaultMessage: 'Ogiltigt värde.',\r\n type: {\r\n email: 'Ange en giltig e-postadress.',\r\n url: 'Ange en giltig URL.',\r\n number: 'Ange ett giltigt nummer.',\r\n integer: 'Ange ett heltal.',\r\n digits: 'Ange endast siffror.',\r\n alphanum: 'Ange endast bokstäver och siffror.',\r\n },\r\n notblank: 'Värdet får inte vara tomt.',\r\n required: 'Måste fyllas i.',\r\n pattern: 'Värdet är ej giltigt.',\r\n min: 'Värdet måste vara större än eller lika med %s.',\r\n max: 'Värdet måste vara mindre än eller lika med %s.',\r\n range: 'Värdet måste vara mellan %s och %s.',\r\n minlength: 'Värdet måste vara minst %s tecken.',\r\n maxlength: 'Värdet får maximalt innehålla %s tecken.',\r\n length: 'Värdet måste vara mellan %s och %s tecken.',\r\n mincheck: 'Minst %s val måste göras.',\r\n maxcheck: 'Maximalt %s val får göras.',\r\n check: 'Mellan %s och %s val måste göras.',\r\n equalto: 'Värdena måste vara lika.',\r\n }\r\n)\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('sv', window.ParsleyConfig.i18n.sv, true)\r\n","// ParsleyConfig definition if not already set\r\nwindow.ParsleyConfig = window.ParsleyConfig || {};\r\nwindow.ParsleyConfig.i18n = window.ParsleyConfig.i18n || {};\r\n\r\n// Define then the messages\r\nwindow.ParsleyConfig.i18n.th = jQuery.extend(window.ParsleyConfig.i18n.th || {}, {\r\n defaultMessage: \"ค่านี้ดูเหมือนว่าจะไม่ถูกต้อง\",\r\n type: {\r\n email: \"ค่านี้ควรจะเป็นอีเมลที่ถูกต้อง\",\r\n url: \"ค่านี้ควรจะเป็น url ที่ถูกต้อง\",\r\n number: \"ค่านี้ควรจะเป็นตัวเลขที่ถูกต้อง\",\r\n integer: \"ค่านี้ควรจะเป็นจำนวนเต็มที่ถูกต้อง\",\r\n digits: \"ค่านี้ควรเป็นทศนิยมที่ถูกต้อง\",\r\n alphanum: \"ค่านี้ควรเป็นอักขระตัวอักษรหรือตัวเลขที่ถูกต้อง\"\r\n },\r\n notblank: \"ค่านี้ไม่ควรจะว่าง\",\r\n required: \"ค่านี้จำเป็น\",\r\n pattern: \"ค่านี้ดูเหมือนว่าจะไม่ถูกต้อง\",\r\n min: \"ค่านี้ควรมากกว่าหรือเท่ากับ %s.\",\r\n max: \"ค่านี้ควรจะน้อยกว่าหรือเท่ากับ %s.\",\r\n range: \"ค่ายี้ควรจะอยู่ระหว่าง %s และ %s.\",\r\n minlength: \"ค่านี้สั้นเกินไป ควรจะมี %s อักขระหรือมากกว่า\",\r\n maxlength: \"ค่านี้ยาวเกินไป ควรจะมี %s อักขระหรือน้อยกว่า\",\r\n length: \"ความยาวของค่านี้ไม่ถูกต้อง ควรมีความยาวอยู่ระหว่าง %s และ %s อักขระ\",\r\n mincheck: \"คุณควรเลือกอย่างน้อย %s ตัวเลือก\",\r\n maxcheck: \"คุณควรเลือก %s ตัวเลือกหรือน้อยกว่า\",\r\n check: \"คุณควรเลือกระหว่าง %s และ %s ตัวเลือก\",\r\n equalto: \"ค่านี้ควรจะเหมือนกัน\"\r\n});\r\n\r\n// If file is loaded after Parsley main file, auto-load locale\r\nif ('undefined' !== typeof window.ParsleyValidator)\r\n window.ParsleyValidator.addCatalog('th', window.ParsleyConfig.i18n.th, true);\r\n","export const ringData = [\r\n {\r\n id: 4259,\r\n name: 'Palm Beach Par 3 Golf Club',\r\n location: 'Palm Beach, FL',\r\n lat: 26.63272,\r\n lng: -80.03882,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 5466,\r\n name: 'Bayonet/blackhorse Golf Course',\r\n location: 'Seaside, CA ',\r\n lat: 36.63027,\r\n lng: -121.8209,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 5510,\r\n name: 'Pasatiempo Golf Club',\r\n location: 'Santa Cruz, CA ',\r\n lat: 37.00415,\r\n lng: -122.026,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 7925,\r\n name: 'Caledonia Golf & Fish Club',\r\n location: 'Pawleys Island, SC ',\r\n lat: 33.45243,\r\n lng: -79.15503,\r\n storyCount: 3,\r\n },\r\n {\r\n id: 11520,\r\n name: 'Sweetens Cove Golf Club',\r\n location: 'S Pittsburg, TN ',\r\n lat: 35.04994,\r\n lng: -85.72229,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 1810,\r\n name: 'Clearview Golf & Country Club',\r\n location: 'Canton, OH ',\r\n lat: 40.77341,\r\n lng: -81.24826,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 933,\r\n name: 'Oak Hill Country Club',\r\n location: 'Rochester, NY ',\r\n lat: 43.11283,\r\n lng: -77.53276,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16213,\r\n name: 'Winged Foot Golf Club',\r\n location: 'Mamaroneck, NY ',\r\n lat: 40.952,\r\n lng: -73.74595,\r\n storyCount: 2,\r\n },\r\n\r\n {\r\n id: 790,\r\n name: 'Country Club Of New Bedford',\r\n location: 'N Dartmouth, MA',\r\n lat: 41.6422,\r\n lng: -70.9746,\r\n storyCount: 1,\r\n },\r\n\r\n {\r\n id: 8154,\r\n name: 'Oakwing Golf Club',\r\n location: 'Alexandria, LA',\r\n lat: 31.31929,\r\n lng: -92.52753,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 5671,\r\n name: 'Mauna Kea Golf Pro Shop',\r\n location: 'Kamuela, HI',\r\n lat: 20.00604,\r\n lng: -155.8244,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 2608,\r\n name: 'Sugarwood Golf Course',\r\n location: 'Lavalette, WV',\r\n lat: 38.32286,\r\n lng: -82.44682,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 7196,\r\n name: 'Riverchase Golf Course',\r\n location: 'Coppell, TX',\r\n lat: 32.9557,\r\n lng: -96.94587,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 4651,\r\n name: 'Mid Pines Inn & Golf Club',\r\n location: 'Southern Pnes, NC',\r\n lat: 35.19475,\r\n lng: -79.39204,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 10597,\r\n name: 'Streamsong Resort',\r\n location: 'Bowling Green, FL',\r\n lat: 27.6929,\r\n lng: -81.93434,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 5745,\r\n name: 'Prestwick Golf Club',\r\n location: 'Woodbury, MN',\r\n lat: 44.89764,\r\n lng: -92.91257,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 1706,\r\n name: 'Wanumetonomy Golf & Country Cl',\r\n location: 'Middletown, RI',\r\n lat: 41.53634,\r\n lng: -71.29861,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 7323,\r\n name: 'River View Golf',\r\n location: 'Santa Ana, CA',\r\n lat: 33.76665,\r\n lng: -117.8925,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17195,\r\n name: 'The Toronto Hunt Golf Club',\r\n location: 'Scarborough, ON',\r\n lat: 43.68085,\r\n lng: -79.27209,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17823,\r\n name: 'Don Valley Golf Club',\r\n location: 'Willowdale, ON',\r\n lat: 43.74879,\r\n lng: -79.40817,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17480,\r\n name: 'Chester Golf Club',\r\n location: 'Chester, NS',\r\n lat: 44.53632,\r\n lng: -64.22233,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16967,\r\n name: 'Kindersley Regional Park & Golf Course',\r\n location: 'Kindersley, SK',\r\n lat: 51.4563,\r\n lng: -109.147,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16978,\r\n name: 'Kananaskis Country Golf',\r\n location: 'Kananaskis, AB',\r\n lat: 50.90282,\r\n lng: -115.1434,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17022,\r\n name: 'Bighorn Golf & Country Club',\r\n location: 'Kamloops, BC',\r\n lat: 50.68837,\r\n lng: -120.2968,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17170,\r\n name: 'Whitlock Golf & Country Club',\r\n location: 'Hudson, QC',\r\n lat: 45.45344,\r\n lng: -74.16488,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17237,\r\n name: 'Country Meadows Golf Club',\r\n location: 'Indian Mountain, NB',\r\n lat: 46.16061,\r\n lng: -64.95757,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17460,\r\n name: 'Transcona Golf Club',\r\n location: 'Winnipeg, MB',\r\n lat: 49.88545,\r\n lng: -97.02239,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17869,\r\n name: 'Algonquin Resort Golf Club',\r\n location: 'St. Andrews, NB',\r\n lat: 45.08313,\r\n lng: -67.07608,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17878,\r\n name: 'Clyde River Golf Club',\r\n location: 'Clyde River, PE',\r\n lat: 46.21351,\r\n lng: -63.26505,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 18001,\r\n name: 'Terra Nova Golf Resort',\r\n location: 'Port Blandford, NL', \r\n lat: 48.38319,\r\n lng: -54.19691,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 18053,\r\n name: 'Olympic View Golf Club',\r\n location: 'Victoria, BC',\r\n lat: 48.40323,\r\n lng: -123.5193,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17372,\r\n name: 'Timber Ridge Golf Club',\r\n location: 'Brighton, ON',\r\n lat: 44.07512,\r\n lng: -77.70062,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17541,\r\n name: 'Le Parcours Du Cerf',\r\n location: 'Longueuil, QC',\r\n lat: 45.56073,\r\n lng: -73.45215,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16356,\r\n name: 'Barnbougle Dunes',\r\n location: 'Bridport, TAS',\r\n lat: -41.01549,\r\n lng: 147.4375,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 16930,\r\n name: 'Yallourn Golf Club',\r\n location: 'Newborough, VIC',\r\n lat: -38.17742,\r\n lng: 146.3168,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16308,\r\n name: 'Bargara Golf Club',\r\n location: 'Bargara, QLD',\r\n lat: -24.82087,\r\n lng: 152.4648,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 19393,\r\n name: 'Pau Golf Club',\r\n location: 'Billere',\r\n lat: 43.31429,\r\n lng: -0.3983829,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16214,\r\n name: 'Royal County Down Golf Club',\r\n location: 'Newscastle, UK ',\r\n lat: 54.21783,\r\n lng: -5.88313,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 21788,\r\n name: 'DYRHAM PARK GOLF CLUB',\r\n location: 'BARNET',\r\n lat: 51.67216,\r\n lng: -0.230974,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 24184,\r\n name: '오크밸리',\r\n location: '원주, ',\r\n lat: 37.4382,\r\n lng: 127.8137,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 23309,\r\n name: 'BOKSKOGENS GK',\r\n location: 'Bara, ',\r\n lat: 55.55146,\r\n lng: 13.228,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21080,\r\n name: 'The Bluffs, Ho Tram',\r\n location: 'Ba Ria, Vung Tau, VNM',\r\n lat: 10.48051,\r\n lng: 107.4465,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21016,\r\n name: 'Riverdale Golf',\r\n location: ', BKK',\r\n lat: 13.98069,\r\n lng: 100.5399,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21035,\r\n name: 'Sentosa Golf Club',\r\n location: 'Singapore, ',\r\n lat: 1.244026,\r\n lng: 103.8291,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21080,\r\n name: 'The Bluffs, Ho Tram',\r\n location: 'Ba Ria, Vung Tau, VNM',\r\n lat: 10.48051,\r\n lng: 107.4465,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21016,\r\n name: 'Riverdale Golf',\r\n location: ', BKK',\r\n lat: 13.98069,\r\n lng: 100.5399,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21035,\r\n name: 'Sentosa Golf Club',\r\n location: 'Singapore, ',\r\n lat: 1.244026,\r\n lng: 103.8291,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 16214,\r\n name: 'Royal County Down Golf Club',\r\n location: 'Newscastle, UK ',\r\n lat: 54.21783,\r\n lng: -5.88313,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 21788,\r\n name: 'DYRHAM PARK GOLF CLUB',\r\n location: 'BARNET',\r\n lat: 51.67216,\r\n lng: -0.230974,\r\n storyCount: 1,\r\n },\r\n]\r\n","// import Globe from 'globe.gl'\r\nimport { ringData } from './ring-data'\r\n\r\nlet LandingPage = function (elementId) {\r\n if (LandingPage.prototype._singletonInstance) {\r\n return LandingPage.prototype._singletonInstance\r\n }\r\n LandingPage.prototype._singletonInstance = this\r\n\r\n this.initialize(elementId)\r\n}\r\n\r\n/**\r\n * Landing page initialization. The process starts with the Globe.gl object,\r\n * and kicks off the intro sequence with the .onGlobeReady(initializeGlobe)\r\n */\r\nLandingPage.prototype.initialize = function (elementId) {\r\n console.log('LandingPage initalizing')\r\n\r\n let self = this\r\n let textureFile = document\r\n .getElementById('globe-wrapper')\r\n .getAttribute('data-texture')\r\n console.log('texture file is ' + textureFile)\r\n\r\n // make the globe and set some intial values\r\n let globe = Globe({ animateIn: true })\r\n // .globeImageUrl(\"//unpkg.com/three-globe/example/img/earth-blue-marble.jpg\")\r\n .globeImageUrl(textureFile)\r\n .ringsData([])\r\n // .ringColor(\"#e31837\")\r\n .ringColor(() => (t) => `rgba(227,24,55,${1 - t})`)\r\n .ringPropagationSpeed([0.75])\r\n .ringRepeatPeriod(1000)\r\n\r\n .pointsData([])\r\n // .pointColor(() => '#e31837')\r\n .pointColor(() => 'rgba(227,24,55,0.6)')\r\n .pointAltitude(0.0015)\r\n .pointRadius(0.3)\r\n\r\n .backgroundColor('#f9f9f9')\r\n .onGlobeReady(initializeGlobe)\r\n .pointOfView({ lat: 25, lng: 305, altitude: 2.5 }, [0])\r\n .showAtmosphere(false)(\r\n // .atmosphereAltitude(0.25)\r\n // .atmosphereColor('#ffffff')(\r\n // .bumpImageUrl(\"//unpkg.com/three-globe/example/img/earth-topology.png\")(\r\n // .backgroundImageUrl(\"//unpkg.com/three-globe/example/img/night-sky.png\")\r\n document.getElementById(elementId)\r\n )\r\n console.log('globe is ', globe.controls())\r\n globe.enablePointerInteraction(false)\r\n globe.controls().enabled = false\r\n globe.controls().enableZoom = false\r\n globe.controls().autoRotate = false\r\n globe.controls().autoRotateSpeed = 1\r\n\r\n globe.width([1400])\r\n globe.height([1400])\r\n\r\n // globe.controls.autoRotate = true\r\n\r\n window.addEventListener('resize', self.resizeGlobe)\r\n // self.resizeGlobe()\r\n\r\n // make the image strips and set up their initial animation loops\r\n const leftImageStrip = document.getElementById('leftImageStrip')\r\n const rightImageStrip = document.getElementById('rightImageStrip')\r\n const mobileImageStrip = document.getElementById('mobileImageStrip')\r\n\r\n let leftY = 0\r\n let rightY = 0\r\n let mobileX = 0\r\n let props = { speed: 5500, mobileSpeed: 5500 } // px per second 4500 vs 5500\r\n let lastTime\r\n\r\n function startImages() {\r\n console.log(\r\n 'start image strip initial sets and visibility offscreen ',\r\n leftImageStrip\r\n )\r\n leftY = leftImageStrip.clientHeight * -1.2\r\n gsap.set(leftImageStrip, {\r\n y: leftY,\r\n opacity: 1,\r\n })\r\n console.log('initial leftY is ' + leftY)\r\n console.log('based on height ' + leftImageStrip.clientHeight)\r\n rightY = rightImageStrip.clientHeight * 0.6\r\n gsap.set(rightImageStrip, {\r\n y: rightY,\r\n opacity: 1,\r\n })\r\n mobileX = mobileImageStrip.clientWidth * -1.2\r\n gsap.set(mobileImageStrip, {\r\n x: mobileX,\r\n opacity: 1,\r\n })\r\n requestAnimationFrame(animateImages)\r\n }\r\n\r\n function animateImages() {\r\n // console.log('animateImages')\r\n if (lastTime !== undefined) {\r\n let movement = ((Date.now() - lastTime) / 1000) * props.speed\r\n let mobileMovement = ((Date.now() - lastTime) / 1000) * props.mobileSpeed\r\n leftY += movement\r\n rightY -= movement\r\n mobileX += mobileMovement\r\n if (leftY >= 0) {\r\n // console.log('loop left images y')\r\n leftY = leftImageStrip.clientHeight * -0.5\r\n }\r\n if (rightY <= rightImageStrip.clientHeight * -0.5) {\r\n // console.log('loop right images y')\r\n rightY = 0\r\n }\r\n if (mobileX >= 0) {\r\n // console.log('loop mobile images x')\r\n mobileX = mobileImageStrip.clientWidth * -0.5\r\n }\r\n gsap.set(leftImageStrip, { y: leftY })\r\n gsap.set(rightImageStrip, { y: rightY })\r\n gsap.set(mobileImageStrip, { x: mobileX })\r\n // console.log('leftY at ' + leftY)\r\n } else {\r\n // tween the speed down to a slow scroll with a fast intro\r\n gsap.to(props, {\r\n speed: 30,\r\n mobileSpeed: 20,\r\n duration: 1.5,\r\n ease: 'power4.out',\r\n onComplete: startGlobe,\r\n })\r\n }\r\n lastTime = Date.now()\r\n requestAnimationFrame(animateImages)\r\n }\r\n\r\n // sets the lighting after globe ready so the objects are all available\r\n function initializeGlobe() {\r\n console.log('initializeGlobe')\r\n\r\n // wait for scene to be populated (asynchronously)\r\n const directionalLight = globe\r\n .scene()\r\n .children.find((obj3d) => obj3d.type === 'DirectionalLight')\r\n // directionalLight && directionalLight.position.set(1, 1, 1) // change light position to see the specularMap's effect\r\n directionalLight.intensity = 0\r\n\r\n const ambientLight = globe\r\n .scene()\r\n .children.find((obj3d) => obj3d.type === 'AmbientLight')\r\n // directionalLight && directionalLight.position.set(1, 1, 1) // change light position to see the specularMap's effect\r\n ambientLight.intensity = 1.35\r\n\r\n console.log('directionalLight is ', directionalLight)\r\n console.log('ambientLight is ', ambientLight)\r\n // console.log('globe is ', globe)\r\n // console.log('scene is ', globe.scene())\r\n // console.log('children is ', globe.scene().children)\r\n // console.log('children count is ', globe.scene().children.length)\r\n // console.log('type 1 is ', globe.scene().children[1])\r\n resizeGlobe()\r\n // startGlobe()\r\n\r\n // wait for the globe animation to finish, then start the images\r\n setTimeout(startImages, 1250)\r\n }\r\n\r\n function resizeGlobe() {\r\n const width = window.innerWidth\r\n if (globe.controls.enabled && width < 800) {\r\n globe.controls.enabled = false\r\n globe.enablePointerInteraction(false)\r\n } else if (\r\n globe.controls.enablePointerInteraction === false &&\r\n width >= 800\r\n ) {\r\n globe.controls.enabled = true\r\n globe.enablePointerInteraction(true)\r\n }\r\n // if (width <= 768) {\r\n // globe.width([1400])\r\n // globe.height([1400])\r\n // } else {\r\n // globe.width([1400])\r\n // globe.height([1400])\r\n // }\r\n }\r\n\r\n function startGlobe() {\r\n console.log('startGlobe ', globe)\r\n if (window.innerWidth > 800) {\r\n globe.enablePointerInteraction(true)\r\n globe.controls().enabled = true\r\n }\r\n globe.controls().enableZoom = false\r\n globe.controls().autoRotate = true\r\n globe.controls().autoRotateSpeed = 0.5\r\n let intervalId = setInterval(startRing, 1000)\r\n }\r\n\r\n let ringIndex = 0\r\n function startRing() {\r\n // let lat = (Math.random() - 0.5) * 180\r\n // let lng = (Math.random() - 0.5) * 360\r\n let lat = ringData[ringIndex].lat\r\n let lng = ringData[ringIndex].lng\r\n\r\n // make custom point for each data set or they don't match to remove them later\r\n let ringPoint = { lat: lat, lng: lng }\r\n // console.log('ringPoint at ', ringPoint)\r\n globe.ringsData([...globe.ringsData(), ringPoint])\r\n setTimeout(() => {\r\n // console.log('remove ring ', ringPoint)\r\n globe.ringsData(globe.ringsData().filter((r) => r !== ringPoint))\r\n }, 3000)\r\n\r\n // make custom point for each data set or they don't match to remove them later\r\n let circlePoint = { lat: lat, lng: lng }\r\n // console.log('circlePoint at ', circlePoint)\r\n globe.pointsData([...globe.pointsData(), circlePoint])\r\n setTimeout(() => {\r\n // console.log('remove point ', circlePoint)\r\n globe.pointsData(globe.pointsData().filter((s) => s !== circlePoint))\r\n }, 4700)\r\n\r\n ringIndex++\r\n if (ringIndex >= ringData.length) {\r\n ringIndex = 0\r\n }\r\n }\r\n}\r\n\r\nexport default LandingPage\r\n","export const config = {\r\n // Titleist Production values\r\n // apiKey: 'AIzaSyDP7Ad6uiQCwQs26JGeiQxUdCRMSjo7ppU',\r\n mapId: 'bf9f227cc229ed43',\r\n // courseSearchURL: \"https://test.titleist.com/api/prov1stories/getcourses\",\r\n // submitStoryURL: \"https://test.titleist.com/api/prov1stories/submitstory\",\r\n // submitSweepsURL: \"https://test.titleist.com/api/prov1stories/entersweeps\",\r\n // getCourseStoriesURL: \"https://test.titleist.com/api/prov1stories/GetStories\",\r\n // featuredStoriesURL:\r\n // \"https://test.titleist.com/api/prov1stories/getfeaturedstories\",\r\n\r\n // ETS Test values\r\n // apiKey: \"AIzaSyAp8eRLpnmuQj0gwJEF2yHm6vU6RkIpH-A\",\r\n // mapId: \"f02da6c54308c108\",\r\n // featuredStoriesURL: \"../fake-server-calls/featured-stories.json\",\r\n // courseSearchURL: \"../fake-server-calls/search-results.json\",\r\n // courseSearchURL: \"http://localhost:8080/fake-course-search-results/\",\r\n // getCourseStoriesURL: \"http://localhost:8080/fake-course-stories\",\r\n // submitStoryURL: \"http://localhost:8080/fake-course-search-results/\",\r\n // submitSweepsURL: 'http://localhost:8080/fake-course-search-results/',\r\n\r\n mobileWidth: 800,\r\n panelOffset: 900,\r\n openDuration: 0.5,\r\n closeDuration: 0.5,\r\n // max courses shown in the results panel and max dots on the map at once\r\n maxResults: 40,\r\n // map zoom level where you start to get search this area buttons\r\n detailZoomLevel: 6,\r\n // zoom level when you click on a ring\r\n clickZoomLevel: 11,\r\n // default values for map positioning and initial rings. Can be overrided with a locale code version of the same data\r\n mapData: {\r\n default: {\r\n // initialZoom: 3,\r\n // initialPosition: { lat: 37.09, lng: -95.712 },\r\n initialZoom: 3.5,\r\n initialPosition: { lat: 40.85, lng: -98.78 },\r\n initialCourses: [\r\n {\r\n id: 4259,\r\n name: 'Palm Beach Par 3 Golf Club',\r\n location: 'Palm Beach, FL',\r\n lat: 26.63272,\r\n lng: -80.03882,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 5466,\r\n name: 'Bayonet/blackhorse Golf Course',\r\n location: 'Seaside, CA ',\r\n lat: 36.63027,\r\n lng: -121.8209,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 5510,\r\n name: 'Pasatiempo Golf Club',\r\n location: 'Santa Cruz, CA ',\r\n lat: 37.00415,\r\n lng: -122.026,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 7925,\r\n name: 'Caledonia Golf & Fish Club',\r\n location: 'Pawleys Island, SC ',\r\n lat: 33.45243,\r\n lng: -79.15503,\r\n storyCount: 3,\r\n },\r\n {\r\n id: 11520,\r\n name: 'Sweetens Cove Golf Club',\r\n location: 'S Pittsburg, TN ',\r\n lat: 35.04994,\r\n lng: -85.72229,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 1810,\r\n name: 'Clearview Golf & Country Club',\r\n location: 'Canton, OH ',\r\n lat: 40.77341,\r\n lng: -81.24826,\r\n storyCount: 2,\r\n },\r\n {\r\n id: 933,\r\n name: 'Oak Hill Country Club',\r\n location: 'Rochester, NY ',\r\n lat: 43.11283,\r\n lng: -77.53276,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16213,\r\n name: 'Winged Foot Golf Club',\r\n location: 'Mamaroneck, NY ',\r\n lat: 40.952,\r\n lng: -73.74595,\r\n storyCount: 2,\r\n },\r\n\r\n {\r\n id: 790,\r\n name: 'Country Club Of New Bedford',\r\n location: 'N Dartmouth, MA',\r\n lat: 41.6422,\r\n lng: -70.9746,\r\n storyCount: 1,\r\n },\r\n\r\n {\r\n id: 8154,\r\n name: 'Oakwing Golf Club',\r\n location: 'Alexandria, LA',\r\n lat: 31.31929,\r\n lng: -92.52753,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 5671,\r\n name: 'Mauna Kea Golf Pro Shop',\r\n location: 'Kamuela, HI',\r\n lat: 20.00604,\r\n lng: -155.8244,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 2608,\r\n name: 'Sugarwood Golf Course',\r\n location: 'Lavalette, WV',\r\n lat: 38.32286,\r\n lng: -82.44682,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 7196,\r\n name: 'Riverchase Golf Course',\r\n location: 'Coppell, TX',\r\n lat: 32.9557,\r\n lng: -96.94587,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 4651,\r\n name: 'Mid Pines Inn & Golf Club',\r\n location: 'Southern Pnes, NC',\r\n lat: 35.19475,\r\n lng: -79.39204,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 10597,\r\n name: 'Streamsong Resort',\r\n location: 'Bowling Green, FL',\r\n lat: 27.6929,\r\n lng: -81.93434,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 5745,\r\n name: 'Prestwick Golf Club',\r\n location: 'Woodbury, MN',\r\n lat: 44.89764,\r\n lng: -92.91257,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 1706,\r\n name: 'Wanumetonomy Golf & Country Cl',\r\n location: 'Middletown, RI',\r\n lat: 41.53634,\r\n lng: -71.29861,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 7323,\r\n name: 'River View Golf',\r\n location: 'Santa Ana, CA',\r\n lat: 33.76665,\r\n lng: -117.8925,\r\n storyCount: 1,\r\n },\r\n \r\n ],\r\n },\r\n au: {\r\n initialZoom: 4,\r\n initialPosition: { lat: -25.094, lng: -228.44 },\r\n initialCourses: [\r\n {\r\n id: 16356,\r\n name: 'Barnbougle Dunes',\r\n location: 'Bridport, TAS',\r\n lat: -41.01549,\r\n lng: 147.4375,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 16930,\r\n name: 'Yallourn Golf Club',\r\n location: 'Newborough, VIC',\r\n lat: -38.17742,\r\n lng: 146.3168,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16308,\r\n name: 'Bargara Golf Club',\r\n location: 'Bargara, QLD',\r\n lat: -24.82087,\r\n lng: 152.4648,\r\n storyCount: 1,\r\n },\r\n ],\r\n },\r\n ca: {\r\n initialZoom: 4,\r\n initialPosition: { lat: 56.0, lng: -102.8 },\r\n initialCourses: [{\r\n id: 17195,\r\n name: 'The Toronto Hunt Golf Club',\r\n location: 'Scarborough, ON',\r\n lat: 43.68085,\r\n lng: -79.27209,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17823,\r\n name: 'Don Valley Golf Club',\r\n location: 'Willowdale, ON',\r\n lat: 43.74879,\r\n lng: -79.40817,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17480,\r\n name: 'Chester Golf Club',\r\n location: 'Chester, NS',\r\n lat: 44.53632,\r\n lng: -64.22233,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16967,\r\n name: 'Kindersley Regional Park & Golf Course',\r\n location: 'Kindersley, SK',\r\n lat: 51.4563,\r\n lng: -109.147,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 16978,\r\n name: 'Kananaskis Country Golf',\r\n location: 'Kananaskis, AB',\r\n lat: 50.90282,\r\n lng: -115.1434,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17022,\r\n name: 'Bighorn Golf & Country Club',\r\n location: 'Kamloops, BC',\r\n lat: 50.68837,\r\n lng: -120.2968,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17170,\r\n name: 'Whitlock Golf & Country Club',\r\n location: 'Hudson, QC',\r\n lat: 45.45344,\r\n lng: -74.16488,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17237,\r\n name: 'Country Meadows Golf Club',\r\n location: 'Indian Mountain, NB',\r\n lat: 46.16061,\r\n lng: -64.95757,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17460,\r\n name: 'Transcona Golf Club',\r\n location: 'Winnipeg, MB',\r\n lat: 49.88545,\r\n lng: -97.02239,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17869,\r\n name: 'Algonquin Resort Golf Club',\r\n location: 'St. Andrews, NB',\r\n lat: 45.08313,\r\n lng: -67.07608,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17878,\r\n name: 'Clyde River Golf Club',\r\n location: 'Clyde River, PE',\r\n lat: 46.21351,\r\n lng: -63.26505,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 18001,\r\n name: 'Terra Nova Golf Resort',\r\n location: 'Port Blandford, NL',\r\n lat: 48.38319,\r\n lng: -54.19691,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 18053,\r\n name: 'Olympic View Golf Club',\r\n location: 'Victoria, BC',\r\n lat: 48.40323,\r\n lng: -123.5193,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17372,\r\n name: 'Timber Ridge Golf Club',\r\n location: 'Brighton, ON',\r\n lat: 44.07512,\r\n lng: -77.70062,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17541,\r\n name: 'Le Parcours Du Cerf',\r\n location: 'Longueuil, QC',\r\n lat: 45.56073,\r\n lng: -73.45215,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17242,\r\n name: 'Golf Rivermead',\r\n location: 'Gatineau, QC',\r\n lat: 45.39507,\r\n lng: -75.79261,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17117,\r\n name: 'Turtle Creek Golf Club',\r\n location: 'Campbellville, ON',\r\n lat: 43.53706,\r\n lng: -80.06519,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17117,\r\n name: 'Turtle Creek Golf Club',\r\n location: 'Campbellville, ON',\r\n lat: 43.53706,\r\n lng: -80.06519,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 18040,\r\n name: 'Niakwa Country Club',\r\n location: 'Winnipeg, MB',\r\n lat: 49.85493,\r\n lng: -97.09626,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 17635,\r\n name: 'Predator Ridge Golf Club',\r\n location: 'Vernon, BC',\r\n lat: 50.18834,\r\n lng: -119.388,\r\n storyCount: 1,\r\n },\r\n ],\r\n },\r\n cn: {\r\n initialZoom: 4,\r\n initialPosition: { lat: 36.4, lng: -255.69 },\r\n initialCourses: [],\r\n },\r\n de: {\r\n initialZoom: 5,\r\n initialPosition: { lat: 51.11, lng: 10.54 },\r\n initialCourses: [],\r\n },\r\n es: {\r\n initialZoom: 3,\r\n initialPosition: { lat: -12.28, lng: -77.32 },\r\n initialCourses: [],\r\n },\r\n fr: {\r\n initialZoom: 5,\r\n initialPosition: { lat: 45, lng: 0 },\r\n initialCourses: [\r\n {\r\n id: 19393,\r\n name: 'Pau Golf Club',\r\n location: 'Billere',\r\n lat: 43.31429,\r\n lng: -0.3983829,\r\n storyCount: 1,\r\n },\r\n ],\r\n },\r\n 'fr-ca': {\r\n initialZoom: 4,\r\n initialPosition: { lat: 60.73, lng: -102.8 },\r\n initialCourses: [],\r\n },\r\n ie: {\r\n initialZoom: 5,\r\n initialPosition: { lat: 54.12, lng: -1.47 },\r\n initialCourses: [\r\n {\r\n id: 16214,\r\n name: 'Royal County Down Golf Club',\r\n location: 'Newscastle, UK ',\r\n lat: 54.21783,\r\n lng: -5.88313,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 21788,\r\n name: 'DYRHAM PARK GOLF CLUB',\r\n location: 'BARNET',\r\n lat: 51.67216,\r\n lng: -0.230974,\r\n storyCount: 1,\r\n },\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22667,\r\n\t\t name: \"ROGANSTOWN GOLF CLUB\",\r\n\t\t location: \"SWORDS\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.4869,\r\n\t\t lng: -6.273279\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21852,\r\n\t\t name: \"FAITHLEGG GOLF CLUB\",\r\n\t\t location: \"FAITHLEGG\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.25804,\r\n\t\t lng: -7.024572\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22326,\r\n\t\t name: \"MALLOW GOLF CLUB\",\r\n\t\t location: \"MALLOW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.12798,\r\n\t\t lng: -8.626767\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22667,\r\n\t\t name: \"ROGANSTOWN GOLF CLUB\",\r\n\t\t location: \"SWORDS\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.4869,\r\n\t\t lng: -6.273279\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21852,\r\n\t\t name: \"FAITHLEGG GOLF CLUB\",\r\n\t\t location: \"FAITHLEGG\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.25804,\r\n\t\t lng: -7.024572\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22326,\r\n\t\t name: \"MALLOW GOLF CLUB\",\r\n\t\t location: \"MALLOW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.12798,\r\n\t\t lng: -8.626767\r\n\t\t}\r\n ],\r\n },\r\n jp: {\r\n initialZoom: 5,\r\n initialPosition: { lat: 39.46, lng: -220.31 },\r\n initialCourses: [],\r\n },\r\n ko: {\r\n initialZoom: 6,\r\n initialPosition: { lat: 38.36, lng: -231.34 },\r\n initialCourses: [\r\n {\r\n id: 24184,\r\n name: '오크밸리',\r\n location: '원주, ',\r\n lat: 37.4382,\r\n lng: 127.8137,\r\n storyCount: 0,\r\n },\r\n ],\r\n },\r\n my: {\r\n initialZoom: 4,\r\n initialPosition: { lat: 64.15, lng: 18.83 },\r\n initialCourses: [],\r\n },\r\n se: {\r\n initialZoom: 4,\r\n initialPosition: { lat: 64.15, lng: 18.83 },\r\n initialCourses: [\r\n {\r\n id: 23309,\r\n name: 'BOKSKOGENS GK',\r\n location: 'Bara, ',\r\n lat: 55.55146,\r\n lng: 13.228,\r\n storyCount: 0,\r\n },\r\n ],\r\n },\r\n sg: {\r\n initialZoom: 4,\r\n initialPosition: { lat: 8.04, lng: -252.29 },\r\n initialCourses: [\r\n {\r\n id: 21080,\r\n name: 'The Bluffs, Ho Tram',\r\n location: 'Ba Ria, Vung Tau, VNM',\r\n lat: 10.48051,\r\n lng: 107.4465,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21016,\r\n name: 'Riverdale Golf',\r\n location: ', BKK',\r\n lat: 13.98069,\r\n lng: 100.5399,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21035,\r\n name: 'Sentosa Golf Club',\r\n location: 'Singapore, ',\r\n lat: 1.244026,\r\n lng: 103.8291,\r\n storyCount: 0,\r\n },\r\n ],\r\n },\r\n th: {\r\n initialZoom: 6,\r\n initialPosition: { lat: 16.74, lng: -258.27 },\r\n initialCourses: [\r\n {\r\n id: 21080,\r\n name: 'The Bluffs, Ho Tram',\r\n location: 'Ba Ria, Vung Tau, VNM',\r\n lat: 10.48051,\r\n lng: 107.4465,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21016,\r\n name: 'Riverdale Golf',\r\n location: ', BKK',\r\n lat: 13.98069,\r\n lng: 100.5399,\r\n storyCount: 0,\r\n },\r\n {\r\n id: 21035,\r\n name: 'Sentosa Golf Club',\r\n location: 'Singapore, ',\r\n lat: 1.244026,\r\n lng: 103.8291,\r\n storyCount: 0,\r\n },\r\n ],\r\n },\r\n uk: {\r\n initialZoom: 5,\r\n initialPosition: { lat: 54.12, lng: -1.47 },\r\n initialCourses: [\r\n {\r\n id: 16214,\r\n name: 'Royal County Down Golf Club',\r\n location: 'Newscastle, UK ',\r\n lat: 54.21783,\r\n lng: -5.88313,\r\n storyCount: 1,\r\n },\r\n {\r\n id: 21788,\r\n name: 'DYRHAM PARK GOLF CLUB',\r\n location: 'BARNET',\r\n lat: 51.67216,\r\n lng: -0.230974,\r\n storyCount: 1,\r\n },\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22667,\r\n\t\t name: \"ROGANSTOWN GOLF CLUB\",\r\n\t\t location: \"SWORDS\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.4869,\r\n\t\t lng: -6.273279\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21852,\r\n\t\t name: \"FAITHLEGG GOLF CLUB\",\r\n\t\t location: \"FAITHLEGG\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.25804,\r\n\t\t lng: -7.024572\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22326,\r\n\t\t name: \"MALLOW GOLF CLUB\",\r\n\t\t location: \"MALLOW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.12798,\r\n\t\t lng: -8.626767\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21719,\r\n\t\t name: \"DEESIDE GOLF CLUB\",\r\n\t\t location: \"ABERDEEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 57.11197,\r\n\t\t lng: -2.190059\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22436,\r\n\t\t name: \"MURRAYSHALL HOUSE HOTEL\",\r\n\t\t location: \"PERTH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 56.41961,\r\n\t\t lng: -3.368831\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22646,\r\n\t\t name: \"RENFREW GOLF CLUB\",\r\n\t\t location: \"RENFREW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.88273,\r\n\t\t lng: -4.402794\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22539,\r\n\t\t name: \"PARKLANDS GOLF CLUB\",\r\n\t\t location: \"NEWCASTLE UPON TYNE\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 55.03724,\r\n\t\t lng: -1.609535\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22846,\r\n\t\t name: \"ST ANNES OLD LINKS GOLF CLUB\",\r\n\t\t location: \"ST ANNES\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.76291,\r\n\t\t lng: -3.038358\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23230,\r\n\t\t name: \"WOOLTON GOLF SHOP\",\r\n\t\t location: \"WOOLTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.36718,\r\n\t\t lng: -2.862517\r\n\t\t},\r\n\t\t{\r\n\t\t id: 23011,\r\n\t\t name: \"THE WARWICKSHIRE GOLF CLUB\",\r\n\t\t location: \"\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.30748,\r\n\t\t lng: -1.581276\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21753,\r\n\t\t name: \"DRAYTON PARK GOLF CLUB\",\r\n\t\t location: \"DRAYTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.63594,\r\n\t\t lng: -1.313859\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22439,\r\n\t\t name: \"MUSWELL HILL GOLF CLUB\",\r\n\t\t location: \"WOOD GREEN\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.60074,\r\n\t\t lng: -0.1370333\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22709,\r\n\t\t name: \"ROYAL ST GEORGES GOLF CLUB\",\r\n\t\t location: \"SANDWICH\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 51.27369,\r\n\t\t lng: 1.366992\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22432,\r\n\t\t name: \"MULLION GOLF CLUB\",\r\n\t\t location: \"HELSTON\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 50.03809,\r\n\t\t lng: -5.261853\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22667,\r\n\t\t name: \"ROGANSTOWN GOLF CLUB\",\r\n\t\t location: \"SWORDS\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 53.4869,\r\n\t\t lng: -6.273279\r\n\t\t},\r\n\t\t{\r\n\t\t id: 21852,\r\n\t\t name: \"FAITHLEGG GOLF CLUB\",\r\n\t\t location: \"FAITHLEGG\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.25804,\r\n\t\t lng: -7.024572\r\n\t\t},\r\n\t\t{\r\n\t\t id: 22326,\r\n\t\t name: \"MALLOW GOLF CLUB\",\r\n\t\t location: \"MALLOW\",\r\n\t\t storyCount: 1,\r\n\t\t lat: 52.12798,\r\n\t\t lng: -8.626767\r\n\t\t}\r\n ],\r\n },\r\n },\r\n}\r\n","/**\r\n * querySelector wrapper\r\n *\r\n * @param {string} selector Selector to query\r\n * @param {Element} [scope] Optional scope element for the selector\r\n */\r\nexport function qs(selector, scope) {\r\n return (scope || document).querySelector(selector)\r\n}\r\n\r\nexport function qsArray(selector, scope) {\r\n let nodeList = (scope || document).querySelectorAll(selector)\r\n let arr = []\r\n for (let i = 0; i < nodeList.length; i++) {\r\n arr.push(nodeList[i])\r\n }\r\n return arr\r\n}\r\n\r\n/**\r\n * addEventListener wrapper\r\n *\r\n * @param {Element|Window} target Target Element\r\n * @param {string} type Event name to bind to\r\n * @param {Function} callback Event callback\r\n * @param {boolean} [capture] Capture the event\r\n */\r\nexport function $on(target, type, callback, capture) {\r\n target.addEventListener(type, callback, !!capture)\r\n}\r\n\r\n/**\r\n * Attach a handler to an event for all elements matching a selector.\r\n *\r\n * @param {Element} target Element which the event must bubble to\r\n * @param {string} selector Selector to match\r\n * @param {string} type Event name\r\n * @param {Function} handler Function called when the event bubbles to target\r\n * from an element matching selector\r\n * @param {boolean} [capture] Capture the event\r\n */\r\n// export function $delegate(target, selector, type, handler, capture) {\r\n// const dispatchEvent = event => {\r\n// const targetElement = event.target;\r\n// const potentialElements = target.querySelectorAll(selector);\r\n// let i = potentialElements.length;\r\n//\r\n// while (i--) {\r\n// if (potentialElements[i] === targetElement) {\r\n// handler.call(targetElement, event);\r\n// break;\r\n// }\r\n// }\r\n// };\r\n//\r\n// $on(target, type, dispatchEvent, !!capture);\r\n// }\r\n\r\n/**\r\n * Returns a function, that, as long as it continues to be invoked, will not\r\n * be triggered. The function will be called after it stops being called for\r\n * N milliseconds. If `immediate` is passed, trigger the function on the\r\n * leading edge, instead of the trailing.\r\n *\r\n * @param {Function} func to be executed on debounce\r\n * @param {number} wait time in milliseconds\r\n * @param {boolean} immediate boolean\r\n *\r\n * */\r\nexport function debounce(func, wait, immediate) {\r\n let timeout\r\n return function () {\r\n let context = this,\r\n args = arguments\r\n let later = function () {\r\n timeout = null\r\n if (!immediate) func.apply(context, args)\r\n }\r\n let callNow = immediate && !timeout\r\n clearTimeout(timeout)\r\n timeout = setTimeout(later, wait)\r\n if (callNow) func.apply(context, args)\r\n }\r\n}\r\n\r\n/*!\r\n * Microsoft Internet Explorer Browser Test\r\n * */\r\nexport function isInternetExplorer() {\r\n let ua = window.navigator.userAgent\r\n\r\n let msie = ua.indexOf('MSIE ')\r\n if (msie > 0) {\r\n return true\r\n // IE 10 or older => return version number\r\n // return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\r\n }\r\n\r\n var trident = ua.indexOf('Trident/')\r\n if (trident > 0) {\r\n return true\r\n // IE 11 => return version number\r\n // let rv = ua.indexOf('rv:');\r\n // return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\r\n }\r\n\r\n // other browser\r\n return false\r\n}\r\n\r\n/*!\r\n * Microsoft Edge Browser Test\r\n * */\r\nexport function isEdge() {\r\n let ua = window.navigator.userAgent\r\n\r\n let edge = ua.indexOf('Edge/')\r\n if (edge > 0) {\r\n return true\r\n // // Edge (IE 12+) => return version number\r\n // return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\r\n }\r\n\r\n // other browser\r\n return false\r\n}\r\n\r\n/*\r\n * Google Analytic tracking function\r\n * */\r\n\r\nexport function trackEvent(category, action, label, value) {\r\n if (typeof dataLayer !== 'undefined') {\r\n var completedEvt = {\r\n event: 'GAEvent',\r\n eventCategory: category,\r\n eventAction: action,\r\n eventLabel: label,\r\n 'UA Event Value': value,\r\n app: 'Validate Map',\r\n }\r\n dataLayer.push(completedEvt)\r\n } else if (window.ga !== undefined && window.ga !== null) {\r\n window.ga('send', 'event', category, action, label, value)\r\n }\r\n console.log(\r\n 'event: ' + category + ', ' + action + ', ' + label + ', ' + value\r\n )\r\n}\r\n\r\n/*\r\n * Check for a query string variable and return the value if it exists, false if it doesn't exist\r\n * */\r\n\r\nexport function getQueryStringVariable(variable) {\r\n var query = window.location.search.substring(1)\r\n var vars = query.split('&')\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split('=')\r\n if (pair[0] == variable) {\r\n return pair[1]\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Shuffles array in place. ES6 version\r\n * @param {Array} a items An array containing the items.\r\n */\r\nexport function shuffle(arr) {\r\n const a = arr\r\n for (let i = a.length - 1; i > 0; i -= 1) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n ;[a[i], a[j]] = [a[j], a[i]]\r\n }\r\n return a\r\n}\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Grey panel that opens/closes on the left side of desktop layout\r\n */\r\nlet FeaturedPanel = function () {\r\n console.log('New FeaturedPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('featuredPanel')\r\n const panelContent = panelElement.querySelector('.panelContent')\r\n const recentElement = panelContent.querySelector('.recent')\r\n const openButton = panelElement.querySelector('#open-button')\r\n const closeButton = panelElement.querySelector('#close-button')\r\n const storyButton = panelElement.querySelector('#story-button')\r\n const menuButton = document.getElementById('menu-button')\r\n const searchInput = panelElement.querySelector('#featured-input')\r\n const noResultsMessage = panelElement.querySelector('.no-results-message')\r\n let noResults = false\r\n // const homeButton = panelElement.querySelector('#home-button')\r\n\r\n openButton.addEventListener('click', openClicked)\r\n menuButton.addEventListener('click', openClicked)\r\n closeButton.addEventListener('click', closeClicked)\r\n storyButton.addEventListener('click', storyClicked)\r\n searchInput.addEventListener('input', hideNoResults)\r\n // homeButton.addEventListener('click', homeClicked)\r\n // homeButton.classList.add('is-active')\r\n\r\n let isOpen = false\r\n let featuredData = undefined\r\n let rotationTimerId = -1\r\n let recentStoryIndex = 0\r\n // loadFeaturedStories()\r\n\r\n self.loadFeaturedStories = function () {\r\n // const url = config.featuredStoriesURL\r\n const url = window.mapPage.getURL('featuredStoriesURL')\r\n console.log('loadFeaturedStories ' + url)\r\n fetch(url)\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.result === null && data.error !== null) {\r\n console.log('Server error: ', data.error)\r\n window.mapPage.showErrorMessage()\r\n } else {\r\n featuredData = data\r\n // TODO: add error/result check here?\r\n // console.log('featured Data: ', featuredData)\r\n setFeaturedContent()\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n window.mapPage.showErrorMessage()\r\n })\r\n }\r\n\r\n function setFeaturedContent() {\r\n console.log('setFeaturedContent ', featuredData)\r\n // loop through featured stories (currently only 2)\r\n for (let i = 1; i <= 2; i++) {\r\n const featuredElement = panelContent.querySelector(\r\n '#feature' + i.toString()\r\n )\r\n featuredElement.querySelector('.title').innerHTML =\r\n featuredData.result.featured[i - 1].courseName\r\n featuredElement.querySelector('.location').innerHTML =\r\n featuredData.result.featured[i - 1].courseLocation\r\n featuredElement.querySelector('img').src =\r\n featuredData.result.featured[i - 1].imageData.secure_url\r\n featuredElement.querySelector('.image .name').innerHTML =\r\n featuredData.result.featured[i - 1].firstName +\r\n ' ' +\r\n featuredData.result.featured[i - 1].lastName\r\n\r\n featuredElement.storyData = featuredData.result.featured[i - 1]\r\n // bind to the cloneElement so you can access the storyData reference\r\n featuredElement.addEventListener(\r\n 'click',\r\n self.featuredStoryClicked.bind(featuredElement)\r\n // clickListener\r\n )\r\n }\r\n\r\n setRecentStoryContent()\r\n }\r\n\r\n self.showNoResults = function () {\r\n searchInput.classList.add('no-results')\r\n noResultsMessage.classList.add('is-active')\r\n noResults = true\r\n }\r\n\r\n // TODO start here\r\n function hideNoResults() {\r\n console.log('hideNoResults ' + noResults)\r\n if (noResults) {\r\n searchInput.classList.remove('no-results')\r\n noResultsMessage.classList.remove('is-active')\r\n noResults = false\r\n }\r\n }\r\n\r\n self.featuredStoryClicked = function (e) {\r\n console.log('storyClicked ', e)\r\n console.log('this.storyData is ', this.storyData)\r\n // this.removeEventListener('click', self.storyClicked.bind(this))\r\n // this.removeEventListener('click', this.clickListener)\r\n // set the course then open the story\r\n let courseData = {}\r\n courseData.name = this.storyData.courseName\r\n courseData.location = this.storyData.courseLocation\r\n courseData.id = this.storyData.courseID\r\n courseData.lat = this.storyData.lat\r\n courseData.lng = this.storyData.lng\r\n courseData.storyCount = 1\r\n window.mapPage.setNewCourseData(courseData)\r\n window.mapPage.moveToCourse(courseData)\r\n window.mapPage.storyClicked(this.storyData)\r\n\r\n // track featured story click\r\n trackEvent(\r\n 'Button',\r\n 'Featured Story',\r\n this.storyData.courseName + ' - ' + this.storyData.firstName\r\n )\r\n }\r\n\r\n function setRecentStoryContent() {\r\n recentElement.querySelector('.name').innerHTML =\r\n featuredData.result.recent[recentStoryIndex].firstName +\r\n ' ' +\r\n featuredData.result.recent[recentStoryIndex].lastName\r\n recentElement.querySelector('.courseName').innerHTML =\r\n featuredData.result.recent[recentStoryIndex].courseName\r\n recentElement.querySelector('.courseLocation').innerHTML =\r\n featuredData.result.recent[recentStoryIndex].courseLocation\r\n }\r\n\r\n function openClicked() {\r\n // console.log('FeaturedPanel.openClicked')\r\n openPanel()\r\n }\r\n\r\n function closeClicked() {\r\n // console.log('FeaturedPanel.closeClicked')\r\n closePanel()\r\n }\r\n\r\n function storyClicked() {\r\n // console.log('FeaturedPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.closeAllPanels()\r\n window.mapPage.searchModal.open()\r\n trackEvent('Validate Map Button', 'Add Story', 'From Featured Panel')\r\n }\r\n\r\n // function homeClicked() {\r\n // // console.log('FeaturedPanel.closeClicked')\r\n // closePanel()\r\n // }\r\n\r\n function recentStoryClicked(e) {\r\n console.log('recentStoryClicked ', e)\r\n\r\n let storyData = featuredData.result.recent[recentStoryIndex]\r\n console.log('storyData is ', storyData)\r\n\r\n // this.removeEventListener('click', self.storyClicked.bind(this))\r\n // this.removeEventListener('click', this.clickListener)\r\n // set the course then open the story\r\n let courseData = {}\r\n courseData.name = storyData.courseName\r\n courseData.location = storyData.courseLocation\r\n courseData.id = storyData.courseID\r\n courseData.lat = storyData.lat\r\n courseData.lng = storyData.lng\r\n courseData.storyCount = 1\r\n window.mapPage.setNewCourseData(courseData)\r\n window.mapPage.moveToCourse(courseData)\r\n window.mapPage.storyClicked(storyData)\r\n trackEvent(\r\n 'Button',\r\n 'Recent Story',\r\n storyData.courseName + ' - ' + storyData.firstName\r\n )\r\n }\r\n\r\n function startRecentStoriesRotation() {\r\n // console.log('FeaturedPanel.startRecentStoriesRotation()')\r\n if (rotationTimerId !== -1) {\r\n clearTimeout(rotationTimerId)\r\n rotationTimerId = -1\r\n }\r\n rotationTimerId = setTimeout(nextRecentStory, 3000)\r\n }\r\n\r\n function stopRecentStoriesRotation() {\r\n // console.log('FeaturedPanel.stopRecentStoriesRotation()')\r\n if (rotationTimerId !== -1) {\r\n clearTimeout(rotationTimerId)\r\n rotationTimerId = -1\r\n }\r\n }\r\n\r\n function nextRecentStory() {\r\n // console.log('FeaturedPanel.nextRecentStory()')\r\n clearTimeout(rotationTimerId)\r\n rotationTimerId = -1\r\n if (isOpen) {\r\n gsap.to(recentElement, {\r\n alpha: 0,\r\n duration: 0.3,\r\n onComplete: () => {\r\n recentStoryIndex++\r\n if (recentStoryIndex >= featuredData.result.recent.length) {\r\n recentStoryIndex = 0\r\n }\r\n setRecentStoryContent()\r\n gsap.to(recentElement, {\r\n alpha: 1,\r\n duration: 0.3,\r\n onComplete: () => {\r\n rotationTimerId = setTimeout(nextRecentStory, 3000)\r\n },\r\n })\r\n },\r\n })\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('FeaturedPanel.openPanel()')\r\n if (isOpen === false) {\r\n isOpen = true\r\n searchInput.value = ''\r\n hideNoResults()\r\n openButton.classList.remove('is-active')\r\n closeButton.classList.add('is-active')\r\n gsap.killTweensOf(panelElement)\r\n let xTarget = 280\r\n if (window.mapPage.isMobile()) {\r\n xTarget = '100vw'\r\n }\r\n gsap.to(panelElement, { x: xTarget })\r\n gsap.killTweensOf(panelContent)\r\n gsap.to(panelContent, { opacity: 1, duration: 0.3 })\r\n // TODO: start recent stories rotation timer\r\n startRecentStoriesRotation()\r\n\r\n // bind to the cloneElement so you can access the storyData reference\r\n recentElement.addEventListener('click', recentStoryClicked)\r\n // track panel open\r\n trackEvent('Validate Map Panel Open', 'Featured Panel', '')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n if (isOpen) {\r\n isOpen = false\r\n openButton.classList.add('is-active')\r\n closeButton.classList.remove('is-active')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0 })\r\n gsap.killTweensOf(panelContent)\r\n gsap.to(panelContent, { opacity: 0, duration: 0.3 })\r\n // TODO: stop recent stories rotation timer\r\n stopRecentStoriesRotation()\r\n\r\n // bind to the cloneElement so you can access the storyData reference\r\n recentElement.removeEventListener('click', recentStoryClicked)\r\n }\r\n }\r\n}\r\n\r\nexport default FeaturedPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet ResultsPanel = function () {\r\n console.log('New ResultsPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('resultsPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const addCourseLink = panelElement.querySelector('#add-course-link')\r\n const noResultsMessage = panelElement.querySelector('.no-results-message')\r\n const loadingMessage = panelElement.querySelector('.loading-message')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n addCourseLink.addEventListener('click', addCourseClicked)\r\n\r\n let isOpen = false\r\n let resultsData = {}\r\n\r\n function closeClicked() {\r\n // console.log('ResultsPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('ResultsPanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n panelElement.classList.add('is-open')\r\n noResultsMessage.classList.remove('is-active')\r\n loadingMessage.classList.add('is-active')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n }\r\n\r\n // clear old results from other searches\r\n // get the ul element\r\n const ul = panelElement.querySelector('#resultsList')\r\n // remove all the old results\r\n while (ul.firstChild) {\r\n ul.removeChild(ul.firstChild)\r\n }\r\n\r\n searchForCourses()\r\n\r\n window.mapPage.hideAreaButton()\r\n\r\n trackEvent('Validate Map Panel Open', 'Search Results Panel', '')\r\n }\r\n\r\n function searchForCourses() {\r\n // const url = config.courseSearchURL\r\n const url = window.mapPage.getURL('courseSearchURL')\r\n console.log('cors searchForCourses ' + url)\r\n const map = window.mapPage.getMap()\r\n console.log('map.getBounds json ', map.getBounds().toJSON())\r\n // console.log('map.getCenter json ', map.getCenter().toJSON())\r\n // console.log('map.getZoom ', map.getZoom())\r\n\r\n // POST json fetch sample\r\n // var data = new FormData()\r\n // data.append('json', JSON.stringify(map.getBounds().toJSON()))\r\n // data.append('json', map.getBounds().toJSON())\r\n // console.log('body data is ', data)\r\n\r\n // let headers = new Headers()\r\n // headers.append('content-type', 'application/json')\r\n // headers.append('Access-Control-Allow-Origin', 'http://localhost:8080')\r\n // headers.set('Authorization', 'Basic ' + btoa(username + ':' + password))\r\n // headers.set(\r\n // 'Authorization',\r\n // 'Basic ' + base64.encode(username + ':' + password)\r\n // )\r\n\r\n // var authUrl = location.origin + '/secured-path/'\r\n // console.log('begin session')\r\n // var authUrl = 'http://test.titleist.com/'\r\n // var http = new XMLHttpRequest()\r\n // http.open('get', authUrl, false, 'storefront', 'FJ2019')\r\n // http.send('')\r\n // if (http.status == 200) {\r\n // //location.href = authUrl;\r\n // console.log('Authentication success')\r\n // } else {\r\n // console.log('⚠️ Authentication failed.')\r\n // }\r\n // console.log('end session')\r\n\r\n let bodyData = map.getBounds().toJSON()\r\n bodyData.locale = window.locale\r\n console.log('form body is ' + JSON.stringify(bodyData))\r\n // prettier-ignore\r\n const options = {\r\n method: 'POST',\r\n mode: 'cors',\r\n // headers: headers,\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n // body: data,\r\n body: JSON.stringify(bodyData),\r\n }\r\n\r\n fetch(url, options)\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.result === null && data.error !== null) {\r\n console.log('Server error: ', data.error)\r\n window.mapPage.showErrorMessage()\r\n } else {\r\n resultsData = data\r\n // console.log('search results Data: ', JSON.stringify(resultsData))\r\n // TODO: error check for results vs error object?\r\n setResultsContent()\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n window.mapPage.showErrorMessage()\r\n })\r\n }\r\n\r\n function setResultsContent() {\r\n console.log('setResultsContent ', resultsData)\r\n if (\r\n resultsData.result.courses !== undefined &&\r\n resultsData.result.courses.length > 0\r\n ) {\r\n loadingMessage.classList.remove('is-active')\r\n // get the ul element\r\n const ul = panelElement.querySelector('#resultsList')\r\n // remove all the old results\r\n while (ul.firstChild) {\r\n ul.removeChild(ul.firstChild)\r\n }\r\n\r\n // start adding new items\r\n // TODO: stop at 10?\r\n let length = resultsData.result.courses.length\r\n if (length > config.maxResults) {\r\n length = config.maxResults\r\n }\r\n let course\r\n for (let i = 0; i < length; i++) {\r\n course = resultsData.result.courses[i]\r\n let li = document.createElement('li')\r\n if (course.storyCount > 0) {\r\n li.setAttribute('class', 'has-stories')\r\n }\r\n li.innerHTML = course.name\r\n li.courseData = course\r\n li.addEventListener('click', resultClicked)\r\n li.addEventListener('mouseover', highlightResult)\r\n li.addEventListener('mouseout', unhighlightResult)\r\n ul.appendChild(li)\r\n }\r\n\r\n // START HERE: Pass data back to the map to draw markers\r\n window.mapPage.drawRings(resultsData)\r\n window.mapPage.isSearching = false\r\n } else {\r\n console.log('no results ', noResultsMessage)\r\n window.mapPage.isSearching = false\r\n noResultsMessage.classList.add('is-active')\r\n loadingMessage.classList.remove('is-active')\r\n }\r\n // TODO: error check for results vs error object?\r\n }\r\n\r\n function highlightResult(e) {\r\n // console.log('ResultsPanel.highlightResult ', e)\r\n let courseData = e.target.courseData\r\n window.mapPage.highlightRing(courseData)\r\n }\r\n\r\n function unhighlightResult(e) {\r\n // console.log('ResultsPanel.unhighlightResult ', e)\r\n let courseData = e.target.courseData\r\n window.mapPage.unhighlightRing(courseData)\r\n }\r\n\r\n function resultClicked(e) {\r\n console.log('ResultsPanel.resultClicked ', e)\r\n let courseData = e.target.courseData\r\n console.log(\r\n 'clicked course is ' + courseData.name + ' in ' + courseData.location\r\n )\r\n window.mapPage.resultClicked(courseData)\r\n trackEvent('Validate Map Button', 'Search Results', courseData.name)\r\n }\r\n\r\n function addCourseClicked(e) {\r\n console.log('ResultsPanel.addCourseClicked ', e)\r\n self.close()\r\n window.mapPage.addCoursePanel.open()\r\n trackEvent('Validate Map Button', 'Add Course', 'From Search Results Panel')\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('ResultsPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default ResultsPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet SearchModal = function () {\r\n console.log('New SearchModal()')\r\n let self = this\r\n const panelElement = document.getElementById('searchModal')\r\n const closeButton = panelElement.querySelector('#modal-close-button')\r\n const searchInput = panelElement.querySelector('#modal-input')\r\n const noResultsMessage = panelElement.querySelector('.no-results-message')\r\n let noResults = false\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n searchInput.addEventListener('input', hideNoResults)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('SearchModal.closeClicked')\r\n closePanel()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n window.mapPage.featuredPanel.open()\r\n }\r\n\r\n self.showNoResults = function () {\r\n searchInput.classList.add('no-results')\r\n noResultsMessage.classList.add('is-active')\r\n noResults = true\r\n }\r\n\r\n // TODO start here\r\n function hideNoResults() {\r\n console.log('hideNoResults ' + noResults)\r\n if (noResults) {\r\n searchInput.classList.remove('no-results')\r\n noResultsMessage.classList.remove('is-active')\r\n noResults = false\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: '-50%', y: config.panelOffset * -1 })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('SearchModal.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n searchInput.value = ''\r\n hideNoResults()\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.set(panelElement, { x: '-50%', y: config.panelOffset * -1 })\r\n gsap.to(panelElement, { y: '-50%', duration: config.openDuration })\r\n window.mapPage.mode = window.mapPage.modes.SUBMIT\r\n trackEvent('Validate Map Panel Open', 'Search Modal')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('SearchModal.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n y: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default SearchModal\r\n","import { config } from './config'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet LocaleModal = function () {\r\n console.log('New LocaleModal()')\r\n let self = this\r\n const panelElement = document.getElementById('localeModal')\r\n const blockerElement = document.getElementById('localeBlocker')\r\n const closeButton = panelElement.querySelector('#modal-close-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('LocaleModal.closeClicked')\r\n closePanel()\r\n // window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n // window.mapPage.featuredPanel.open()\r\n }\r\n\r\n gsap.set(panelElement, { x: '-50%', y: config.panelOffset * -1 })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('LocaleModal.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n blockerElement.classList.add('is-open')\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.set(panelElement, { x: '-50%', y: config.panelOffset * -1 })\r\n gsap.to(panelElement, { y: '-50%', duration: config.openDuration })\r\n // window.mapPage.mode = window.mapPage.modes.SUBMIT\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('LocaleModal.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n blockerElement.classList.remove('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n y: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default LocaleModal\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet EnterStoryDataPanel = function () {\r\n console.log('New EnterStoryDataPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('enterStoryDataPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n console.log('EnterStoryDataPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n }\r\n\r\n function isValid() {\r\n let valid = true\r\n\r\n // Parsley isValid does not update UI message\r\n // Parsley validate does update UI messages\r\n\r\n // validate ball flight\r\n if ($('#flightLow').parsley().isValid() === false) {\r\n panelElement.querySelector('#flight').classList.add('error')\r\n valid = false\r\n console.log('flight is not valid')\r\n } else {\r\n panelElement.querySelector('#flight').classList.remove('error')\r\n console.log('flight is valid')\r\n }\r\n\r\n // validate ball feel\r\n if ($('#feel-very-soft').parsley().isValid() === false) {\r\n panelElement.querySelector('#feel').classList.add('error')\r\n valid = false\r\n console.log('feel is not valid')\r\n } else {\r\n panelElement.querySelector('#feel').classList.remove('error')\r\n console.log('feel is valid')\r\n }\r\n\r\n // validate ball long spin\r\n if ($('#long-spin-little').parsley().isValid() === false) {\r\n panelElement.querySelector('#long-spin').classList.add('error')\r\n valid = false\r\n console.log('long spin is not valid')\r\n } else {\r\n panelElement.querySelector('#long-spin').classList.remove('error')\r\n console.log('long spin is valid')\r\n }\r\n\r\n // validate ball short spin\r\n if ($('#short-spin-little').parsley().isValid() === false) {\r\n panelElement.querySelector('#short-spin').classList.add('error')\r\n valid = false\r\n console.log('short spin is not valid')\r\n } else {\r\n panelElement.querySelector('#short-spin').classList.remove('error')\r\n console.log('short spin is valid')\r\n }\r\n\r\n // validate story text\r\n $('#story-text').parsley().validate()\r\n if ($('#story-text').parsley().isValid() === false) {\r\n // panelElement.querySelector('#short-spin').classList.add('error')\r\n valid = false\r\n console.log('story text is not valid')\r\n } else {\r\n // panelElement.querySelector('#short-spin').classList.remove('error')\r\n console.log('story text is valid')\r\n }\r\n\r\n return valid\r\n }\r\n\r\n function nextClicked() {\r\n console.log('EnterStoryDataPanel.nextClicked')\r\n if (isValid()) {\r\n closePanel()\r\n // var ele = document.getElementsByName('ball')\r\n let ele = panelElement.querySelectorAll('[name=\"ball\"]')\r\n for (let i = 0; i < ele.length; i++) {\r\n if (ele[i].checked) {\r\n // document.getElementById('result').innerHTML = 'Gender: ' + ele[i].value\r\n console.log('ball is ' + ele[i].value)\r\n }\r\n }\r\n\r\n window.mapPage.uploadImagePanel.open()\r\n trackEvent(\r\n 'Validate Map Button',\r\n 'Enter Story Data Next',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n function setCourseData() {\r\n let courseData = window.mapPage.getSelectedCourseData()\r\n panelElement.querySelector('.courseName').innerHTML = courseData.name\r\n panelElement.querySelector('.courseLocation').innerHTML =\r\n courseData.location\r\n }\r\n\r\n self.clear = function () {\r\n $('input[name=flight]').prop('checked', false)\r\n $('input[name=feel]').prop('checked', false)\r\n $('input[name=longSpin]').prop('checked', false)\r\n $('input[name=shortSpin]').prop('checked', false)\r\n panelElement.querySelector('#story-text').value = ''\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('EnterStoryDataPanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n setCourseData()\r\n self.clear()\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n window.mapPage.hideAreaButton()\r\n // track panel open\r\n trackEvent(\r\n 'Validate Map Panel Open',\r\n 'Enter Story Data Panel',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('EnterStoryDataPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default EnterStoryDataPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet UploadImagePanel = function () {\r\n console.log('New UploadImagePanel()')\r\n let self = this\r\n const panelElement = document.getElementById('uploadImagePanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n const uploadButton = panelElement.querySelector('#browse-button')\r\n const uploadWidget = cloudinary.createUploadWidget(\r\n {\r\n cloudName: 'acushnetcompany',\r\n uploadPreset: 'k7dsemdq',\r\n folder: 'prov1_stories',\r\n sources: ['url', 'local'],\r\n showAdvancedOptions: false,\r\n // cropping: true,\r\n // cropping_aspect_ratio: 1,\r\n multiple: false,\r\n defaultSource: 'local',\r\n },\r\n (error, result) => {\r\n var err2 = error\r\n var info2 = result\r\n console.log('NEW CLOUDINARY EVENT')\r\n console.log('cloudinary result ', result)\r\n console.log('cloudinary result.event ', result.event)\r\n if (result.event == 'close') {\r\n // parent.closeModal()\r\n console.log('result.event = close!')\r\n // TODO: Update UI witha preview image?\r\n } else if (result.event == 'success') {\r\n console.log(JSON.stringify(result))\r\n // var pathParts = result.info.path.split('/')\r\n // console.log('pathParts: ', pathParts)\r\n // var path = pathParts[pathParts.length - 1]\r\n // console.log('path: ', path)\r\n // parent.setUploadedFile(path, result.info.thumbnail_url)\r\n console.log('result.info.thumbnail_url: ', result.info.thumbnail_url)\r\n console.log('result.info.url: ', result.info.url)\r\n console.log('result.info: ', result.info)\r\n window.mapPage.setUploadedImageData(result.info)\r\n console.log('img is ', panelElement.querySelector('#upload-preview'))\r\n if (result.info.secure_url) {\r\n panelElement.querySelector('#upload-preview').src =\r\n result.info.secure_url\r\n }\r\n }\r\n\r\n // if (!error && result && result.event === 'success') {\r\n // console.log('Done! Here is the image info: ', result.info)\r\n // }\r\n }\r\n )\r\n\r\n /*\r\n const uploadWidget = cloudinary.openUploadWidget(\r\n {\r\n cloudName: 'acushnetcompany',\r\n uploadPreset: 'k7dsemdq',\r\n folder: 'user_avatars',\r\n sources: ['url', 'local'],\r\n showAdvancedOptions: false,\r\n cropping: true,\r\n cropping_aspect_ratio: 1,\r\n multiple: false,\r\n defaultSource: 'local',\r\n },\r\n (err, result) => {\r\n var err2 = err\r\n var info2 = result\r\n //console.log(result.event);\r\n if (result.event == 'close') {\r\n parent.closeModal()\r\n } else if (result.event == 'success') {\r\n console.log(result.event)\r\n console.log(JSON.stringify(result))\r\n var pathParts = result.info.path.split('/')\r\n var path = pathParts[pathParts.length - 1]\r\n parent.setUploadedFile(path, result.info.thumbnail_url)\r\n }\r\n }\r\n )\r\n */\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n uploadButton.addEventListener('click', uploadClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('UploadImagePanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n }\r\n\r\n function uploadClicked() {\r\n uploadWidget.open()\r\n }\r\n\r\n function nextClicked() {\r\n console.log('UploadImagePanel.nextClicked')\r\n closePanel()\r\n window.mapPage.enterSweepsDataPanel.open(false)\r\n trackEvent(\r\n 'Validate Map Button',\r\n 'Upload Image Next',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n\r\n // var myWidget = cloudinary.createUploadWidget(\r\n // {\r\n // cloudName: 'my_cloud_name',\r\n // uploadPreset: 'my_preset',\r\n // },\r\n // (error, result) => {\r\n // if (!error && result && result.event === 'success') {\r\n // console.log('Done! Here is the image info: ', result.info)\r\n // }\r\n // }\r\n // )\r\n\r\n // document.getElementById('upload_widget').addEventListener(\r\n // 'click',\r\n // function () {\r\n // myWidget.open()\r\n // },\r\n // false\r\n // )\r\n\r\n function setCourseData() {\r\n if (window.mapPage) {\r\n let courseData = window.mapPage.getSelectedCourseData()\r\n panelElement.querySelector('.courseName').innerHTML = courseData.name\r\n panelElement.querySelector('.courseLocation').innerHTML =\r\n courseData.location\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('UploadImagePanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n setCourseData()\r\n // clear old data and images\r\n window.mapPage.setUploadedImageData({})\r\n panelElement.querySelector('#upload-preview').src = ''\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n trackEvent(\r\n 'Validate Map Panel Open',\r\n 'Upload Image Panel',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('UploadImagePanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default UploadImagePanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet EnterSweepsDataPanel = function () {\r\n console.log('New EnterSweepsDataPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('enterSweepsDataPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.submit-button')\r\n const rulesLink = panelElement.querySelector('.rulesLink')\r\n const localeLink = panelElement.querySelector('.localeLink')\r\n const privacyLink = panelElement.querySelector('.privacyLink')\r\n const backButton = panelElement.querySelector('.back-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n if (rulesLink !== null) {\r\n rulesLink.addEventListener('click', rulesClicked)\r\n }\r\n if (privacyLink !== null) {\r\n privacyLink.addEventListener('click', privacyClicked)\r\n }\r\n if (localeLink !== null) {\r\n localeLink.addEventListener('click', localeClicked)\r\n }\r\n backButton.addEventListener('click', backClicked)\r\n\r\n let isOpen = false\r\n let isSweepsOnly = false\r\n\r\n function closeClicked() {\r\n // console.log('EnterSweepsDataPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n }\r\n\r\n function backClicked() {\r\n console.log('EnterSweepsDataPanel.backClicked')\r\n self.close()\r\n window.mapPage.rulesPanel.open()\r\n }\r\n\r\n function privacyClicked() {\r\n console.log('EnterSweepsDataPanel.privacyLink')\r\n // closePanel()\r\n // window.mapPage.featuredPanel.open()\r\n }\r\n\r\n function rulesClicked() {\r\n console.log('EnterSweepsDataPanel.rulesClicked')\r\n // closePanel()\r\n window.mapPage.rulesPanel.open()\r\n }\r\n\r\n function localeClicked() {\r\n console.log('EnterSweepsDataPanel.localeClicked')\r\n // closePanel()\r\n window.mapPage.localeModal.open()\r\n }\r\n\r\n function isValid() {\r\n let valid = true\r\n\r\n // Parsley isValid does not update UI message\r\n // Parsley validate does update UI messages\r\n // condition ? exprIfTrue : exprIfFalse\r\n\r\n // validate story text\r\n // $('#firstName').parsley().validate()\r\n // $('#firstName').parsley().isValid() === false ? (valid = false) : ''\r\n // if ($('#firstName').parsley().isValid() === false) {\r\n // // panelElement.querySelector('#short-spin').classList.add('error')\r\n // valid = false\r\n // console.log('first name is not valid')\r\n // } else {\r\n // // panelElement.querySelector('#short-spin').classList.remove('error')\r\n // console.log('first name is valid')\r\n // }\r\n\r\n $('#firstName').parsley().validate()\r\n $('#firstName').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#lastName').parsley().validate()\r\n $('#lastName').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#email').parsley().validate()\r\n $('#email').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#address').parsley().validate()\r\n $('#address').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#address2').parsley().validate()\r\n $('#address2').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#city').parsley().validate()\r\n $('#city').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n if ($('#state').length) {\r\n $('#state').parsley().validate()\r\n $('#state').parsley().isValid() === false ? (valid = false) : ''\r\n }\r\n\r\n if ($('#postalCode').length) {\r\n $('#postalCode').parsley().validate()\r\n $('#postalCode').parsley().isValid() === false ? (valid = false) : ''\r\n }\r\n\r\n $('#gender').parsley().validate()\r\n $('#gender').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#whatBall').parsley().validate()\r\n $('#whatBall').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n // skip this check if the sweeps is disabled\r\n if (rulesLink !== null) {\r\n $('#agree').parsley().validate()\r\n // $('#agree').parsley().isValid() === false ? (valid = false) : ''\r\n if ($('#agree').parsley().isValid() === false) {\r\n panelElement.querySelector('#agree').classList.add('error')\r\n valid = false\r\n } else {\r\n panelElement.querySelector('#agree').classList.remove('error')\r\n }\r\n }\r\n\r\n return valid\r\n }\r\n\r\n function nextClicked() {\r\n console.log('EnterSweepsDataPanel.nextClicked ' + isSweepsOnly)\r\n if (isValid()) {\r\n closePanel()\r\n // window.mapPage.featuredPanel.open()\r\n // var ele = document.getElementsByName('ball')\r\n let ele = panelElement.querySelectorAll('[name=\"ball\"]')\r\n for (let i = 0; i < ele.length; i++) {\r\n if (ele[i].checked) {\r\n // document.getElementById('result').innerHTML = 'Gender: ' + ele[i].value\r\n console.log('ball is ' + ele[i].value)\r\n }\r\n }\r\n\r\n //TODO: submit the data!\r\n if (isSweepsOnly) {\r\n window.mapPage.submitSweeps()\r\n } else {\r\n window.mapPage.submitStory()\r\n }\r\n\r\n window.mapPage.thanksPanel.open()\r\n trackEvent(\r\n 'Validate Map Button',\r\n 'Enter Sweeps Data Next',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n function setCourseData() {\r\n let courseData = window.mapPage.getSelectedCourseData()\r\n panelElement.querySelector('.courseName').innerHTML = courseData.name\r\n panelElement.querySelector('.courseLocation').innerHTML =\r\n courseData.location\r\n }\r\n\r\n self.clear = function () {\r\n panelElement.querySelector('#firstName').value = ''\r\n panelElement.querySelector('#lastName').value = ''\r\n panelElement.querySelector('#email').value = ''\r\n panelElement.querySelector('#address').value = ''\r\n panelElement.querySelector('#address2').value = ''\r\n panelElement.querySelector('#city').value = ''\r\n if ($('#postalCode').length) {\r\n panelElement.querySelector('#postalCode').value = ''\r\n }\r\n if ($('#state').length) {\r\n $('select[name=\"state\"]').prop('selectedIndex', 0)\r\n }\r\n $('select[name=\"gender\"]').prop('selectedIndex', 0)\r\n $('select[name=\"whatBall\"]').prop('selectedIndex', 0)\r\n if (panelElement.querySelector('#teamOptIn') !== null) {\r\n panelElement.querySelector('#teamOptIn').checked = false\r\n }\r\n if (panelElement.querySelector('#agree') !== null) {\r\n panelElement.querySelector('#agree').checked = false\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel(isSweeps) {\r\n console.log(\r\n 'EnterSweepsDataPanel.openPanel ' + isOpen + ', isSweepsOnly: ' + isSweeps\r\n )\r\n if (isOpen === false) {\r\n isSweepsOnly = isSweeps\r\n isOpen = true\r\n setCourseData()\r\n self.clear()\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n if (isSweepsOnly) {\r\n panelElement.classList.add('full-width')\r\n } else {\r\n panelElement.classList.remove('full-width')\r\n }\r\n trackEvent(\r\n 'Validate Map Panel Open',\r\n 'Enter Sweeps Data Panel',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('EnterSweepsDataPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n let xTarget = config.panelOffset\r\n if (isSweepsOnly) {\r\n xTarget = window.innerWidth\r\n }\r\n gsap.to(panelElement, {\r\n x: xTarget,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default EnterSweepsDataPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet ViewCoursePanel = function () {\r\n console.log('New ViewCoursePanel()')\r\n let self = this\r\n const panelElement = document.getElementById('viewCoursePanel')\r\n const storiesElement = panelElement.querySelector('#stories')\r\n const noResultsElement = panelElement.querySelector('#no-results')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n\r\n let courseData\r\n let resultsData = {}\r\n let isOpen = false\r\n\r\n const sampleElement = panelElement.querySelector('#storySample')\r\n\r\n function closeClicked() {\r\n // console.log('ViewCoursePanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n }\r\n\r\n function nextClicked() {\r\n console.log('ViewCoursePanel.nextClicked')\r\n closePanel()\r\n window.mapPage.enterStoryDataPanel.open()\r\n trackEvent('Validate Map Button', 'Add Story', 'From View Course Panel')\r\n }\r\n\r\n function setCourseData() {\r\n if (window.mapPage) {\r\n courseData = window.mapPage.getSelectedCourseData()\r\n panelElement.querySelector('.courseName').innerHTML = courseData.name\r\n panelElement.querySelector('.courseLocation').innerHTML =\r\n courseData.location\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('ViewCoursePanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n setCourseData()\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n\r\n // clear old results from other courses\r\n while (storiesElement.firstChild) {\r\n storiesElement.removeChild(storiesElement.firstChild)\r\n }\r\n // hide the no results message\r\n noResultsElement.classList.remove('is-active')\r\n\r\n window.mapPage.hideAreaButton()\r\n getCourseStories()\r\n trackEvent(\r\n 'Validate Map Panel Open',\r\n 'View Course Panel',\r\n window.mapPage.getSelectedCourseData().name\r\n )\r\n }\r\n }\r\n\r\n function getCourseStories() {\r\n // const url = config.getCourseStoriesURL\r\n const url = window.mapPage.getURL('getCourseStoriesURL')\r\n console.log('cors getCourseStories ' + url)\r\n let postData = {}\r\n postData.courseID = courseData.id\r\n postData.locale = window.locale\r\n console.log('posting ' + JSON.stringify(postData))\r\n // prettier-ignore\r\n const options = {\r\n method: 'POST',\r\n mode: 'cors',\r\n // headers: headers,\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n // body: data,\r\n body: JSON.stringify(postData),\r\n }\r\n\r\n fetch(url, options)\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.result === null && data.error !== null) {\r\n console.log('Server error: ', data.error)\r\n window.mapPage.showErrorMessage()\r\n } else {\r\n resultsData = data\r\n // console.log('course stories results Data: ', resultsData)\r\n // TODO: error check for results vs error object?\r\n setResultsContent()\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n window.mapPage.thanksPanel.showErrorMessage(false)\r\n })\r\n }\r\n\r\n function setResultsContent() {\r\n console.log('setResultsContent ', resultsData)\r\n if (\r\n resultsData.result.stories !== undefined &&\r\n resultsData.result.stories.length > 0\r\n ) {\r\n let length = resultsData.result.stories.length\r\n // if (length > config.maxResults) {\r\n // length = config.maxResults\r\n // }\r\n let story\r\n for (let i = 0; i < length; i++) {\r\n story = resultsData.result.stories[i]\r\n\r\n let cloneElement = sampleElement.cloneNode(true)\r\n cloneElement.id = 'story-' + story.storyID\r\n cloneElement.classList.remove('sample')\r\n cloneElement.querySelector('.name').innerHTML =\r\n story.firstName + ' ' + story.lastName\r\n\r\n // check for no images and add in the generic images\r\n if (\r\n story.imageData !== null &&\r\n story.imageData.secure_url !== null &&\r\n story.imageData.secure_url !== ''\r\n ) {\r\n cloneElement.querySelector('img').src = story.imageData.secure_url\r\n // console.log('found story image ' + story.imageData.secure_url)\r\n } else {\r\n let genericImage = window.mapPage.getGenericImage()\r\n cloneElement.querySelector('img').src = genericImage.src\r\n // console.log('using generic image ', genericImage)\r\n // update the story data object so the generic image used stays the same.\r\n story.imageData = {}\r\n story.imageData.secure_url = genericImage.src\r\n }\r\n\r\n // let clickListener = self.storyClicked.bind(cloneElement)\r\n // cloneElement.clickListener = clickListener\r\n\r\n // copy the story data object, also sets the url if generic image was used\r\n cloneElement.storyData = story\r\n\r\n // bind to the cloneElement so you can access the storyData reference\r\n cloneElement.addEventListener(\r\n 'click',\r\n self.storyClicked.bind(cloneElement)\r\n // clickListener\r\n )\r\n storiesElement.appendChild(cloneElement)\r\n }\r\n noResultsElement.classList.remove('is-active')\r\n } else {\r\n console.log('no stories found.')\r\n noResultsElement.classList.add('is-active')\r\n }\r\n // TODO: error check for results vs error object?\r\n }\r\n\r\n self.storyClicked = function (e) {\r\n console.log('storyClicked ', e)\r\n console.log('e.target is ', e.target)\r\n console.log('e.target.storyData is ', e.target.storyData)\r\n // console.log('e.target.parent is ', e.target.parent)\r\n // console.log('e.target.parent.storyData is ', e.target.parent.storyData)\r\n console.log('this is ', this)\r\n console.log('this.storyData is ', this.storyData)\r\n // this.removeEventListener('click', self.storyClicked.bind(this))\r\n // this.removeEventListener('click', this.clickListener)\r\n window.mapPage.storyClicked(this.storyData)\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('ViewCoursePanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default ViewCoursePanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet ViewStoryPanel = function () {\r\n console.log('New ViewStoryPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('viewStoryPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const tellButton = panelElement.querySelector('.next-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n tellButton.addEventListener('click', nextClicked)\r\n\r\n let storyData\r\n let courseData\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n console.log('ViewStoryPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n }\r\n\r\n function nextClicked() {\r\n console.log('ViewStoryPanel.nextClicked')\r\n closePanel()\r\n window.mapPage.enterStoryDataPanel.open()\r\n }\r\n\r\n function setCourseData() {\r\n if (window.mapPage) {\r\n courseData = window.mapPage.getSelectedCourseData()\r\n panelElement.querySelector('.courseName').innerHTML = courseData.name\r\n panelElement.querySelector('.courseLocation').innerHTML =\r\n courseData.location\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('ViewStoryPanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n setCourseData()\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n\r\n window.mapPage.hideAreaButton()\r\n setStoryContent()\r\n trackEvent(\r\n 'Validate Map Panel Open',\r\n 'View Story Panel',\r\n window.mapPage.getSelectedCourseData().name +\r\n ' - ' +\r\n window.mapPage.getSelectedStoryData().firstName\r\n )\r\n }\r\n }\r\n\r\n function setStoryContent() {\r\n // console.log('setStoryContent ', setStoryContent)\r\n storyData = window.mapPage.getSelectedStoryData()\r\n\r\n // check for no images and add in the generic images\r\n if (\r\n storyData.imageData !== null &&\r\n storyData.imageData.secure_url !== null &&\r\n storyData.imageData.secure_url !== ''\r\n ) {\r\n panelElement.querySelector('#storyImage').src =\r\n storyData.imageData.secure_url\r\n // console.log('found story image ' + storyData.imageData.secure_url)\r\n } else {\r\n let genericImage = window.mapPage.getGenericImage()\r\n panelElement.querySelector('#storyImage').src = genericImage.src\r\n // console.log('using generic image ', genericImage)\r\n // console.log('generic image src ', genericImage.src)\r\n // console.log(\r\n // 'story image src ',\r\n // panelElement.querySelector('#storyImage').src\r\n // )\r\n }\r\n\r\n // TODO: check for no images and add in the generic images\r\n // panelElement.querySelector('#storyImage').src =\r\n // storyData.imageData.secure_url\r\n\r\n panelElement.querySelector('.name').innerHTML =\r\n storyData.firstName + ' ' + storyData.lastName\r\n panelElement.querySelector('#storyCopy').innerHTML = storyData.text\r\n\r\n let list\r\n list = panelElement.querySelectorAll('.ballValue')\r\n for (let i = 0; i < list.length; ++i) {\r\n list[i].classList.remove('selected')\r\n }\r\n // console.log('Story ball is ' + storyData.storyBall)\r\n\r\n const ballElement = panelElement.querySelector(\r\n '.ballValue.' + storyData.storyBall\r\n )\r\n // console.log('ballElement is ', ballElement)\r\n if (ballElement !== null) {\r\n ballElement.classList.add('selected')\r\n }\r\n\r\n list = panelElement.querySelectorAll('.value')\r\n for (let i = 0; i < list.length; ++i) {\r\n list[i].classList.remove('selected')\r\n }\r\n\r\n let dataElement = panelElement.querySelector('.flight .' + storyData.flight)\r\n if (dataElement !== null) {\r\n dataElement.classList.add('selected')\r\n }\r\n\r\n dataElement = panelElement.querySelector('.feel .' + storyData.feel)\r\n if (dataElement !== null) {\r\n dataElement.classList.add('selected')\r\n }\r\n\r\n dataElement = panelElement.querySelector('.long .' + storyData.longSpin)\r\n if (dataElement !== null) {\r\n dataElement.classList.add('selected')\r\n }\r\n\r\n dataElement = panelElement.querySelector('.short .' + storyData.shortSpin)\r\n if (dataElement !== null) {\r\n dataElement.classList.add('selected')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('ViewStoryPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default ViewStoryPanel\r\n","import { config } from './config'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet ThanksPanel = function () {\r\n console.log('New ThanksPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('thanksPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('ThanksPanel.closeClicked')\r\n closePanel()\r\n window.mapPage.showAreaButton()\r\n }\r\n\r\n function nextClicked() {\r\n console.log('ThanksPanel.nextClicked')\r\n closePanel()\r\n // window.mapPage.featuredPanel.open()\r\n // var ele = document.getElementsByName('ball')\r\n // let ele = panelElement.querySelectorAll('[name=\"ball\"]')\r\n // for (let i = 0; i < ele.length; i++) {\r\n // if (ele[i].checked) {\r\n // // document.getElementById('result').innerHTML = 'Gender: ' + ele[i].value\r\n // console.log('ball is ' + ele[i].value)\r\n // }\r\n // }\r\n }\r\n\r\n self.showSuccessMessage = function (isSweepsOnly) {\r\n console.log('showSuccessMessage ' + isSweepsOnly)\r\n if (isSweepsOnly) {\r\n panelElement.classList.add('sweeps')\r\n } else {\r\n panelElement.classList.add('success')\r\n }\r\n panelElement.classList.remove('loading')\r\n }\r\n\r\n self.showErrorMessage = function (isSweepsOnly) {\r\n panelElement.classList.add('error')\r\n panelElement.classList.remove('loading')\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('ThanksPanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n panelElement.classList.add('is-open')\r\n panelElement.scrollTop = 0\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.classList.add('loading')\r\n panelElement.classList.remove('error')\r\n panelElement.classList.remove('success')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('ThanksPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n window.mapPage.featuredPanel.open()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n }\r\n }\r\n}\r\n\r\nexport default ThanksPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet RulesPanel = function () {\r\n console.log('New RulesPanel()')\r\n let self = this\r\n const panelElement = document.getElementById('rulesPanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n const backButton = panelElement.querySelector('.back-button')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n backButton.addEventListener('click', backClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('RulesPanel.closeClicked')\r\n closePanel()\r\n // window.mapPage.featuredPanel.open()\r\n }\r\n\r\n function backClicked() {\r\n console.log('RulesPanel.backClicked')\r\n if (window.mapPage.mode === window.mapPage.modes.RULES) {\r\n // get the landing page url from the home button\r\n let landingPageURL = document.getElementById('home-button').href\r\n // window.location.href = 'app.html'\r\n window.location.href = landingPageURL\r\n } else {\r\n self.close()\r\n }\r\n // window.mapPage.setNewCourseData(courseData)\r\n // window.mapPage.enterStoryDataPanel.open()\r\n }\r\n\r\n function nextClicked() {\r\n console.log('RulesPanel.nextClicked')\r\n closePanel()\r\n window.mapPage.enterSweepsDataPanel.open(true)\r\n trackEvent('Validate Map Button', 'Enter Sweeps', 'From Rules Panel')\r\n }\r\n\r\n gsap.set(panelElement, { x: window.innerWidth })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('RulesPanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n // gsap.to(panelElement, { x: 280 })\r\n // gsap.to(panelContent, { opacity: 1, duration: 0.3 })\r\n // searchForCourses()\r\n // wait one frame\r\n requestAnimationFrame(function () {\r\n window.mapPage.featuredPanel.close()\r\n if (window.mapPage.mode == window.mapPage.modes.RULES) {\r\n closeButton.classList.add('is-hidden')\r\n } else {\r\n closeButton.classList.remove('is-hidden')\r\n }\r\n })\r\n\r\n trackEvent('Validate Map Panel Open', 'Rules Panel')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('RulesPanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: window.innerWidth,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n // panelElement.classList.remove('is-open')\r\n // gsap.to(panelElement, { x: 0 })\r\n // gsap.to(panelContent, { opacity: 0, duration: 0.3 })\r\n }\r\n }\r\n}\r\n\r\nexport default RulesPanel\r\n","import { config } from './config'\r\nimport { trackEvent } from './utilities'\r\n\r\n/**\r\n * Find your course modal that opens over the map on enter story path\r\n */\r\nlet AddCoursePanel = function () {\r\n console.log('New AddCoursePanel()')\r\n let self = this\r\n const panelElement = document.getElementById('addCoursePanel')\r\n const closeButton = panelElement.querySelector('.close-button')\r\n const nextButton = panelElement.querySelector('.next-button')\r\n const nameInput = panelElement.querySelector('#courseName')\r\n const locationInput = panelElement.querySelector('#courseLocation')\r\n\r\n closeButton.addEventListener('click', closeClicked)\r\n nextButton.addEventListener('click', nextClicked)\r\n\r\n let isOpen = false\r\n\r\n function closeClicked() {\r\n // console.log('AddCoursePanel.closeClicked')\r\n closePanel()\r\n // window.mapPage.featuredPanel.open()\r\n window.mapPage.mode = window.mapPage.modes.EXPLORE\r\n }\r\n\r\n function isValid() {\r\n let valid = true\r\n\r\n // Parsley isValid does not update UI message\r\n // Parsley validate does update UI messages\r\n // condition ? exprIfTrue : exprIfFalse\r\n\r\n // validate story text\r\n // $('#firstName').parsley().validate()\r\n // $('#firstName').parsley().isValid() === false ? (valid = false) : ''\r\n // if ($('#firstName').parsley().isValid() === false) {\r\n // // panelElement.querySelector('#short-spin').classList.add('error')\r\n // valid = false\r\n // console.log('first name is not valid')\r\n // } else {\r\n // // panelElement.querySelector('#short-spin').classList.remove('error')\r\n // console.log('first name is valid')\r\n // }\r\n\r\n $('#courseName').parsley().validate()\r\n $('#courseName').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n $('#courseLocation').parsley().validate()\r\n $('#courseLocation').parsley().isValid() === false ? (valid = false) : ''\r\n\r\n return valid\r\n }\r\n\r\n function nextClicked() {\r\n console.log('AddCoursePanel.nextClicked')\r\n if (isValid()) {\r\n closePanel()\r\n\r\n let courseData = {}\r\n courseData.name = document.querySelector('#courseName').value\r\n courseData.location = document.querySelector('#courseLocation').value\r\n courseData.id = -1\r\n\r\n window.mapPage.setNewCourseData(courseData)\r\n\r\n window.mapPage.enterStoryDataPanel.open()\r\n trackEvent('Validate Map Button', 'Add Course Next', courseData.name)\r\n }\r\n }\r\n\r\n gsap.set(panelElement, { x: config.panelOffset })\r\n self.open = openPanel\r\n function openPanel() {\r\n console.log('AddCoursePanel.openPanel ' + isOpen)\r\n if (isOpen === false) {\r\n isOpen = true\r\n nameInput.value = ''\r\n locationInput.value = ''\r\n panelElement.classList.add('is-open')\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, { x: 0, duration: config.openDuration })\r\n panelElement.scrollTop = 0\r\n // track panel open\r\n trackEvent('Validate Map Panel Open', 'Add Course Panel', '')\r\n }\r\n }\r\n\r\n // make it a public function\r\n self.close = closePanel\r\n function closePanel() {\r\n console.log('AddCoursePanel.closePanel ' + isOpen)\r\n if (isOpen) {\r\n isOpen = false\r\n gsap.killTweensOf(panelElement)\r\n gsap.to(panelElement, {\r\n x: config.panelOffset,\r\n duration: config.closeDuration,\r\n onComplete: () => {\r\n panelElement.classList.remove('is-open')\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default AddCoursePanel\r\n","import FeaturedPanel from './featured-panel'\r\nimport ResultsPanel from './results-panel'\r\nimport SearchModal from './search-modal'\r\nimport LocaleModal from './locale-modal'\r\nimport EnterStoryDataPanel from './enter-story-data-panel'\r\nimport UploadImagePanel from './upload-image-panel'\r\nimport EnterSweepsDataPanel from './enter-sweeps-data-panel'\r\nimport ViewCoursePanel from './view-course-panel'\r\nimport ViewStoryPanel from './view-story-panel'\r\nimport ThanksPanel from './thanks-panel'\r\nimport RulesPanel from './rules-panel'\r\nimport AddCoursePanel from './add-course-panel'\r\nimport { config } from './config'\r\nimport { shuffle, trackEvent } from './utilities'\r\nimport { getQueryStringVariable } from './utilities'\r\n\r\nlet MapPage = function (elementId) {\r\n if (MapPage.prototype._singletonInstance) {\r\n return MapPage.prototype._singletonInstance\r\n }\r\n MapPage.prototype._singletonInstance = this\r\n\r\n this.initialize(elementId)\r\n}\r\n\r\n/**\r\n * Landing page initialization. The process starts with the Globe.gl object,\r\n * and kicks off the intro sequence with the .onGlobeReady(initializeGlobe)\r\n */\r\nMapPage.prototype.initialize = function (elementId) {\r\n console.log('MapPage initalizing ')\r\n\r\n let self = this\r\n self.featuredPanel = new FeaturedPanel()\r\n self.searchModal = new SearchModal()\r\n self.localeModal = new LocaleModal()\r\n self.resultsPanel = new ResultsPanel()\r\n self.enterStoryDataPanel = new EnterStoryDataPanel()\r\n self.uploadImagePanel = new UploadImagePanel()\r\n self.enterSweepsDataPanel = new EnterSweepsDataPanel()\r\n self.thanksPanel = new ThanksPanel()\r\n self.addCoursePanel = new AddCoursePanel()\r\n self.viewCoursePanel = new ViewCoursePanel()\r\n self.viewStoryPanel = new ViewStoryPanel()\r\n self.rulesPanel = new RulesPanel()\r\n self.searchAreaButton = document.getElementById('area-button')\r\n let genericImageContainer = document.getElementById('generic-images')\r\n\r\n let map = undefined\r\n let mapData = config.mapData.default\r\n //TODO: locale overrides of mapData here\r\n console.log('locale is ' + window.locale)\r\n if (config.mapData[window.locale] !== undefined) {\r\n mapData = config.mapData[window.locale]\r\n if (\r\n mapData.initialCourses === null ||\r\n mapData.initialCourses === undefined ||\r\n mapData.initialCourses.length === 0\r\n ) {\r\n mapData.initialCourses = config.mapData.default.initialCourses\r\n }\r\n }\r\n\r\n // track width to close featured panel in between mobile and non-mobile layouts\r\n let oldWidth = -1\r\n window.addEventListener('resize', resizeListener.bind(self))\r\n\r\n let selectedCourseData = {}\r\n let selectedStoryData = {}\r\n let uploadedImageData = {}\r\n // let Popup\r\n let rings = {}\r\n // let resultsData = {}\r\n // position/zoom refs to trigger the search this area button\r\n let searchBounds = {}\r\n let searchZoom = {}\r\n self.isSearching = false\r\n checkLocale()\r\n\r\n // exploring or submitting\r\n self.modes = {\r\n EXPLORE: 'EXPLORE',\r\n SUBMIT: 'SUBMIT',\r\n RULES: 'RULES',\r\n }\r\n self.mode = self.modes.EXPLORE\r\n // self.mode = self.modes.SUBMIT\r\n // self.mode = self.modes.RULES\r\n\r\n // if (getQueryStringVariable('mode') === 'submit') {\r\n // self.mode = self.modes.SUBMIT\r\n // self.searchModal.open()\r\n // } else if (getQueryStringVariable('mode') === 'rules') {\r\n // self.mode = self.modes.RULES\r\n // self.rulesPanel.open()\r\n // } else {\r\n // self.mode = self.modes.EXPLORE\r\n // if (mobileCheck()) {\r\n // self.featuredPanel.open()\r\n // }\r\n // }\r\n\r\n self.initMap = function () {\r\n // self.localeModal.open()\r\n console.log('initMap ' + config.mapId)\r\n console.log('overlay view ', google.maps.OverlayView)\r\n // Create the map centered on the US\r\n map = new google.maps.Map(document.getElementById('map'), {\r\n zoom: mapData.initialZoom,\r\n center: mapData.initialPosition,\r\n minZoom: 3,\r\n maxZoom: 20,\r\n mapId: config.mapId,\r\n disableDefaultUI: true,\r\n zoomControl: true,\r\n mapTypeControl: false,\r\n scaleControl: true,\r\n streetViewControl: false,\r\n rotateControl: false,\r\n fullscreenControl: false,\r\n clickableIcons: false,\r\n gestureHandling: 'cooperative',\r\n })\r\n\r\n // initialize the autocomplete search box\r\n const featuredInput = document.getElementById('featured-input')\r\n const featuredSearchBox = new google.maps.places.SearchBox(featuredInput)\r\n const featuredSearchButton = document.getElementById('featuredSearchButton')\r\n\r\n const modalInput = document.getElementById('modal-input')\r\n const modalSearchBox = new google.maps.places.SearchBox(modalInput)\r\n const modalSearchButton = document.getElementById('modalSearchButton')\r\n\r\n // Bias the featuredSearchBox results towards current map's viewport.\r\n map.addListener('bounds_changed', () => {\r\n featuredSearchBox.setBounds(map.getBounds())\r\n modalSearchBox.setBounds(map.getBounds())\r\n })\r\n\r\n // Check bounds and show search this area button if it moves a lot\r\n let boundsDelay\r\n map.addListener('bounds_changed', () => {\r\n // console.log(\r\n // 'bounds changed zoom: ' + map.getZoom() + ' coords: ' + map.getCenter()\r\n // )\r\n if (\r\n map.getZoom() > config.detailZoomLevel &&\r\n self.isSearching === false\r\n ) {\r\n clearTimeout(boundsDelay)\r\n // TODO: check search area math to see if we moved at least 25%?\r\n boundsDelay = setTimeout(self.showAreaButton, 500)\r\n // self.showAreaButton()\r\n }\r\n })\r\n // Always show search this area button on zoom changes\r\n map.addListener('zoom_changed', () => {\r\n // console.log('zoom changed ', map.getZoom())\r\n if (\r\n map.getZoom() > config.detailZoomLevel &&\r\n self.isSearching === false\r\n ) {\r\n self.showAreaButton()\r\n }\r\n })\r\n\r\n modalSearchBox.addListener('places_changed', (e) => {\r\n // console.log('places changed ', map.getZoom())\r\n placesChanged(modalSearchBox, self.searchModal)\r\n trackEvent(\r\n 'Validate Map Button',\r\n 'Search',\r\n document.getElementById('modal-input').value\r\n )\r\n })\r\n featuredSearchBox.addListener('places_changed', (e) => {\r\n // console.log('places changed ', map.getZoom())\r\n placesChanged(featuredSearchBox, self.featuredPanel)\r\n trackEvent(\r\n 'Validate Map Button',\r\n 'Search',\r\n document.getElementById('featured-input').value\r\n )\r\n })\r\n featuredSearchButton.addEventListener('click', function () {\r\n // console.log('featured search button clicked')\r\n google.maps.event.trigger(featuredInput, 'focus', {})\r\n google.maps.event.trigger(featuredInput, 'keydown', {\r\n keyCode: 13,\r\n })\r\n })\r\n modalSearchButton.addEventListener('click', function () {\r\n // console.log('modal search button clicked')\r\n google.maps.event.trigger(modalInput, 'focus', {})\r\n google.maps.event.trigger(modalInput, 'keydown', {\r\n keyCode: 13,\r\n })\r\n })\r\n\r\n self.featuredPanel.loadFeaturedStories()\r\n\r\n self.searchAreaButton.addEventListener('click', function () {\r\n // console.log('search area button clicked')\r\n self.hideAreaButton()\r\n self.closeAllPanels()\r\n // self.featuredPanel.close()\r\n self.searchModal.close()\r\n self.resultsPanel.open()\r\n trackEvent('Validate Map Button', 'Search This Area')\r\n })\r\n\r\n if (getQueryStringVariable('mode') === 'submit') {\r\n self.mode = self.modes.SUBMIT\r\n self.searchModal.open()\r\n } else if (getQueryStringVariable('mode') === 'rules') {\r\n self.mode = self.modes.RULES\r\n self.rulesPanel.open()\r\n } else {\r\n self.mode = self.modes.EXPLORE\r\n }\r\n\r\n // wait 1 frame for some initialization stuff then do some state checks\r\n requestAnimationFrame(() => {\r\n if (self.isMobile() === false && self.mode === self.modes.EXPLORE) {\r\n self.featuredPanel.open()\r\n }\r\n\r\n // import the Ring module/class here to make sure google.maps.OverlayView namespace is available\r\n self.modules = require('./ring')\r\n if (self.mode === self.modes.EXPLORE) {\r\n self.startInitialRings()\r\n }\r\n })\r\n\r\n // TEST MARKER\r\n // let coords = { lat: 43.693693812983824, lng: -83.55377299953322 }\r\n // let marker = new google.maps.Marker({\r\n // position: coords,\r\n // map,\r\n // title: 'Prestwick Golf Club',\r\n // })\r\n }\r\n\r\n let ringIndex = 0\r\n let ringIntervalId = -1\r\n self.startInitialRings = function () {\r\n console.log('MapPage.startInitialRings ', mapData.initialCourses)\r\n mapData.initialCourses = shuffle(mapData.initialCourses)\r\n let intervalTime = 1000\r\n if (mapData.initialCourses.length < 5) {\r\n intervalTime = 3000\r\n }\r\n if (mapData.initialCourses.length > 0) {\r\n ringIntervalId = setInterval(self.startRing, intervalTime)\r\n }\r\n }\r\n\r\n self.startRing = function () {\r\n let course = mapData.initialCourses[ringIndex]\r\n if (course !== null && course !== undefined) {\r\n let ring = new self.modules.Ring(\r\n new google.maps.LatLng(course.lat, course.lng),\r\n course,\r\n false\r\n )\r\n ring.setMap(map)\r\n rings[course.id] = ring\r\n ringIndex++\r\n if (ringIndex >= mapData.initialCourses.length) {\r\n ringIndex = 0\r\n // shuffle them again?\r\n }\r\n // start the remove timer\r\n ring.timerId = setTimeout(function () {\r\n // console.log('removing ring ', ring)\r\n ring.shrink()\r\n // if (ring !== null) {\r\n // ring.setMap(null)\r\n // rings[ring.courseID] = null\r\n // ring.timerId = null\r\n // }\r\n }, 6000)\r\n\r\n //TODO: clear all rings function, including the timerId check\r\n\r\n // debug marker to check positioning:\r\n // let coords = { lat: course.lat, lng: course.lng }\r\n // let marker = new google.maps.Marker({\r\n // position: coords,\r\n // map,\r\n // title: course.name,\r\n // })\r\n // console.log('marker at ', coords)\r\n }\r\n }\r\n\r\n self.removeRing = function (ring) {\r\n // console.log('MapPage.removeRing ', ring)\r\n if (ring !== null) {\r\n ring.setMap(null)\r\n rings[ring.courseID] = null\r\n ring.timerId = null\r\n }\r\n }\r\n\r\n self.showAreaButton = function () {\r\n self.searchAreaButton.style.display = 'block'\r\n self.searchAreaButton.style.opacity = 1\r\n }\r\n\r\n self.hideAreaButton = function () {\r\n self.searchAreaButton.style.opacity = 0\r\n setTimeout(() => {\r\n self.searchAreaButton.style.display = 'none'\r\n }, 250)\r\n }\r\n\r\n self.highlightRing = function (courseData) {\r\n // console.log('MapPage.highlightRing ', courseData)\r\n rings[courseData.id].highlight()\r\n }\r\n\r\n self.unhighlightRing = function (courseData) {\r\n // console.log('MapPage.unhighlightRing ', courseData)\r\n rings[courseData.id].unhighlight()\r\n }\r\n\r\n self.clearAllRings = function () {\r\n console.log('MapPage.clearAllRings()')\r\n // stop initial ring interval if its running\r\n if (ringIntervalId > 0) {\r\n clearInterval(ringIntervalId)\r\n ringIntervalId = -1\r\n }\r\n // remove old markers before dropping new ones\r\n for (let id in rings) {\r\n // console.log('removing ring ', rings[id])\r\n if (rings[id] !== null) {\r\n rings[id].setMap(null)\r\n if (rings[id].timerId !== null) {\r\n clearTimeout(rings[id].timerId)\r\n }\r\n }\r\n }\r\n rings = {}\r\n }\r\n\r\n self.drawRings = function (resultsData) {\r\n console.log('MapPage.drawRings: ', resultsData)\r\n\r\n self.clearAllRings()\r\n // TODO: remove old markers before dropping new ones\r\n // for (let id in rings) {\r\n // console.log('removing ring ', rings[id])\r\n // rings[id].setMap(null)\r\n // }\r\n // rings = {}\r\n\r\n resultsData.result.courses.forEach(function (course, index) {\r\n if (index < config.maxResults) {\r\n let ring = new self.modules.Ring(\r\n new google.maps.LatLng(course.lat, course.lng),\r\n course,\r\n true\r\n )\r\n ring.setMap(map)\r\n rings[course.id] = ring\r\n }\r\n })\r\n console.log('rings: ', rings)\r\n }\r\n\r\n function placesChanged(searchBox, panel) {\r\n console.log(\r\n 'placesChanged ' +\r\n document.getElementById('featured-input').value +\r\n 'placesChanged ' +\r\n document.getElementById('modal-input').value\r\n )\r\n self.isSearching = true\r\n const places = searchBox.getPlaces()\r\n\r\n if (places.length == 0) {\r\n console.log(\r\n 'TODO: no places returned probably need an error message for this.'\r\n )\r\n // TODO: show no results error state\r\n panel.showNoResults()\r\n return\r\n }\r\n\r\n // For each place, get the icon, name and location.\r\n const bounds = new google.maps.LatLngBounds()\r\n\r\n places.forEach((place) => {\r\n if (!place.geometry || !place.geometry.location) {\r\n console.log('Returned place contains no geometry', place)\r\n\r\n return\r\n }\r\n\r\n if (place.geometry.viewport) {\r\n // Only geocodes have viewport.\r\n bounds.union(place.geometry.viewport)\r\n } else {\r\n bounds.extend(place.geometry.location)\r\n }\r\n })\r\n\r\n // TODO: nudge the map to the left to compensate for the panel on the right?\r\n // map.getBounds { south: 47.462512981572004, west: -122.81996977343748, north: 47.76339164998773, east: -121.86415922656248 }\r\n // map.getCenter { lat: 47.61316870669869, lng: -122.34206449999998 }\r\n // move to the left about 20%, but do it before the search!?\r\n\r\n console.log('target fit bounds to ', bounds)\r\n // console.log('map.getBounds before fit json ', map.getBounds().toJSON())\r\n // console.log('map.getCenter before fit json ', map.getCenter().toJSON())\r\n\r\n map.fitBounds(bounds)\r\n console.log('map.getBounds string ' + map.getBounds().toString())\r\n console.log('map.getBounds json ', map.getBounds().toJSON())\r\n console.log('map.getCenter json ', map.getCenter().toJSON())\r\n self.featuredPanel.close()\r\n self.searchModal.close()\r\n self.closeAllPanels()\r\n self.resultsPanel.open()\r\n }\r\n\r\n self.featureClicked = function () {}\r\n\r\n self.ringClicked = function (courseData) {\r\n trackEvent('Validate Map Button', 'Map Ring Marker', courseData.name)\r\n self.resultClicked(courseData)\r\n }\r\n\r\n // Called from ResultsPanel after a course is clicked\r\n self.resultClicked = function (courseData) {\r\n console.log('resultClicked ', courseData)\r\n selectedCourseData = courseData\r\n\r\n // close all the panels since a ring could be clicked from lots of places\r\n // self.resultsPanel.close()\r\n self.closeAllPanels()\r\n\r\n if (self.mode === self.modes.SUBMIT) {\r\n self.enterStoryDataPanel.open()\r\n } else if (self.mode === self.modes.EXPLORE) {\r\n // START HERE WITH VIEW COURSE PANEL\r\n self.viewCoursePanel.open()\r\n }\r\n\r\n // dont show search this area button\r\n self.isSearching = true\r\n // move the map and zoom in\r\n map.panTo(courseData)\r\n if (map.getZoom() < config.clickZoomLevel) {\r\n map.setZoom(config.clickZoomLevel)\r\n }\r\n self.featuredPanel.close()\r\n // TODO: offset the center so its not under the story panel?\r\n // TODO: dont do this from the results panel?\r\n // TODO: tween a smooth animation all the time with greensock like this?\r\n // https://developers.google.com/maps/documentation/javascript/examples/move-camera-ease\r\n\r\n if (ringIntervalId > 0) {\r\n this.clearAllRings()\r\n // then add this ring back with no remove timer attached\r\n let ring = new self.modules.Ring(\r\n new google.maps.LatLng(courseData.lat, courseData.lng),\r\n courseData,\r\n true\r\n )\r\n ring.setMap(map)\r\n rings[courseData.id] = ring\r\n }\r\n setTimeout(() => {\r\n self.isSearching = false\r\n }, 200)\r\n }\r\n\r\n // called from featurePanel to move the map to the selected course and drop a ring\r\n self.moveToCourse = function (courseData) {\r\n // dont show search this area button\r\n self.isSearching = true\r\n // move the map and zoom in\r\n map.panTo(courseData)\r\n if (map.getZoom() < config.clickZoomLevel) {\r\n map.setZoom(config.clickZoomLevel)\r\n }\r\n self.featuredPanel.close()\r\n // TODO: offset the center so its not under the story panel?\r\n // TODO: dont do this from the results panel?\r\n // TODO: tween a smooth animation all the time with greensock like this?\r\n // https://developers.google.com/maps/documentation/javascript/examples/move-camera-ease\r\n\r\n if (ringIntervalId > 0) {\r\n this.clearAllRings()\r\n }\r\n // then add this ring back with no remove timer attached\r\n let ring = new self.modules.Ring(\r\n new google.maps.LatLng(courseData.lat, courseData.lng),\r\n courseData,\r\n true\r\n )\r\n ring.setMap(map)\r\n rings[courseData.id] = ring\r\n\r\n setTimeout(() => {\r\n self.isSearching = false\r\n }, 200)\r\n }\r\n\r\n self.setNewCourseData = function (courseData) {\r\n selectedCourseData = courseData\r\n }\r\n\r\n self.getSelectedCourseData = function () {\r\n return selectedCourseData\r\n }\r\n\r\n self.closeAllPanels = function () {\r\n self.featuredPanel.close()\r\n self.rulesPanel.close()\r\n self.thanksPanel.close()\r\n self.resultsPanel.close()\r\n self.addCoursePanel.close()\r\n self.viewStoryPanel.close()\r\n self.viewCoursePanel.close()\r\n self.searchModal.close()\r\n self.uploadImagePanel.close()\r\n self.enterStoryDataPanel.close()\r\n self.enterSweepsDataPanel.close()\r\n }\r\n\r\n // Called from ViewCoursePanel or FeaturedPanel after a story is clicked\r\n self.storyClicked = function (storyData) {\r\n selectedStoryData = storyData\r\n // close all the panel since featuredPanel cicks could happen from anywhere\r\n self.closeAllPanels()\r\n\r\n self.viewCoursePanel.close()\r\n self.viewStoryPanel.open()\r\n }\r\n\r\n self.getSelectedStoryData = function () {\r\n return selectedStoryData\r\n }\r\n\r\n self.setUploadedImageData = function (data) {\r\n uploadedImageData = data\r\n }\r\n\r\n function checkLocale() {\r\n console.log('MapPage.checkLocale ' + window.locale)\r\n try {\r\n if (window.locale === 'cn') {\r\n require('./parsley/parsley-cn')\r\n } else if (window.locale === 'de') {\r\n require('./parsley/parsley-de')\r\n } else if (window.locale === 'es') {\r\n require('./parsley/parsley-es')\r\n } else if (window.locale === 'fr-ca') {\r\n require('./parsley/parsley-fr')\r\n } else if (window.locale === 'fr') {\r\n require('./parsley/parsley-fr')\r\n } else if (window.locale === 'jp') {\r\n require('./parsley/parsley-jp')\r\n } else if (window.locale === 'ko') {\r\n require('./parsley/parsley-ko')\r\n } else if (window.locale === 'se') {\r\n require('./parsley/parsley-se')\r\n } else if (window.locale === 'th') {\r\n require('./parsley/parsley-th')\r\n }\r\n } catch (e) {\r\n console.log('ERROR loading Parsley localized error strings')\r\n }\r\n }\r\n\r\n self.submitStory = function () {\r\n console.log('MapPage.submitStory')\r\n // Form data should be validated before this is called so safe to use the values without checking here.\r\n\r\n let story = {}\r\n // course id\r\n story.courseID = selectedCourseData.id\r\n story.courseName = selectedCourseData.name\r\n story.courseLocation = selectedCourseData.location\r\n // ball\r\n let radios = document.querySelectorAll('[name=\"ball\"]')\r\n for (let i = 0; i < radios.length; i++) {\r\n if (radios[i].checked) {\r\n story.storyBall = radios[i].value\r\n console.log('ball is ' + radios[i].value)\r\n trackEvent('Validate Map Answers', 'Ball Played', story.storyBall)\r\n }\r\n }\r\n // flight\r\n radios = document.querySelectorAll('[name=\"flight\"]')\r\n for (let i = 0; i < radios.length; i++) {\r\n if (radios[i].checked) {\r\n story.flight = radios[i].value\r\n trackEvent('Validate Map Answers', 'Ball Flight', story.flight)\r\n }\r\n }\r\n // feel\r\n radios = document.querySelectorAll('[name=\"feel\"]')\r\n for (let i = 0; i < radios.length; i++) {\r\n if (radios[i].checked) {\r\n story.feel = radios[i].value\r\n trackEvent('Validate Map Answers', 'Ball Feel', story.feel)\r\n }\r\n }\r\n // longSpin\r\n radios = document.querySelectorAll('[name=\"longSpin\"]')\r\n for (let i = 0; i < radios.length; i++) {\r\n if (radios[i].checked) {\r\n story.longSpin = radios[i].value\r\n trackEvent('Validate Map Answers', 'Long Game Spin', story.longSpin)\r\n }\r\n }\r\n // shortSpin\r\n radios = document.querySelectorAll('[name=\"shortSpin\"]')\r\n for (let i = 0; i < radios.length; i++) {\r\n if (radios[i].checked) {\r\n story.shortSpin = radios[i].value\r\n trackEvent('Validate Map Answers', 'Short Game Spin', story.shortSpin)\r\n }\r\n }\r\n // text\r\n story.text = document.querySelector('#story-text').value\r\n\r\n // image urls\r\n story.imageData = uploadedImageData\r\n\r\n //TODO store and set image urls\r\n story.firstName = document.querySelector('#firstName').value\r\n story.lastName = document.querySelector('#lastName').value\r\n story.email = document.querySelector('#email').value\r\n story.address = document.querySelector('#address').value\r\n story.address2 = document.querySelector('#address2').value\r\n story.city = document.querySelector('#city').value\r\n if (document.querySelector('#state') !== null) {\r\n story.state = document.querySelector('#state').value\r\n trackEvent('Validate Map Answers', 'State', story.state)\r\n }\r\n if (document.querySelector('#postalCode') !== null) {\r\n story.postalCode = document.querySelector('#postalCode').value\r\n }\r\n story.gender = document.querySelector('#gender').value\r\n trackEvent('Validate Map Answers', 'Gender', story.gender)\r\n\r\n story.mostOftenBall = document.querySelector('#whatBall').value\r\n let ballElement = document.querySelector('#whatBall')\r\n let ballName = ballElement.options[ballElement.selectedIndex].text\r\n // trackEvent('Validate Map Answers', 'Most Played Ball', story.mostOftenBall)\r\n trackEvent('Validate Map Answers', 'Most Played Ball', ballName)\r\n\r\n story.teamOptIn = false\r\n if (document.querySelector('#teamOptIn') !== null) {\r\n story.teamOptIn = document.querySelector('#teamOptIn').checked\r\n }\r\n story.locale = window.locale\r\n\r\n console.log('submitting story data: ', story)\r\n console.log('story data stringify: ', JSON.stringify(story))\r\n\r\n // const url = config.submitStoryURL\r\n const url = window.mapPage.getURL('submitStoryURL')\r\n console.log('cors submitStoryURL ' + url)\r\n // prettier-ignore\r\n const options = {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(story),\r\n }\r\n\r\n fetch(url, options)\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.result === null && data.error !== null) {\r\n console.log('Server error: ', data.error)\r\n window.mapPage.showErrorMessage()\r\n } else {\r\n // console.log('success submit story return data ', data)\r\n self.thanksPanel.showSuccessMessage(false)\r\n //TODO: check return data for error messages\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n self.thanksPanel.showErrorMessage(false)\r\n })\r\n }\r\n\r\n self.submitSweeps = function () {\r\n console.log('MapPage.submitSweeps')\r\n // Form data should be validated before this is called so safe to use the values without checking here.\r\n\r\n let sweeps = {}\r\n //TODO store and set image urls\r\n sweeps.firstName = document.querySelector('#firstName').value\r\n sweeps.lastName = document.querySelector('#lastName').value\r\n sweeps.email = document.querySelector('#email').value\r\n sweeps.address = document.querySelector('#address').value\r\n sweeps.address2 = document.querySelector('#address2').value\r\n sweeps.city = document.querySelector('#city').value\r\n if (document.querySelector('#state') !== null) {\r\n sweeps.state = document.querySelector('#state').value\r\n }\r\n if (document.querySelector('#postalCode') !== null) {\r\n sweeps.postalCode = document.querySelector('#postalCode').value\r\n }\r\n sweeps.gender = document.querySelector('#gender').value\r\n sweeps.mostOftenBall = document.querySelector('#whatBall').value\r\n sweeps.teamOptIn = document.querySelector('#teamOptIn').checked\r\n sweeps.locale = window.locale\r\n\r\n console.log('submitting sweeps data: ', sweeps)\r\n console.log('sweeps data stringify: ', JSON.stringify(sweeps))\r\n\r\n // const url = config.submitSweepsURL\r\n const url = self.getURL('submitSweepsURL')\r\n console.log('cors submitSweepsURL ' + url)\r\n // prettier-ignore\r\n const options = {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(sweeps),\r\n }\r\n\r\n fetch(url, options)\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.result === null && data.error !== null) {\r\n console.log('Server error: ', data.error)\r\n window.mapPage.showErrorMessage()\r\n } else {\r\n // console.log('success submit sweeps return data ', data)\r\n self.thanksPanel.showSuccessMessage(true)\r\n //TODO: check return data for error messages\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n self.thanksPanel.showErrorMessage(true)\r\n })\r\n }\r\n\r\n let genericIndex = 0\r\n self.getGenericImage = function () {\r\n // console.log('MapPage.getGenericImage ', genericImageContainer)\r\n let img = genericImageContainer.children[genericIndex]\r\n genericIndex++\r\n if (genericIndex >= genericImageContainer.children.length) {\r\n genericIndex = 0\r\n }\r\n return img\r\n }\r\n\r\n // window.mapPage.showErrorMessage()\r\n self.showErrorMessage = function () {\r\n self.closeAllPanels()\r\n self.thanksPanel.open()\r\n self.thanksPanel.showErrorMessage(false)\r\n }\r\n\r\n self.getURL = function (id) {\r\n console.log(\r\n 'mapPage.getURL ' + id + ' is ' + document.getElementById(id).action\r\n )\r\n return document.getElementById(id).action\r\n }\r\n\r\n self.getMap = function () {\r\n return map\r\n }\r\n\r\n self.isMobile = function () {\r\n if (window.innerWidth <= config.mobileWidth) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n function resizeListener(e) {\r\n let newWidth = window.innerWidth\r\n // console.log('resize old ' + oldWidth + ' new ' + newWidth)\r\n if (\r\n oldWidth > 0 &&\r\n oldWidth >= config.mobileWidth &&\r\n newWidth < config.mobileWidth\r\n ) {\r\n self.featuredPanel.close()\r\n } else if (\r\n oldWidth > 0 &&\r\n oldWidth < config.mobileWidth &&\r\n newWidth >= config.mobileWidth\r\n ) {\r\n self.featuredPanel.close()\r\n }\r\n oldWidth = newWidth\r\n }\r\n}\r\n\r\nexport default MapPage\r\n","import LandingPage from './landing-page'\r\nimport MapPage from './map-page'\r\n\r\n//TODO: replace this with inline code later\r\nconst page = document.body.getAttribute('data-page')\r\nif (page === 'map') {\r\n window.mapPage = new MapPage('map')\r\n} else {\r\n window.landingPage = new LandingPage('globe-wrapper')\r\n}\r\n"],"sourceRoot":""}