{"version":3,"sources":["static/js/node_modules/browser-pack/_prelude.js","static/js/src/static/js/data/ApiValue.js","static/js/src/static/js/data/DataStore.js","static/js/src/static/js/data/DerivedValue.js","static/js/src/static/js/data/request.js","static/js/src/static/js/form/CheckAllCheckbox.js","static/js/src/static/js/form/ClearInputsTrigger.js","static/js/src/static/js/form/Conversation.js","static/js/src/static/js/form/ConversationBlock.js","static/js/src/static/js/form/EditableForm.js","static/js/src/static/js/form/FormField.js","static/js/src/static/js/form/RegistrationConversation.js","static/js/src/static/js/form/ToggleRequired.js","static/js/src/static/js/form/TriggerSelect.js","static/js/src/static/js/form/ValiditySection.js","static/js/src/static/js/main.js","static/js/src/static/js/monitors/MediaQuery.js","static/js/src/static/js/motion/Timeline.js","static/js/src/static/js/motion/ticker.js","static/js/src/static/js/ui/Carousel.js","static/js/src/static/js/ui/Collapsible.js","static/js/src/static/js/ui/CookieBar.js","static/js/src/static/js/ui/DataBinding.js","static/js/src/static/js/ui/DetailMap.js","static/js/src/static/js/ui/HashNavigation.js","static/js/src/static/js/ui/InlineHelp.js","static/js/src/static/js/ui/Lightbox.js","static/js/src/static/js/ui/ProgressIndicator.js","static/js/src/static/js/ui/ResponsiveTrigger.js","static/js/src/static/js/ui/ScrollSpy.js","static/js/src/static/js/ui/Sticky.js","static/js/src/static/js/ui/ToggleGroup.js","static/js/src/static/js/ui/form/Form.js","static/js/src/static/js/ui/form/FormItem.js","static/js/src/static/js/ui/form/PasswordIndicator.js","static/js/src/static/js/ui/map/Directions.js","static/js/src/static/js/ui/map/Map.js","static/js/src/static/js/ui/map/MapMarkerClusterer.js","static/js/src/static/js/ui/map/MapMarkers.js","static/js/src/static/js/ui/map/MapOverlay.js","static/js/src/static/js/ui/map/MapPolyline.js","static/js/src/static/js/ui/map/mapMarkers.js","static/js/src/static/js/ui/map/mapStyles.js","static/js/src/static/js/ui/overview/Overview.js","static/js/src/static/js/ui/overview/OverviewDataProvider.js","static/js/src/static/js/ui/overview/OverviewMap.js","static/js/src/static/js/ui/overview/overviewItem.js","static/js/src/static/js/utils/Cookies.js","static/js/src/static/js/utils/DOMHelpers.js","static/js/src/static/js/utils/FormHelper.js","static/js/src/static/js/utils/Observer.js","static/js/src/static/js/utils/ScriptLoader.js","static/js/src/static/js/utils/attributeObserver.js","static/js/src/static/js/utils/eventHelpers.js","static/js/src/static/js/utils/ioHelpers.js","static/js/src/static/js/utils/latLngHelpers.js","static/js/src/static/js/utils/scrollTo.js","static/js/src/static/js/vendor/ericweerstra/toggle/Controller.js","static/js/src/static/js/vendor/ericweerstra/toggle/Toggle.js","static/js/src/static/js/vendor/ericweerstra/toggle/Trigger.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_request","_DataStore","_ioHelpers","ApiValue","element","options","arguments","undefined","_classCallCheck","this","_element","_options","Object","assign","dataset","_store","_DataStore2","default","getSingleton","_input","_ioHelpers2","parse","input","_output","output","errorElement","_errorElement","document","querySelector","_lastQuery","_onChange","bind","watch","storeKeys","optional","_this","query","_buildQuery","_resultPromise","requestJson","endpoint","then","data","forEach","item","set","storeKey","key","innerHTML","catch","errorMessage","_this2","map","get","join","_Observer","dataStores","Map","DataStore","_values","_publishers","path","value","_Observer2","publish","_getPublisher","fn","subscribe","unsubscribe","delete","unsub","has","paths","cb","fire","filter","args","apply","_toConsumableArray","store","dataStore","location","href","indexOf","window","stores","_DataBinding","DerivedValue","_dataBinding","_DataBinding2","request","url","Promise","resolve","reject","XMLHttpRequest","open","onload","status","statusText","response","onerror","send","json","JSON","errorCode","errorUserMessage","CheckAllCheckbox","_targets","Array","from","querySelectorAll","targets","target","_onTargetChange","addEventListener","targetsState","checked","firstTargetChecked","every","state","_Trigger","_ToggleRequired","ClearInputsTrigger","_Trigger2","getElementById","inputsTarget","_inputs","_clearInputs","excludes","_ToggleRequired2","toggle","id","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","nodeName","selectedIndex","_dispatch","err","return","event","createEvent","initEvent","dispatchEvent","_HashNavigation","_Form","Conversation","setAttribute","body","style","overflow","_elements","elementSelector","_form","_Form2","_hashNavigation","_HashNavigation2","hashes","init","ignore","_onHashChange","_onKeyPress","conversation","config","_initializeDataBindings","_setConversationMode","warn","console","keys","string","summaryMode","hash","replace","activeElement","blur","activeBlock","firstInput","innerWidth","clearTimeout","_focusTimeout","setTimeout","focus","focusDelay","progress","step","total","which","preventDefault","currentBlock","hasAttribute","pop","getAttribute","_ValiditySection","ConversationBlock","_ValiditySection2","footerHTML","footerTemplate","buttons","hint","insertAdjacentHTML","concat","buttonHtml","button","link","label","_FormHelper","EditableForm","_buttons","_exceptions","exceptions","split","_edit","_cancel","_initialize","edit","editButton","submit","submitButton","cancel","cancelButton","_storeValues","elem","type","_FormHelper2","editable","_setReadonly","_this3","setValue","dispatchChangeEvent","getFormItemByElement","validate","readonly","tagName","toLowerCase","removeAttribute","bool","CustomEvent","bubbles","cancelable","Input","_onInput","_linkedToStore","linkToStore","name","_linkStore","_changeTimeout","_dispatchChangeEvent","changeDelay","_updateStore","changeEvent","validity","valid","oldValue","form","_Map","_MapPolyline","_MapMarkers","_Conversation","RegistrationConversation","_mapElement","mapSelector","_originMarker","_destinationMarker","_map","_Map2","zoom","_polyline","_MapPolyline2","_conversation","_Conversation2","_onPopState","_timeout","classList","remove","setMap","waitUntill","point","setZoom","setCenter","setPosition","addMarker","marker","end","animatePolyline","animateTo","add","_attributeObserver","ToggleRequired","_toggle","_excludes","_attribute","attribute","_activeState","activeState","_handleAttributeChange","_attributeObserver2","visible","_Controller","TriggerSelect","_currentValue","_Controller2","getToggles","defaultValue","deactivate","activate","ValiditySection","_formFields","_validate","invalidAttribute","validations","field","all","main","classes","CookieBar","_CookieBar2","Toggle","_Toggle2","Trigger","ToggleGroup","_ToggleGroup2","Overview","_Overview2","OverviewMap","_OverviewMap2","DetailMap","_DetailMap2","Collapsible","_Collapsible2","Carousel","_Carousel2","ScrollSpy","_ScrollSpy2","Sticky","_Sticky2","DataBinding","_ApiValue2","_DerivedValue2","_RegistrationConversation2","_ConversationBlock2","Directions","_Directions2","ProgressIndicator","_ProgressIndicator2","FormField","_FormField2","FormSection","HashNavigation","Lightbox","_Lightbox2","Form","_EditableForm2","PasswordIndicator","_PasswordIndicator2","InlineHelp","_InlineHelp2","ResponsiveTrigger","_ResponsiveTrigger2","_TriggerSelect2","_ClearInputsTrigger2","_CheckAllCheckbox2","stringify","_CookieBar","_Toggle","_ToggleGroup","_Collapsible","_Carousel","_Overview","_OverviewMap","_DetailMap","_ScrollSpy","_Sticky","_ApiValue","_DerivedValue","_RegistrationConversation","_ConversationBlock","_Directions","_FormField","_ProgressIndicator","_Lightbox","_EditableForm","_PasswordIndicator","_InlineHelp","_ResponsiveTrigger","_TriggerSelect","_ClearInputsTrigger","_CheckAllCheckbox","readyState","noop","MediaQuery","onMatch","onMismatch","_mql","matchMedia","addListener","_update","_onMatch","_onMismatch","matches","_ticker","Timeline","start","_start","_ticker2","time","_end","_duration","_started","_fn","_tick","Ticker","_time","_bindEvents","_raf","m","requestAnimationFrame","_DOMHelpers","sum","arr","reduce","res","val","translate","el","dx","setVendor","_slides","_slideWidths","_width","_height","_current","_slideContainer","_ui","_index","_dragging","_dragStart","_dragDelta","_containerPosition","_loop","_onResize","_gotoNext","_gotoPrevious","_onPointerDown","_onPointerMove","_onPointerUp","slice","slides","parentNode","offsetWidth","offsetHeight","_createUi","_uiCreated","previous","createElement","countLabel","template","documentFragement","createDocumentFragment","appendChild","image","slide","width","children","_goto","reflow","_getContainerOffset","pageX","touches","limit","delta","Math","max","min","abs","index","_loopIndex","_restrictIndex","_loopContainer","_loopSlides","_setCount","_highlight","displacement","dir","textContent","_collapsingElement","_createCollapsingElement","animation","_expand","_collapse","_onTransitionEnd","activeEvent","inActiveEvent","_setHeight","active","collapsingElement","insertBefore","setPrefixedStyle","height","_getHeight","propertyName","unload","removeChild","removeEventListener","_Cookies","_trigger","_onConsentBind","_onConsent","triggerElement","consent","_Cookies2","hasItem","setItem","Infinity","reload","_dependencies","match","dep","trim","regex","RegExp","_updateOutput","offsetX","offsetY","controlPosition","markerData","position","lat","latitude","lng","longitude","src","imageSrc","_hashes","_ignore","_setInitialHash","initialHash","_eventHelpers","triggerWord","group","_initializeTrigger","triggerId","_triggerElement","_expandToggle","_balloonToggle","_resize","context","wordRegx","triggerHTML","triggerContainer","test","triggerClassName","_eventHelpers2","raf","_position","_onActive","_onInactive","marginBottom","listenOnce","getTransitionEvent","margin","rRct","rct","diff","getBoundingClientRect","top","left","outerHTML","_lightbox","_iframe","iDPrefix","className","buttonClose","closeLabel","_setup","_deactivate","lightboxType","_setupIframe","iframe","documentElement","overflowClassName","_updateProgression","p","right","_MediaQuery","_triggerFn","_cleanup","_mediaQuery","_MediaQuery2","mediaQuery","getTargets","_scrollTo","_triggers","triggers","_closest","_onClick","_updateData","_onScrollRaf","_onScroll","_onScrollStart","debounceStart","passive","clickedId","_getIdFromHref","_data","find","_scrollTo2","closest","_getClosest","trigger","scrollY","pageYOffset","scrollTop","initialValue","innerHeight","scrollHeight","current","threshold","diffClosest","offsetTop","isNumber","isNaN","NOT_STICKY","noStyles","bottom","transform","zIndex","_sticky","_scrollTriggers","_stickyTopUntill","stickyTopUntill","_stickyBottomUntill","stickyBottomUntill","_offsets","_getOffsets","_createPlaceholder","_bindFunctions","_resume","_halt","_setupEvents","_updateMetrics","_unstick","_updateStickyness","debounce","action","_placeholder","placeHolderClassName","display","nextSibling","stickyTop","untill","_stickTopFrom","stickyBottom","_stickBottomFrom","_stickTopUntill","_stickBottomUntill","_scrollTriggerTopFrom","_scrollTriggerTopUntill","_scrollTriggerBottomFrom","_scrollTriggerBottomUntill","_stickFrom","_stickUntill","pos","styles","_offset","stickClassName","translation","result","offsets","offsetBottom","TOGGLE","triggerElements","triggerSelector","panelElements","panelSelector","triggerMethod","toggleType","panelElement","_checkId","inActiveState","method","addition","_FormItem","_formItems","_initializeFormItems","disableSubmitUntilValid","_toggleSubmit","_onSubmit","_onInvalid","isValid","formItem","elements","_FormItem2","push","getItem","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","isIgnored","FormItem","_label","nextElementSibling","contains","_validateRegex","_filterRegex","_matchingElement","_errorMessage","_requiredMessage","_onMatchingElementInput","setCustomValidity","setValid","setInvalid","filteredValue","checkValidity","_getRadioErrorLabel","error","_setErrorMessage","parent","values","_visible","_indicator","_visibilityToggle","pattern","strength","defaultLabel","_ScriptLoader","_geocoder","_directionsService","_ScriptLoader2","load","apiKey","google","maps","Geocoder","DirectionsService","_calculate","route","routes","overview_path","duration","round","legs","geocode","address","results","geometry","log","_this4","directions","_getDirection","_getCoords","origin","_outputToStore","destination","travelMode","GOOGLE_MAPS_API_KEY","_MapMarkerClusterer","_latLngHelpers","_mapStyles","_MapOverlay","_Timeline","_latLngs","_markers","isReady","_ready","_latLngHelpers2","parseCoordinates","center","centerOfLatLngs","_createMarkers","_positionMap","cluster","_clusterer","_MapMarkerClusterer2","markers","_resizing","_centerBeforeResize","getCenter","fitBounds","getBounds","panTo","fallbackCenterLatLng","panBy","parseFloat","opts","scrollwheel","minZoom","disableDefaultUI","zoomControl","zoomControlOptions","ControlPosition","_mapStyles2","latLngs","latLng","_addMarker","delay","_MapOverlay2","_MapMarkers2","getDOMTarget","icon","ease","_positionAnimation","_Timeline2","LatLng","_typeof","distance","point1","point2","dy","sqrt","MapMarkerClusterer","_clusters","_cluster","addListenerOnce","_clearClusters","_convertToPoint","getPosition","clustered","markerA","j","markerB","dist","_dist","unbindEvents","setVisible","_createClusterMarker","bounds","LatLngBounds","extend","getZoom","clusterMarker","openCluster","_openCluster","expandedClusterMarker","projection","getProjection","topRight","fromLatLngToPoint","getNorthEast","bottomLeft","getSouthWest","scale","pow","worldPoint","floor","x","y","mapMarkers","housingMarker","_ref","area","cost","housingMarkers","_ref2","count","detailMarker","_ref3","originMarker","destinationMarker","MapOverlay","setPrototypeOf","OverlayView","onAdd","draw","onRemove","_latLng","_view","Number","getPanes","overlayMouseTarget","overlayProjection","fromLatLngToDivPixel","MapPolyline","_animatePath","_path","_polylines","poly","polylines","polyline","Polyline","sin","PI","renderStep","setPath","_clearPath","animationDuration","strokeColor","strokeOpacity","strokeWeight","mapStyles","pink","featureType","elementType","stylers","color","visibility","saturation","hue","lightness","weight","gamma","_OverviewDataProvider","_overviewItem","_count","parseInt","number","_max","_container","container","_onTrigger","_addItems","_OverviewDataProvider2","getData","to","documentFragment","overviewItem","uriBase","OverviewDataProvider","_mapMarkers","_button","_setupButtons","_setupMap","containerId","displayOnLoad","_btn","buttonId","toString","woonoppervlakte","totaleHuur","advertentietitel","straatnaamEnHuisnummer","fotoURI","plaatsnaam","article","Cookies","sKey","decodeURIComponent","cookie","encodeURIComponent","sValue","vEnd","sPath","sDomain","bSecure","sExpires","constructor","String","Date","toUTCString","aKeys","nLen","nIdx","property","prefix","prefixes","insertAfter","newNode","referenceNode","selector","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","parentElement","FormHelper","Observer","_subscriptions","WeakMap","_informants","filterFn","subject","_push","subscription","_filter","_len","_key","_subject","_len2","_key2","informant","receiver","_receiver","ScriptLoader","_scripts","script","tag","attributeObserver","attr","mutObserver","MutationObserver","mutations","mut","attributeName","observe","attributes","attributeFilter","eventHelpers","throttle","ms","throttling","_arguments","timeout","_arguments2","fired","_arguments3","cancelAnimationFrame","transitions","transition","OTransition","MozTransition","WebkitTransition","addEventListeners","events","ioHelpers","latLngHelpers","north","south","west","parseCoordinate","coordinate","coordinates","isArray","EASING","scrollTo","scrollTargetY","tick","Controller","_toggles","_groupHandlers","handleGroupFn","_handleGroup","splice","_getToggle","ATTRIBUTE","ACTIVE_STATE","INACTIVE_STATE","_id","register","unregister","_intitialize","_setTargets"],"mappings":"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","file":"main.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\r\n *\r\n * In which:\r\n * - The left hand side is the value sent to the api (postalcode, house-number) / plucked from the reponse (city, street-name)\r\n * - The right hand side is the value taken from (postcode, huisnummer) / put into (plaats, straat) the store\r\n * */\r\n\r\nimport { requestJson } from 'data/request';\r\nimport DataStore from 'data/DataStore';\r\nimport io from 'utils/ioHelpers';\r\n\r\nclass ApiValue {\r\n\r\n constructor(element, options = {}) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(ApiValue.options, (element.dataset || {}), options);\r\n\r\n this._store = DataStore.getSingleton();\r\n\r\n this._input = io.parse(this._options.input);\r\n this._output = io.parse(this._options.output);\r\n\r\n if (this._options.errorElement) {\r\n this._errorElement = document.querySelector(this._options.errorElement);\r\n }\r\n\r\n this._lastQuery = '';\r\n\r\n this._onChange = this._onChange.bind(this);\r\n\r\n this._store.watch(io.storeKeys(this._input), this._onChange, this._options.optional);\r\n\r\n }\r\n\r\n static get options() {\r\n return {};\r\n }\r\n\r\n _onChange() {\r\n\r\n const query = this._buildQuery();\r\n\r\n if (this._lastQuery !== query) {\r\n this._resultPromise = requestJson(this._options.endpoint + '?' + query);\r\n this._lastQuery = query;\r\n }\r\n\r\n this._resultPromise\r\n .then(data => {\r\n this._output.forEach(item => this._store.set(item.storeKey, data[item.key]));\r\n if (this._errorElement) this._errorElement.innerHTML = '';\r\n })\r\n .catch(errorMessage => {\r\n if (this._errorElement) this._errorElement.innerHTML = errorMessage\r\n });\r\n\r\n }\r\n\r\n _buildQuery() {\r\n\r\n return this._input\r\n .map(input => input.key + '=' + this._store.get(input.storeKey))\r\n .join('&');\r\n\r\n }\r\n\r\n}\r\n\r\nexport default ApiValue;\r\n","/*\r\n* The DataStore is a central location for data. You can set and get data based on a path.\r\n* You can subscribe to or watch these paths, to get updates when the data is changed.\r\n* */\r\n\r\nimport observer from 'utils/Observer';\r\n\r\nconst dataStores = new Map();\r\n\r\nclass DataStore {\r\n\r\n\tconstructor() {\r\n\r\n\t\tthis._values = new Map();\r\n\t\tthis._publishers = new Map();\r\n\r\n\t}\r\n\r\n\tget(path) {\r\n\t\treturn this._values.get(path) || '';\r\n\t}\r\n\r\n\tset(path, value) {\r\n\r\n\t\t// Setting same value, bail out\r\n\t\tif (this._values.get(path) === value) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Set value\r\n\t\tthis._values.set(path, value);\r\n\r\n\t\t// Publish\r\n\t\tobserver.publish(this._getPublisher(path), 'change', value);\r\n\r\n\t}\r\n\r\n\t// Subscribe a callback function to changes in a path\r\n\tsubscribe(path, fn) {\r\n\t\tobserver.subscribe(this._getPublisher(path), 'change', fn);\r\n\t}\r\n\r\n\tunsubscribe(path, fn) {\r\n\t\tobserver.unsubscribe(this._getPublisher(path), 'change', fn);\r\n\t}\r\n\r\n\tdelete(path) {\r\n\t\tthis._values.delete(path);\r\n\t\tthis._publishers.delete(path);\r\n\t}\r\n\r\n\t// Fires fn once, when a value is set for the given path\r\n\twaitUntill(path, fn) {\r\n\r\n\t\tconst value = this.get(path);\r\n\r\n\t\tif (value) {\r\n\t\t\treturn fn(value);\r\n\t\t}\r\n\r\n\t\tconst unsub = () => {\r\n\t\t\tobserver.unsubscribe(this._getPublisher(path), 'change', fn);\r\n\t\t\tobserver.unsubscribe(this._getPublisher(path), 'change', unsub);\r\n\t\t};\r\n\r\n\t\tobserver.subscribe(this._getPublisher(path), 'change', fn);\r\n\t\tobserver.subscribe(this._getPublisher(path), 'change', unsub);\r\n\t\t\r\n\t}\r\n\r\n\t// Get value object (subscription/publication target)\r\n\t_getPublisher(path) {\r\n\r\n\t\tif (!this._publishers.has(path)) {\r\n\t\t\tthis._publishers.set(path, {});\r\n\t\t}\r\n\r\n\t\treturn this._publishers.get(path);\r\n\r\n\t}\r\n\r\n\t// todo: improve to use this._subscribers as well\r\n\t// Fires callback with values, when all paths have a non empty value\r\n\twatch(paths, cb, optional) {\r\n\r\n\t\t// Call given function with values of paths\r\n\t\t// Should return a value to use for path\r\n\t\tconst fire = () => {\r\n\r\n\t\t\tconst values = paths.filter(path => {\r\n\t\t\t\tif (path !== optional) {\r\n\t\t\t\t\treturn this._values.has(path) && this._values.get(path) !== '';\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\r\n\t\t\tif (values.length < paths.length) return;\r\n\r\n\t\t\tconst args = paths.map(path => this.get(path));\r\n\r\n\t\t\tcb(...args);\r\n\r\n\t\t};\r\n\r\n\t\t// Listen to paths\r\n\t\tpaths.forEach(path => observer.subscribe(this._getPublisher(path), 'change', fire));\r\n\r\n\t\t// Update initially\r\n\t\tfire();\r\n\r\n\t}\r\n\r\n\t// todo: unwatch() {}\r\n\r\n\tstatic getSingleton(store = 'default') {\r\n\r\n\t\tif (!dataStores.has(store)) {\r\n\t\t\tdataStores.set(store, new DataStore(true));\r\n\t\t}\r\n\r\n\t\tconst dataStore = dataStores.get(store);\r\n\r\n\t\tif (location.href.indexOf('debug=true') !== -1) {\r\n\t\t\twindow.stores = window.stores || {};\r\n\t\t\twindow.stores[store] = dataStore;\r\n\t\t}\r\n\r\n\t\treturn dataStore;\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default DataStore;","/*\r\n* This module listens to one or more paths in the datastore, puts them together according to the data-value attribute and\r\n* stores this value in the data store under the path given by data-output\r\n*\r\n* \r\n*\r\n* */\r\n\r\nimport DataStore from 'data/DataStore';\r\nimport DataBinding from 'ui/DataBinding';\r\nimport observer from 'utils/Observer';\r\n\r\nclass DerivedValue {\r\n\r\n constructor(element, options = {}) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(DerivedValue.options, (element.dataset || {}), options);\r\n\r\n this._store = DataStore.getSingleton();\r\n\r\n this._onChange = this._onChange.bind(this);\r\n\r\n this._dataBinding = new DataBinding(null, this._options);\r\n\r\n observer.subscribe(this._dataBinding, 'change', this._onChange);\r\n\r\n }\r\n\r\n static get options() {\r\n return {};\r\n }\r\n\r\n _onChange(value) {\r\n this._store.set(this._options.output, value);\r\n }\r\n \r\n}\r\n\r\nexport default DerivedValue;\r\n","const request = url => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n let request = new XMLHttpRequest();\r\n request.open('GET', url);\r\n\r\n request.onload = function() {\r\n\r\n if (request.status !== 200) {\r\n reject(request.statusText);\r\n return;\r\n }\r\n\r\n resolve(request.response);\r\n\r\n };\r\n \r\n request.onerror = function() {\r\n reject('There was a network error.');\r\n };\r\n\r\n request.send();\r\n\r\n });\r\n\r\n};\r\n\r\nconst requestJson = url => {\r\n return request(url)\r\n .then(json => {\r\n try {\r\n return JSON.parse(json);\r\n } catch(e) {\r\n return Promise.reject('The received data was not JSON');\r\n }\r\n })\r\n .then(data => data.errorCode ? Promise.reject(data.errorUserMessage) : data)\r\n};\r\n\r\nexport { request, requestJson }\r\nexport default request;","\r\nconst TARGETS_CHECKED = 'TARGETS_CHECKED';\r\nconst TARGETS_UNCHECKED = 'TARGETS_UNCHECKED';\r\nconst TARGETS_MIXED = 'TARGETS_MIXED';\r\n\r\nclass CheckAllCheckbox {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(CheckAllCheckbox.options, options);\r\n\r\n this._targets = Array.from(document.querySelectorAll(options.targets))\r\n .filter(target => target !== element);\r\n\r\n this._onChange = this._onChange.bind(this);\r\n this._onTargetChange = this._onTargetChange.bind(this);\r\n\r\n element.addEventListener('change', this._onChange);\r\n this._targets.forEach(target => target.addEventListener('change', this._onTargetChange));\r\n\r\n }\r\n\r\n static get options() {\r\n return {\r\n targets: null\r\n };\r\n };\r\n\r\n get targetsState() {\r\n\r\n const firstTargetChecked = this._targets[0].checked;\r\n const valuesAreEqual = this._targets.every(target => target.checked === firstTargetChecked);\r\n\r\n if (valuesAreEqual) {\r\n return firstTargetChecked ? TARGETS_CHECKED : TARGETS_UNCHECKED;\r\n }\r\n\r\n return TARGETS_MIXED;\r\n\r\n }\r\n\r\n set targetsState(state) {\r\n\r\n if (state !== TARGETS_CHECKED && state !== TARGETS_UNCHECKED) return;\r\n\r\n const checked = state === TARGETS_CHECKED;\r\n this._targets.forEach(target => target.checked = checked);\r\n\r\n }\r\n\r\n _onChange() {\r\n this.targetsState = this._element.checked ? TARGETS_CHECKED : TARGETS_UNCHECKED;\r\n }\r\n\r\n _onTargetChange() {\r\n\r\n if (this.targetsState === TARGETS_MIXED) {\r\n this._element.checked = false;\r\n return;\r\n }\r\n\r\n this._element.checked = this._targets[0].checked;\r\n\r\n }\r\n\r\n}\r\n\r\nexport default CheckAllCheckbox;","import Trigger from 'toggle/Trigger';\r\nimport ToggleRequired from 'form/ToggleRequired';\r\n\r\nclass ClearInputsTrigger {\r\n\r\n constructor(element, options) {\r\n\r\n new Trigger(element, options);\r\n\r\n const target = document.getElementById(options.inputsTarget);\r\n this._inputs = target.querySelectorAll('input, select, textarea');\r\n element.addEventListener('click', () => this._clearInputs());\r\n\r\n const excludes = options.excludes || '';\r\n new ToggleRequired(target, { toggle: target.id, excludes: excludes });\r\n\r\n }\r\n\r\n _clearInputs() {\r\n for (let input of this._inputs) {\r\n input.nodeName === 'SELECT' ? input.selectedIndex = 0 : input.value = '';\r\n this._dispatch(input);\r\n }\r\n }\r\n\r\n _dispatch(element) {\r\n const event = document.createEvent('HTMLEvents');\r\n event.initEvent('input', false, true);\r\n element.dispatchEvent(event);\r\n }\r\n\r\n}\r\n\r\nexport default ClearInputsTrigger;","/*\r\n* The conversation module\r\n* - Initializes ConversationBlocks modules\r\n* - Initializes a HashNavigation\r\n* - For the hashes the conversation block id's are used, appended with the id of this element (summary mode)\r\n* - Updates the store with the progression on hash change\r\n* - Focuses the first input when switching between conversation blocks\r\n* */\r\n\r\n// Todo: fix 2 separate form dirs\r\nimport DataStore from 'data/DataStore';\r\nimport { requestJson } from 'data/request';\r\nimport DataBinding from 'ui/DataBinding';\r\nimport HashNavigation from 'ui/HashNavigation';\r\nimport Form from 'ui/form/Form';\r\n\r\nconst KEY_ENTER = 13;\r\nconst CONVERSATION_MODE_ATTR = 'data-conversation-mode';\r\n\r\nclass Conversation {\r\n\t\r\n\tconstructor(element, options = {}) {\r\n\t\t\r\n\t\tthis._element = element;\r\n\t\tthis._element.setAttribute('autocomplete', 'off');\r\n\t\tthis._options = Object.assign(Conversation.options, options);\r\n\r\n\t\tthis._store = DataStore.getSingleton();\r\n\r\n\t\tdocument.body.style.overflow = 'hidden';\r\n\r\n\t\tthis._elements = Array.from(document.querySelectorAll(this._options.elementSelector));\r\n\r\n\t\tthis._output = JSON.parse(this._options.output || \"{}\");\r\n\r\n\t\tthis._form = new Form(this._element, {});\r\n\r\n\r\n\t\tthis._hashNavigation = new HashNavigation(this._element, {\r\n\t\t\thashes: this._options.hashes || this._elements.map(element => element.id).join(',') + ',' + this._element.id,\r\n\t\t\tinit: this._options.init,\r\n\t\t\tignore: this._element.id\r\n\t\t});\r\n\r\n\t\tthis._onHashChange = this._onHashChange.bind(this);\r\n\t\tthis._onKeyPress = this._onKeyPress.bind(this);\r\n\r\n\t\twindow.addEventListener('hashchange', this._onHashChange);\r\n\t\twindow.addEventListener('keypress', this._onKeyPress);\r\n\r\n\t\t// Providing your databindings in a JSON is not required, you can also initialize ui/DataBinding on the node's individually\r\n\t\tthis._options.conversation && requestJson(this._options.conversation)\r\n\t\t\t.then(config => this._initializeDataBindings(config));\r\n\r\n\t\t// Either 'conversation' or 'summary', based on hash\r\n\t\tthis._setConversationMode();\r\n\t\t\r\n\t}\r\n\t\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\telementSelector: '[data-module=\"form/ConversationBlock\"]',\r\n\t\t\tfocusDelay: 1850\r\n\t\t};\r\n\t}\r\n\r\n\t_initializeDataBindings(config) {\r\n\r\n\t\tconst warn = id => console.warn(`No element with id=\"${ id }\" found in document.`);\r\n\r\n\t\tObject.keys(config)\r\n\t\t\t.map(key => document.getElementById(key) || warn(key))\r\n\t\t\t.filter(element => element)\r\n\t\t\t.map(element => new DataBinding(element, { string: config[ element.id ] }));\r\n\r\n\t}\r\n\r\n\t_setConversationMode() {\r\n\r\n\t\tconst summaryMode = location.hash.replace('#', '') === this._element.id;\r\n\r\n\t\tthis._element.setAttribute(CONVERSATION_MODE_ATTR, summaryMode ? 'summary' : 'conversation');\r\n\r\n\t}\r\n\r\n\t_onHashChange() {\r\n\r\n\t\tdocument.activeElement.blur();\r\n\r\n\t\tthis._setConversationMode();\r\n\r\n\t\tconst activeBlock = this._hashNavigation.activeElement;\r\n\t\tconst firstInput = activeBlock && activeBlock.querySelector('input, textarea');\r\n\r\n\t\tif (firstInput && window.innerWidth > 480) {\r\n\t\t\tclearTimeout(this._focusTimeout);\r\n\t\t\tthis._focusTimeout = setTimeout(() => firstInput.focus(), this._options.focusDelay);\r\n\t\t}\r\n\r\n\t\t// Data output\r\n\t\tthis._output.progress && this._store.set(this._output.progress, this._hashNavigation.status.progress);\r\n\t\tthis._output.step && this._store.set(this._output.step, this._hashNavigation.status.step);\r\n\t\tthis._output.total && this._store.set(this._output.total, this._hashNavigation.status.total);\r\n\r\n\t}\r\n\r\n\t_onKeyPress(e) {\r\n\r\n\t\tif (e.which === KEY_ENTER) {\r\n\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tconst currentBlock = this._hashNavigation.activeElement;\r\n\r\n\t\t\t// Check whether the section is valid\r\n\t\t\tif (!currentBlock || currentBlock.hasAttribute('data-invalid')) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Go to the hash used in the last button in this conversation block\r\n\t\t\tconst hash = Array.from(currentBlock.querySelectorAll('a'))\r\n\t\t\t\t.pop()\r\n\t\t\t\t.getAttribute('href')\r\n\t\t\t\t.replace('#', '');\r\n\r\n\t\t\twindow.location.hash = hash;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default Conversation;\r\n","/*\r\n* Renders a footer with buttons, because they should only be visible with javascript\r\n* Initializes a visiblity section to enable disable the buttons when the section is invalid\r\n* */\r\n\r\nimport ValiditySection from 'form/ValiditySection';\r\n\r\nclass ConversationBlock {\r\n\t\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(ConversationBlock.options, options);\r\n\r\n\t\tnew ValiditySection(element, {});\r\n\r\n\t\tconst footerHTML = ConversationBlock.footerTemplate(JSON.parse(this._options.buttons), options.hint);\r\n\t\tfooterHTML && element.insertAdjacentHTML('beforeend', footerHTML);\r\n\t\t\r\n\t}\r\n\t\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tbuttons: \"[]\"\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic footerTemplate(buttons, hint) {\r\n\r\n\t\tbuttons = [].concat(buttons);\r\n\r\n\t\tconst buttonHtml = buttons\r\n\t\t\t.map(button => `${ button.label }`)\r\n\t\t\t.join('');\r\n\r\n\t\tif (!buttons.length && !hint) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn `\r\n\t\t\r\n\t\t`;\r\n\t}\r\n\t\r\n}\r\n\r\nexport default ConversationBlock;\r\n","import FormHelper from 'utils/FormHelper';\r\nimport Form from 'ui/form/Form';\r\n\r\nconst ATTR_EDITABLE = 'data-editable';\r\n\r\nclass EditableForm {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n this._inputs = [];\r\n this._buttons = {};\r\n this._exceptions = this._options.exceptions ? this._options.exceptions.split(',') : [];\r\n this._form = new Form(element, options);\r\n\r\n this._edit = this._edit.bind(this);\r\n this._cancel = this._cancel.bind(this);\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n set editable(bool) {\r\n this._element.setAttribute(ATTR_EDITABLE, bool);\r\n this._buttons.edit.setAttribute('aria-hidden', bool);\r\n this._buttons.submit.setAttribute('aria-hidden', !bool);\r\n this._buttons.cancel.setAttribute('aria-hidden', !bool);\r\n }\r\n\r\n _initialize() {\r\n\r\n // get button nodes\r\n this._buttons.edit = this._element.querySelector(this._options.editButton);\r\n this._buttons.submit = this._element.querySelector(this._options.submitButton);\r\n this._buttons.cancel = this._element.querySelector(this._options.cancelButton);\r\n\r\n // bind events\r\n this._buttons.edit.addEventListener('click', this._edit);\r\n this._buttons.cancel.addEventListener('click', this._cancel);\r\n\r\n this._storeValues();\r\n this._cancel();\r\n\r\n }\r\n\r\n _storeValues() {\r\n\r\n this._inputs = Array.from(this._element.querySelectorAll('input,select,textarea'))\r\n .filter(elem => elem.type !== 'hidden')\r\n .filter(elem => this._exceptions.indexOf(elem.id) === -1)\r\n .map(elem => {\r\n return { 'element': elem, 'value': FormHelper.value(elem) };\r\n });\r\n\r\n }\r\n\r\n _edit(e) {\r\n\r\n e && e.preventDefault();\r\n\r\n this.editable = true;\r\n\r\n this._storeValues();\r\n this._inputs.forEach(item => this._setReadonly(item, false));\r\n\r\n }\r\n\r\n _cancel(e) {\r\n\r\n e && e.preventDefault();\r\n\r\n this.editable = false;\r\n\r\n this._inputs.forEach(item => {\r\n\r\n if (FormHelper.value(item.element) !== item.value) {\r\n FormHelper.setValue(item.element, item.value);\r\n dispatchChangeEvent(item.element);\r\n }\r\n\r\n this._setReadonly(item, true);\r\n\r\n this._form.getFormItemByElement(item.element).validate();\r\n\r\n });\r\n\r\n }\r\n\r\n _setReadonly(item, readonly) {\r\n\r\n if (readonly) {\r\n\r\n item.element.setAttribute('readonly', '');\r\n\r\n if (item.element.tagName.toLowerCase() === 'select') {\r\n item.element.setAttribute('disabled', '');\r\n }\r\n\r\n if (item.element.type === 'radio' || item.element.type === 'checkbox') {\r\n item.element.setAttribute('disabled', '');\r\n }\r\n\r\n } else {\r\n\r\n item.element.removeAttribute('readonly');\r\n\r\n const checkable = ['checkbox', 'radio'].indexOf(item.element.type) !== -1;\r\n if (!checkable || item.element.checked) {\r\n dispatchChangeEvent(item.element);\r\n }\r\n\r\n if (item.element.tagName.toLowerCase() === 'select') {\r\n item.element.removeAttribute('disabled');\r\n }\r\n\r\n if (item.element.type === 'radio' || item.element.type === 'checkbox') {\r\n item.element.removeAttribute('disabled');\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n getForm() {\r\n return this._form;\r\n }\r\n\r\n}\r\n\r\nconst dispatchChangeEvent = element => {\r\n element.dispatchEvent(new CustomEvent(\"change\", {\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n};\r\n\r\nexport default EditableForm;\r\n","import DataStore from 'data/DataStore';\r\nimport FormHelper from 'utils/FormHelper';\r\n\r\n// todo: refactor\r\n/*\r\n* This module:\r\n* - Fires a changes event 250ms after the last keystroke\r\n* - Copies a the value to the data-value attribute\r\n* - Sends the value to the data store\r\n* - Tries to update it's value when the data store changes\r\n* - Updates fail when the value would cause the input to become invalid\r\n* - When the value is an empty string\r\n* */\r\n\r\nclass Input {\r\n\t\r\n\tconstructor(element, options = {}) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(Input.options, options);\r\n\r\n\t\tthis._onInput = this._onInput.bind(this);\r\n\t\tthis._onChange = this._onChange.bind(this);\r\n\r\n\t\tthis._linkedToStore = false;\r\n\r\n\t\tif (this._options.linkToStore && document.querySelectorAll(`[name=\"${ element.name }\"]`).length <= 1) {\r\n this._linkStore();\r\n }\r\n\r\n\t\telement.addEventListener('input', this._onInput);\r\n\t\telement.addEventListener('change', this._onChange);\r\n\r\n\t\t// Enable enhancements\r\n\t\tthis._element.setAttribute('data-value', this._element.value);\r\n\t\telement.setAttribute('data-enhanced', '');\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tchangeDelay: 750,\r\n\t\t\tform: null,\r\n\t\t\tlinkToStore: true\r\n\t\t};\r\n\t}\r\n\r\n\tget value() {\r\n\t\treturn FormHelper.value(this._element);\r\n\t}\r\n\r\n\tset value(value) {\r\n\r\n\t\tif (!value || this._element.getAttribute('data-value') === value) return;\r\n\r\n\t\tconst oldValue = this._element.value;\r\n\r\n\t\tFormHelper.setValue(this._element, value);\r\n\r\n\t\t// Test if the value is valid. Revert if not\r\n\t\tif (!this._element.validity.valid) {\r\n FormHelper.setValue(this._element, oldValue);\r\n\t\t}\r\n\r\n\t\tthis._element.setAttribute('data-value', this._element.value);\r\n\r\n this._dispatchChangeEvent()\r\n\r\n\t}\r\n\r\n\t_onInput() {\r\n\r\n\t\t// Update the input attribute\r\n\t\tthis._element.setAttribute('data-value', this.value);\r\n\r\n\t\t// Fire a change event after x ms idle time\r\n\t\tthis._changeTimeout && clearTimeout(this._changeTimeout);\r\n\t\tthis._changeTimeout = setTimeout(() => this._dispatchChangeEvent(), this._options.changeDelay);\r\n\r\n\t}\r\n\r\n\t_onChange() {\r\n\r\n this._element.setAttribute('data-value', this.value);\r\n\t\tthis._changeTimeout && clearTimeout(this._changeTimeout);\r\n\r\n // Update the store on change\r\n this._updateStore();\r\n\r\n\t}\r\n\r\n _dispatchChangeEvent() {\r\n\r\n const changeEvent = new CustomEvent('change', {\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n\r\n this._element.dispatchEvent(changeEvent);\r\n\r\n\t}\r\n\r\n\t_linkStore() {\r\n\r\n\t\tthis._linkedToStore = true;\r\n\r\n this._store = DataStore.getSingleton();\r\n this._store.subscribe(this._element.name, value => this.value = value);\r\n\r\n\t\tif (this._store.get(this._element.name)) {\r\n // If the this._store has this value, set it\r\n this.value = this._store.get(this._element.name);\r\n } else if (this.value) {\r\n // If the this._store doesn't have this value, but we have a valid one -> update the store\r\n this._updateStore();\r\n }\r\n\r\n\t}\r\n\r\n\t_updateStore() {\r\n\r\n\t\tif (!this._linkedToStore) return;\r\n\r\n // We need to delay IE11 validation retreival with 1 ms, because the validityState object isn't updated directly for selects\r\n\t\tsetTimeout(() => {\r\n\r\n\t\t\tconst value = this._element.validity.valid ? FormHelper.value(this._element) : '';\r\n\r\n // Update the store with our value, if it's valid\r\n this._store.set(this._element.name, value);\r\n\r\n\t\t}, 1);\r\n\r\n\t}\r\n\t\r\n}\r\n\r\nexport default Input;\r\n","/*\r\n* This module wraps the regular Conversation module, to add some specific functionality for the Registration conversation.\r\n* */\r\n\r\nimport DataStore from 'data/DataStore';\r\nimport Map from 'ui/map/Map';\r\nimport MapPolyline from 'ui/map/MapPolyline';\r\nimport mapMarkers from 'ui/map/MapMarkers';\r\nimport Conversation from 'form/Conversation';\r\n\r\nclass RegistrationConversation {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = options;\r\n\r\n\t\tthis._mapElement = document.querySelector(options.mapSelector);\r\n\t\tthis._originMarker = null;\r\n this._destinationMarker = null;\r\n\r\n\t\tthis._map = new Map(this._mapElement, Object.assign(options, { zoom: 10, style: 'null' }));\r\n\t\tthis._polyline = new MapPolyline({ map: this._map });\r\n\t\tthis._conversation = new Conversation(this._element, options);\r\n\r\n\t\tthis._store = DataStore.getSingleton();\r\n\t\t\r\n\t\tthis._onPopState = this._onPopState.bind(this);\r\n\r\n\t\twindow.addEventListener('hashchange', this._onPopState);\r\n\r\n\t}\r\n\r\n\t_onPopState() {\r\n\r\n\t\tconst hash = window.location.hash.replace('#', '');\r\n\r\n\t\tswitch(hash) {\r\n\r\n\t\t\tcase 'map-1':\r\n\r\n\t\t\t\tclearTimeout(this._timeout);\r\n\t\t\t\tthis._timeout = setTimeout(() => {\r\n\r\n\t\t\t\t\tthis._mapElement.classList.remove('hidden');\r\n\r\n if (this._destinationMarker) {\r\n this._destinationMarker.setMap(null);\r\n this._destinationMarker = null;\r\n }\r\n\r\n\t\t\t\t\tthis._store.waitUntill('route', path => {\r\n\r\n\t\t\t\t\t\tlet point = path;\r\n\t\t\t\t\t\tif (path.length) {\r\n\t\t\t\t\t\t\tthis._polyline.path = path;\r\n\t\t\t\t\t\t\tpoint = path[0];\r\n this._map.map.setZoom(10);\r\n\t\t\t\t\t\t} else {\r\n this._map.map.setZoom(7);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis._map.map.setCenter(point);\r\n\r\n\t\t\t\t\t\tif (this._originMarker) {\r\n this._originMarker.setPosition(point);\r\n } else {\r\n this._originMarker = this._map.addMarker(this._map.map, point, { marker: 'originMarker' });\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t}, 1250);\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'map-2':\r\n\r\n\t\t\t\tclearTimeout(this._timeout);\r\n\t\t\t\tthis._timeout = setTimeout(() => this._mapElement.classList.remove('hidden'), 1250);\r\n\t\t\t\t\r\n\t\t\t\tif (!this._polyline.path || !this._polyline.path.length) {\r\n\t\t\t\t\tbreak;\r\n }\r\n\t\t\t\t\r\n\t\t\t\tsetTimeout(() => {\r\n\r\n\t\t\t\t\tconst end = this._polyline.path[this._polyline.path.length - 1];\r\n\t\t\t\t\t\r\n\t\t\t\t\tthis._polyline.animatePolyline(2000);\r\n\t\t\t\t\tthis._map.animateTo(end, 2250);\r\n\r\n\t\t\t\t\tif (this._destinationMarker) {\r\n\t\t\t\t\t\tsetTimeout(() => this._destinationMarker.setPosition(end), 2250);\r\n\t\t\t\t\t} else {\r\n setTimeout(() => this._destinationMarker = this._map.addMarker(this._map.map, end, { marker: 'destinationMarker' }), 2250);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}, 1800);\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\r\n\t\t\t\tclearTimeout(this._timeout);\r\n\t\t\t\tthis._mapElement.classList.add('hidden');\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default RegistrationConversation;","import attributeObserver from 'utils/attributeObserver';\r\n\r\nclass ToggleRequired {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(ToggleRequired.options, options);\r\n\r\n this._toggle = document.getElementById(this._options.toggle);\r\n\r\n this._excludes = this._options.excludes.split(',');\r\n this._inputs = Array.from(this._element.querySelectorAll('input, select, textarea'))\r\n .filter(item => this._excludes.indexOf(item.id) === -1);\r\n\r\n this._attribute = this._toggle.dataset.attribute || this._options.attribute;\r\n this._activeState = this._toggle.dataset.activeState || this._options.activeState;\r\n\r\n this._handleAttributeChange = this._handleAttributeChange.bind(this);\r\n attributeObserver(this._toggle, this._attribute, this._handleAttributeChange);\r\n\r\n setTimeout(() => this._handleAttributeChange(this._toggle.getAttribute(this._attribute)), 1);\r\n\r\n }\r\n\r\n static get options() {\r\n return {\r\n excludes: '',\r\n attribute: 'data-toggle-active',\r\n activeState: 'true'\r\n };\r\n }\r\n\r\n _handleAttributeChange(value) {\r\n\r\n const visible = value === this._activeState;\r\n\r\n this._inputs.forEach(input => visible ? input.setAttribute('required','') : input.removeAttribute('required'));\r\n\r\n }\r\n\r\n}\r\n\r\nexport default ToggleRequired\r\n","import Controller from 'toggle/Controller';\r\n\r\nclass TriggerSelect {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n this._currentValue = '';\r\n this._toggle = null;\r\n\r\n this._element.addEventListener('change', e => this._onChange(e));\r\n\r\n }\r\n\r\n _onChange() {\r\n\r\n if (!this._toggle) {\r\n this._toggle = Controller.getToggles(this._options.target)[0];\r\n }\r\n\r\n const value = this._element.options[this._element.selectedIndex].value;\r\n\r\n if (this._currentValue !== value) {\r\n\r\n value !== this._options.defaultValue ? this._toggle.deactivate() : this._toggle.activate();\r\n\r\n this._currentValue = value;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default TriggerSelect;","/**\r\n * This module represents whether it's contained form fields are valid. It exposes an data-invalid boolean attribute\r\n */\r\n//import request from 'data/request';\r\n\r\nclass ValiditySection {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(ValiditySection.options, (element.dataset || {}), options);\r\n\r\n\t\tthis._formFields = Array.from(element.querySelectorAll('input, select, textarea'));\r\n\r\n\t\t//this._server = false;\r\n\t\tthis._validate = this._validate.bind(this);\r\n\t\tthis._validate();\r\n\r\n\t\telement.addEventListener('input', this._validate);\r\n\t\telement.addEventListener('change', this._validate);\r\n\r\n\t\t/*this._formFields.forEach(field => {\r\n\t\t\tif (field.hasAttribute('data-validation-uri')) {\r\n\t\t\t\tthis._server = true;\r\n\t\t\t\tfield.addEventListener('blur', e => this._onInput(e));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfield.addEventListener('input', e => this._onInput(e));\r\n\t\t\t\tfield.addEventListener('change', e => this._onInput(e));\r\n\t\t\t}\r\n\t\t});*/\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\t// todo: implement disableWhenInvalid option\r\n\t\t\tinvalidAttribute: 'data-invalid'\r\n\t\t};\r\n\t}\r\n\r\n\t/*_onInput(e) {\r\n\t\tif (!this._server) {\r\n\t\t\tthis._validate(this._formFields.filter(field => !field.validity.valid).length === 0);\r\n\t\t}\r\n\t\telse {\r\n\t\t\trequest(e.target.getAttribute('data-validation-uri')).then(response => this._validate(JSON.parse(response).valid || false) );\r\n\t\t}\r\n\t}\r\n\r\n\t_validate(valid) {\r\n\t\tvalid ? this._element.removeAttribute(this._options.invalidAttribute) : this._element.setAttribute(this._options.invalidAttribute, '');\r\n\t\tthis._server = false;\r\n\t}*/\r\n\r\n\tget valid() {\r\n\r\n\t\t// We need to delay IE11 validation retreival with 1 ms, because the validityState object isn't updated directly for selects\r\n\t\t// This would resolve in selects reporting an incorrect false validity\r\n\t\t// The sunny side would be we can probably use this for async validation in the future\r\n const validations = this._formFields.map(field => {\r\n \treturn new Promise(resolve => {\r\n \t\tsetTimeout(() => resolve(field.validity.valid), 1);\r\n })\r\n });\r\n\r\n return Promise\r\n\t\t\t.all(validations)\r\n\t\t\t.then(validations => validations.filter(valid => !valid).length === 0)\r\n\t\t\t.then(valid => valid ? Promise.resolve() : Promise.reject());\r\n\r\n\t}\r\n\r\n\t_validate() {\r\n\r\n\t\tthis.valid.then(\r\n\t\t\t() => this._element.removeAttribute(this._options.invalidAttribute),\r\n\t\t\t() => this._element.setAttribute(this._options.invalidAttribute, '')\r\n\t\t)\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default ValiditySection;\r\n","import CookieBar from 'ui/CookieBar';\r\nimport Trigger from 'toggle/Trigger';\r\nimport Toggle from 'toggle/Toggle';\r\nimport ToggleGroup from 'ui/ToggleGroup';\r\nimport Collapsible from 'ui/Collapsible';\r\nimport Carousel from 'ui/Carousel';\r\nimport Map from 'ui/map/Map';\r\nimport Overview from 'ui/overview/Overview';\r\nimport OverviewMap from 'ui/overview/OverviewMap';\r\nimport DetailMap from 'ui/DetailMap';\r\nimport ScrollSpy from 'ui/ScrollSpy';\r\nimport Sticky from 'ui/Sticky';\r\nimport DataBinding from 'ui/DataBinding';\r\nimport ApiValue from 'data/ApiValue';\r\nimport DerivedValue from 'data/DerivedValue';\r\nimport Conversation from 'form/Conversation';\r\nimport RegistrationConversation from 'form/RegistrationConversation';\r\nimport ConversationBlock from 'form/ConversationBlock';\r\nimport Directions from 'ui/map/Directions';\r\nimport FormField from 'form/FormField';\r\nimport FormSection from 'form/ValiditySection';\r\nimport HashNavigation from 'ui/HashNavigation';\r\nimport ProgressIndicator from 'ui/ProgressIndicator';\r\nimport Lightbox from 'ui/Lightbox';\r\nimport Form from 'ui/form/Form';\r\nimport EditableForm from 'form/EditableForm';\r\nimport PasswordIndicator from 'ui/form/PasswordIndicator';\r\nimport InlineHelp from 'ui/InlineHelp';\r\nimport ToggleRequired from 'form/ToggleRequired';\r\nimport ResponsiveTrigger from 'ui/ResponsiveTrigger';\r\nimport TriggerSelect from 'form/TriggerSelect';\r\nimport ClearInputsTrigger from 'form/ClearInputsTrigger';\r\nimport CheckAllCheckbox from 'form/CheckAllCheckbox';\r\n\r\nfunction main() {\r\n\r\n const classes = {\r\n CookieBar,\r\n Toggle,\r\n Trigger,\r\n ToggleGroup,\r\n Map,\r\n Overview,\r\n OverviewMap,\r\n DetailMap,\r\n Collapsible,\r\n Carousel,\r\n ScrollSpy,\r\n Sticky,\r\n DataBinding,\r\n ApiValue,\r\n DerivedValue,\r\n Conversation,\r\n RegistrationConversation,\r\n ConversationBlock,\r\n Directions,\r\n ProgressIndicator,\r\n FormField,\r\n FormSection,\r\n HashNavigation,\r\n Lightbox,\r\n Form,\r\n EditableForm,\r\n PasswordIndicator,\r\n InlineHelp,\r\n ToggleRequired,\r\n ResponsiveTrigger,\r\n TriggerSelect,\r\n ClearInputsTrigger,\r\n CheckAllCheckbox\r\n };\r\n\r\n for (let element of document.querySelectorAll('[data-module]')) {\r\n const options = JSON.parse(JSON.stringify(element.dataset));\r\n new classes[element.dataset.module.split('/').pop()](element, options);\r\n element.setAttribute('data-initialized',''); // Todo: module specific solution?\r\n } \r\n\r\n}\r\n\r\nif (document.readyState === 'interactive' || document.readyState === 'complete') {\r\n main();\r\n} else {\r\n document.addEventListener('DOMContentLoaded', main);\r\n}","const noop = () => {};\r\n\r\nclass MediaQuery {\r\n \r\n constructor(query, onMatch, onMismatch) {\r\n\r\n onMatch = onMatch || noop;\r\n onMismatch = onMismatch || noop;\r\n\r\n this._mql = window.matchMedia(query);\r\n this._mql.addListener(this._update.bind(this));\r\n\r\n this._onMatch = onMatch;\r\n this._onMismatch = onMismatch;\r\n\r\n this._mql.matches ? onMatch() : onMismatch();\r\n \r\n }\r\n\r\n get matches() {\r\n return this._mql.matches;\r\n }\r\n \r\n _update() {\r\n this.matches ? this._onMatch() : this._onMismatch();\r\n }\r\n \r\n}\r\n\r\nexport default MediaQuery;\r\n","import observer from 'utils/Observer';\r\nimport ticker from 'motion/ticker';\r\n\r\nclass Timeline {\r\n\r\n /**\r\n * Returns a timeline running from 0 to 1.\r\n * Start and end are defined relative to the moment of creation of the timeline\r\n * Provide arguments as new Timeline(end, fn) or new Timeline(start, end, fn)\r\n * @returns {{start: int, end: int, duration: duration, started: boolean, fn: function}}\r\n */\r\n\r\n constructor() {\r\n\r\n let start = arguments.length === 3 ? arguments[0] : 0;\r\n let end = arguments.length === 3 ? arguments[1] : arguments[0];\r\n let fn = arguments[arguments.length - 1];\r\n\r\n this._start = ticker.time + start + 16;\r\n this._end = ticker.time + end;\r\n this._duration = end - start - 16;\r\n this._started = false;\r\n this._fn = fn;\r\n\r\n this._tick = this._tick.bind(this);\r\n this._tick(16);\r\n\r\n observer.subscribe(ticker, 'time', this._tick);\r\n\r\n }\r\n\r\n cancel() {\r\n observer.unsubscribe(ticker, 'time', this._tick);\r\n }\r\n\r\n _tick(time) {\r\n\r\n if (time < this._start) {\r\n return; // Bail out\r\n } else if (!this._started) {\r\n this._started = true;\r\n this._fn(0);\r\n }\r\n\r\n if (time > this._end) {\r\n this.cancel();\r\n this._fn(1);\r\n return; // Bail out\r\n }\r\n\r\n this._fn((time - this._start) / this._duration);\r\n\r\n }\r\n\r\n}\r\n\r\nexport default Timeline;\r\n","import observer from 'utils/Observer';\r\n\r\nclass Ticker {\r\n\r\n constructor() {\r\n this._time = 0;\r\n this._bindEvents();\r\n }\r\n\r\n _bindEvents() {\r\n\r\n if ('requestAnimationFrame' in window) {\r\n this._raf = m => requestAnimationFrame(t => m(t));\r\n } else {\r\n this._raf = m => setTimeout(() => m(this._time + 1000 / 60), 1000 / 60);\r\n }\r\n\r\n this._tick(0);\r\n\r\n }\r\n\r\n _tick(t) {\r\n\r\n observer.publish(this, 'tick', t - this._time);\r\n observer.publish(this, 'time', t);\r\n\r\n this._time = t;\r\n this._raf(t => this._tick(t));\r\n\r\n }\r\n\r\n get time() {\r\n return this._time;\r\n }\r\n\r\n}\r\n\r\nexport default new Ticker();\r\n","import { setVendor } from 'utils/DOMHelpers'\r\nimport { reflow } from 'utils/DOMHelpers'\r\n//import { debounce } from 'utils/eventHelpers';\r\n\r\nconst PAN_THRESHOLD = 50,\r\n PREVIOUS_LABEL = 'Vorige afbeelding',\r\n NEXT_LABEL = 'Vorige afbeelding',\r\n PREVIOUS_CLASS_NAME = 'carousel-previous',\r\n NEXT_CLASS_NAME = 'carousel-next',\r\n COUNT_CLASS_NAME = 'carousel-count',\r\n HIGHLIGHT_CLASS_NAME = 'highlight';\r\n\r\nconst sum = arr => arr.reduce((res, val) => res + val, 0);\r\nconst min = arr => arr.reduce((res, val) => Math.min(res, val), Infinity);\r\nconst translate = (el, dx) => setVendor(el, 'transform', 'translateX(' + dx + ')');\r\n\r\nclass Carousel {\r\n\r\n /**\r\n * @class Carousel\r\n * Carousel to display images in slides, which loop infinitely whenever possible\r\n * @constructor\r\n */\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n\r\n this._slides = [];\r\n this._slideWidths = [];\r\n this._width = 0;\r\n this._height = 0;\r\n this._current = null;\r\n\r\n // Elements\r\n this._slideContainer = null;\r\n this._ui = {};\r\n\r\n // Dragging state\r\n this._index = 0;\r\n this._dragging = false;\r\n this._dragStart = 0;\r\n this._dragDelta = 0;\r\n this._containerPosition = 0;\r\n\r\n //this._loop = false;\r\n this._loop = true;\r\n\r\n this._onResize = this._onResize.bind(this);\r\n this._gotoNext = this._gotoNext.bind(this);\r\n this._gotoPrevious = this._gotoPrevious.bind(this);\r\n this._onPointerDown = this._onPointerDown.bind(this);\r\n this._onPointerMove = this._onPointerMove.bind(this);\r\n this._onPointerUp = this._onPointerUp.bind(this);\r\n\r\n // Go!\r\n this._initialize();\r\n\r\n }\r\n\r\n\t/**\r\n * Initialize the carousel\r\n * @private\r\n */\r\n _initialize() {\r\n\r\n // Set some values\r\n this._slides = [].slice.call(document.querySelectorAll(this._options.slides));\r\n this._slideContainer = this._slides[0].parentNode;\r\n this._width = this._element.offsetWidth;\r\n this._height = this._slideContainer.offsetHeight;\r\n\r\n // Get ready for action\r\n this._createUi();\r\n this._bindEvents();\r\n\r\n // Set images to intial translation\r\n this._onResize();\r\n\r\n }\r\n\r\n\t/**\r\n * Create the UI elements for the carousel. When we don't have JS these elements are not necessary.\r\n * @private\r\n */\r\n _createUi() {\r\n\r\n if (this._slides.length < 2 || this._uiCreated) {\r\n return;\r\n }\r\n this._uiCreated = true;\r\n\r\n this._ui = {\r\n previous: document.createElement('button'),\r\n next: document.createElement('button'),\r\n countLabel: document.createElement('span')\r\n };\r\n\r\n let template = label => `${ label }`,\r\n documentFragement = document.createDocumentFragment();\r\n\r\n this._ui.previous.innerHTML = template(PREVIOUS_LABEL);\r\n this._ui.previous.classList.add(PREVIOUS_CLASS_NAME);\r\n this._ui.next.innerHTML = template(NEXT_LABEL);\r\n this._ui.next.classList.add(NEXT_CLASS_NAME);\r\n this._ui.countLabel.classList.add(COUNT_CLASS_NAME);\r\n\r\n documentFragement.appendChild(this._ui.previous);\r\n documentFragement.appendChild(this._ui.next);\r\n documentFragement.appendChild(this._ui.countLabel);\r\n\r\n this._element.appendChild(documentFragement);\r\n\r\n }\r\n\r\n /**\r\n * Bind the events\r\n * @private\r\n */\r\n _bindEvents() {\r\n\r\n //window.addEventListener('resize', debounce(this._onResize, 100)); // todo: add debounce?\r\n window.addEventListener('resize', e => this._onResize(e));\r\n\r\n // Touchstart event listeners only fire when not dragging\r\n if (this._uiCreated) {\r\n this._ui.next.addEventListener('touchstart', this._gotoNext);\r\n this._ui.next.addEventListener('click',this._gotoNext);\r\n this._ui.previous.addEventListener('touchstart', this._gotoPrevious);\r\n this._ui.previous.addEventListener('click', this._gotoPrevious);\r\n }\r\n\r\n // Drag events, only fire touchmove and mousemove handlers when dragging\r\n this._slideContainer.addEventListener('touchstart', this._onPointerDown);\r\n this._slideContainer.addEventListener('mousedown', this._onPointerDown);\r\n this._slideContainer.addEventListener('touchmove', this._onPointerMove);\r\n this._slideContainer.addEventListener('mousemove', this._onPointerMove);\r\n\r\n // Drag end events don't necessarily have to be triggered on top of the element\r\n document.body.addEventListener('touchend', this._onPointerUp);\r\n document.body.addEventListener('touchcancel', this._onPointerUp);\r\n document.body.addEventListener('mouseup', this._onPointerUp);\r\n\r\n // Check for image load events, which can resize their slides\r\n let images = [].slice.call(this._slideContainer.querySelectorAll('img'));\r\n images.forEach(image => image.addEventListener('load', this._onResize));\r\n\r\n }\r\n\r\n\t/**\r\n * Update the carousel with it's new dimensions on resize\r\n * @private\r\n */\r\n _onResize() {\r\n\r\n // Store new carousel sizes\r\n this._width = this._element.offsetWidth;\r\n this._height = this._slideContainer.offsetHeight;\r\n\r\n this._slides.forEach(slide => slide.style.width = slide.children[0].offsetWidth + 'px');\r\n this._slideWidths = this._slides.map(el => el.offsetWidth);\r\n\r\n // Update looping of slides\r\n //this._loop = this._slides.length >= 3 && sum(this._slideWidths) > this._width + min(this._slideWidths);\r\n\r\n this._goto(this._index);\r\n\r\n }\r\n\r\n\t/**\r\n * Touch down! Start dragging.\r\n * @param e\r\n * @private\r\n */\r\n _onPointerDown(e) {\r\n\r\n // Prevent mouse event when touching\r\n e.preventDefault();\r\n\r\n // Yes, we are dragging starting from now\r\n this._dragging = true;\r\n\r\n // Set a small transition, to hide the fact that dragging doesn't happen at 60FPS on most mobile devices\r\n setVendor(this._slideContainer, 'transition', 'transform .05s');\r\n reflow(this._slideContainer);\r\n\r\n // Store the initial position of the container and the starting value for our drag\r\n this._containerPosition = this._getContainerOffset(this._index);\r\n this._dragStart = e.pageX || e.touches[0].pageX;\r\n\r\n }\r\n\r\n\t/**\r\n * Called when the user actually drags\r\n * @param e\r\n * @private\r\n */\r\n _onPointerMove(e) {\r\n\r\n if (!this._dragging) return;\r\n\r\n // Get the drag limit and the movement delta\r\n let limit = this._width / 3 * 2,\r\n delta = e.pageX || e.touches[0].pageX;\r\n\r\n // Apply the limit to the delta\r\n this._dragDelta = Math.max(-limit, Math.min(limit, (delta - this._dragStart) / 2));\r\n\r\n // Update the container position with it's new value\r\n translate(this._slideContainer, this._containerPosition + this._dragDelta + 'px');\r\n\r\n }\r\n\r\n\t/**\r\n * Release. The user stopped dragging.\r\n * @param e\r\n * @private\r\n */\r\n _onPointerUp(e) {\r\n\r\n // No longer dragging\r\n if (!this._dragging) { return; }\r\n\r\n // Prevent mouse event when touching\r\n e.preventDefault();\r\n\r\n this._dragging = false;\r\n\r\n // Clear the 'fake 60FPS transition'\r\n setVendor(this._slideContainer, 'transition', '');\r\n reflow(this._slideContainer);\r\n\r\n // Did we pass our pan threshold? Else, go back to the current slide\r\n if (Math.abs(this._dragDelta) > PAN_THRESHOLD) {\r\n this._dragDelta > 0 ? this._gotoPrevious() : this._gotoNext();\r\n } else {\r\n this._goto(this._index);\r\n }\r\n\r\n }\r\n\r\n\t/**\r\n * Go to the next slide\r\n * @param e\r\n * @private\r\n */\r\n _gotoNext(e) {\r\n\r\n if (this._dragging) return;\r\n\r\n // Possibly fired from an event. If so, prevent default, so prevent mouse event.\r\n e && e.preventDefault();\r\n\r\n this._goto(this._index + 1);\r\n\r\n }\r\n\r\n\t/**\r\n * Go to the previous slide\r\n * @param e\r\n * @private\r\n */\r\n _gotoPrevious(e) {\r\n\r\n if (this._dragging) return;\r\n\r\n // Possibly fired from an event. If so, prevent default, so prevent mouse event.\r\n e && e.preventDefault();\r\n\r\n this._goto(this._index - 1);\r\n\r\n }\r\n\r\n\t/**\r\n * Move the container position to focus on the index given. This function sets this._index to the new index (after looping it)\r\n * @param index\r\n * @private\r\n */\r\n _goto(index) {\r\n\r\n // Update index\r\n this._index = this._loop ? this._loopIndex(index) : this._restrictIndex(index);\r\n\r\n if (this._loop) {\r\n this._loopContainer(index); // index, not this._index, to retain -1 and length values\r\n this._loopSlides();\r\n }\r\n\r\n // Move the container to the current position\r\n translate(this._slideContainer, this._getContainerOffset(this._index) + 'px');\r\n\r\n // Reset the drag delta, because otherwise it would also be applied when using the arrow buttons\r\n this._dragDelta = 0;\r\n\r\n // Update other elements\r\n if (this._uiCreated) {\r\n this._setCount(this._index);\r\n }\r\n\r\n this._highlight();\r\n\r\n }\r\n\r\n /**\r\n * Add CSS class to the img with the current index to highlight it from the rest\r\n * @private\r\n */\r\n _highlight() {\r\n if (this._current) {\r\n this._current.classList.remove(HIGHLIGHT_CLASS_NAME);\r\n }\r\n this._current = this._slides[this._index];\r\n this._current.classList.add(HIGHLIGHT_CLASS_NAME);\r\n }\r\n\r\n /**\r\n * This function takes an index and loops the value to the begin/end when it doesn't exist\r\n * * E.g. when there are 5 slides, index 5 returns 0\r\n * @param index\r\n * @returns {number}\r\n * @private\r\n */\r\n _loopIndex(index) {\r\n return (index + this._slides.length) % this._slides.length;\r\n }\r\n\r\n /**\r\n * This function takes an index and restricts it the maximum and minimum of existing values\r\n * E.g. when there are 5 slides, index 5 returns 4\r\n * @param index\r\n * @returns {number}\r\n * @private\r\n */\r\n _restrictIndex(index) {\r\n return Math.min(Math.max(index, 0), this._slides.length - 1)\r\n }\r\n\r\n\t/**\r\n * This function returns the offset needed for the container to center the active slide\r\n * @param index\r\n * @returns {number}\r\n * @private\r\n */\r\n _getContainerOffset(index) {\r\n\r\n // Return the offset needed to nicely center the active slide\r\n index = this._loopIndex(index);\r\n return this._width / 2 - this._slideWidths[index] / 2 - sum(this._slideWidths.slice(0, index));\r\n\r\n }\r\n\r\n /**\r\n * This function displaces the container when it loops\r\n * @param index\r\n * @private\r\n */\r\n _loopContainer(index) {\r\n\r\n if (index === -1 || index === this._slides.length) {\r\n\r\n // Disable transition while 'jumping'\r\n setVendor(this._slideContainer, 'transitionDuration', '0s');\r\n\r\n // Jump to the other end of the carousel when at index -1 or index length +1, so we can loop without the user noticing\r\n if (index === -1) {\r\n translate(this._slideContainer, this._getContainerOffset(this._slides.length - 1) - this._slideWidths[this._slides.length - 1] + this._dragDelta + 'px');\r\n } else {\r\n translate(this._slideContainer, this._getContainerOffset(0) + this._slideWidths[0] + this._dragDelta + 'px');\r\n }\r\n\r\n reflow(this._slideContainer);\r\n\r\n // Re-enable transition after 'jumping'\r\n setVendor(this._slideContainer, 'transitionDuration', '');\r\n reflow(this._slideContainer);\r\n\r\n }\r\n\r\n }\r\n\r\n\t/**\r\n * This function displaces slides, to make it apear like we have an endless loop of slidess\r\n * @private\r\n */\r\n _loopSlides() {\r\n\r\n this._slides.forEach((slide, i) => {\r\n\r\n let displacement = false;\r\n let dir = -1 * Math.abs(i - this._index) / (i - this._index);\r\n let diff = Math.abs(i - this._index);\r\n\r\n if (diff > Math.max(1, this._slides.length - 2)) {\r\n // Displace to the other side of the slide slider\r\n displacement = dir * sum(this._slideWidths);\r\n }\r\n\r\n if (displacement) {\r\n translate(slide, displacement + 'px');\r\n } else {\r\n setVendor(slide, 'transform', '');\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n /**\r\n * This function sets the slide count element\r\n * @param index\r\n * @private\r\n */\r\n _setCount(index) {\r\n this._ui.countLabel.textContent = (index + 1) + '/' + this._slides.length;\r\n }\r\n\r\n}\r\n\r\nexport default Carousel;\r\n","import { reflow, setPrefixedStyle } from 'utils/DOMHelpers';\r\nimport Observer from 'utils/Observer';\r\nimport Toggle from 'toggle/Toggle';\r\n\r\nconst TRANSITION_PROP = 'height';\r\nconst TRANSITION_END_EVENT = 'transitionend';\r\nconst COLLAPSIBLE_MOTION_CLASS = 'collapsible-transition';\r\n\r\n/**\r\n * Class Collapsible.\r\n * @class\r\n */\r\nclass Collapsible {\r\n\r\n /**\r\n * Make a new Collapsible.\r\n * @constructs\r\n * @param element\r\n * @param options\r\n */\r\n\tconstructor(element, options) {\r\n\t\t\r\n\t\tthis._element = element;\r\n\t\tthis._options = options || {};\r\n\r\n\t\t// check for inner element\r\n\t\tthis._collapsingElement = this._createCollapsingElement();\r\n\t\t\r\n\t\tthis._toggle = new Toggle(element, this._options);\r\n\t\tthis._element.style.animation = '0';\r\n\t\t\r\n\t\tthis._initialize();\r\n\t\t\r\n\t}\r\n\r\n /**\r\n * Initialize\r\n * @private\r\n */\r\n\t_initialize() {\r\n\t\t\r\n\t\tthis._expand = this._expand.bind(this);\r\n\t\tthis._collapse = this._collapse.bind(this);\r\n\t\tthis._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n\t\t\r\n\t\t// bind listeners\r\n\t\tObserver.subscribe(this._toggle, this._toggle.activeEvent, this._expand);\r\n\t\tObserver.subscribe(this._toggle, this._toggle.inActiveEvent, this._collapse);\r\n\t\tthis._collapsingElement.addEventListener(TRANSITION_END_EVENT, this._onTransitionEnd);\r\n\r\n\t\tthis._setHeight(0);\r\n\r\n\t\tif (this._toggle.active) {\r\n\t\t\tthis._setHeight('auto');\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\t/**\r\n\t * Setup the containing element, which sets the Collapsible height\r\n\t * @returns {Element} - Returns the newly created wrapper element\r\n\t * @private\r\n\t */\r\n\t_createCollapsingElement() {\r\n\t\t\r\n\t\tconst collapsingElement = document.createElement('div');\r\n\t\t\r\n\t\tcollapsingElement.classList.add(COLLAPSIBLE_MOTION_CLASS);\r\n\r\n\t\tthis._element.parentNode.insertBefore(collapsingElement, this._element);\r\n\t\tcollapsingElement.appendChild(this._element);\r\n\t\t\r\n\t\treturn collapsingElement;\r\n\t\t\r\n\t}\r\n\t\r\n\t/**\r\n\t * Check if Toggle is active and either expand or collapse.\r\n\t * @returns {number} - Returns the height the collapsible would have\r\n\t * @private\r\n\t */\r\n\t_getHeight() {\r\n\t\treturn this._element.offsetHeight;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Set height, while skipping transitions\r\n\t * @param {String} value - the height style value to set the Collapsible to\r\n\t * @private\r\n\t */\r\n\t_setHeight(value) {\r\n\r\n\t\t// Disable transitions\r\n\t\tsetPrefixedStyle(this._collapsingElement, 'transition', 'none');\r\n\r\n\t\t// Set height\r\n\t\tthis._collapsingElement.style.height = value;\r\n\t\treflow(this._collapsingElement);\r\n\r\n\t\t// Enable transitions\r\n\t\tsetPrefixedStyle(this._collapsingElement, 'transition', '');\r\n\t\t\r\n\t}\r\n\t\r\n\t/**\r\n\t * Set the height to the amount of pixels, or directly set it to auto when transitionend event is unsupported\r\n\t * @private\r\n\t */\r\n\t_expand() {\r\n\t\tthis._collapsingElement.style.height = this._getHeight() + 'px';\r\n\t}\r\n\t\r\n\t/**\r\n\t * Get the height and transition this height to 0\r\n\t * @private\r\n\t */\r\n\t_collapse() {\r\n\t\tthis._setHeight(this._getHeight() + 'px');\r\n\t\tthis._collapsingElement.style.height = 0;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Set height to auto when the transition has ended, to make sure the Collapsible stays as responsvie as possible\r\n\t * @param {Event} e - Event object\r\n\t * @private\r\n\t */\r\n\t_onTransitionEnd(e) {\r\n\r\n\t\tif (e.propertyName === TRANSITION_PROP && this._toggle.active) {\r\n\t\t\tthis._setHeight('auto');\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tget toggle() {\r\n\t\treturn this._toggle;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Unload and reset everything if conditions no longer apply.\r\n\t */\r\n\tunload() {\r\n\r\n\t\tthis._element.removeAttribute('style');\r\n\r\n\t\tObserver.unsubscribe(this._toggle, this._toggle.activeEvent, this._expand);\r\n\t\tObserver.unsubscribe(this._toggle, this._toggle.inActiveEvent, this._collapse);\r\n\r\n\t\tthis._toggle.unload();\r\n\t\tthis._collapsingElement.parentNode.insertBefore(this._element, this._collapsingElement);\r\n\t\tthis._collapsingElement.parentNode.removeChild(this._collapsingElement);\r\n\r\n\t\tthis._element.removeEventListener(TRANSITION_END_EVENT, this._onTransitionEnd);\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default Collapsible;","/**\r\n * CookieBar\r\n * Ask a user for cookie consent\r\n *\r\n * @module ui/CookieBar\r\n */\r\n\r\n'use strict';\r\n\r\nimport Observer from 'utils/Observer';\r\nimport Toggle from 'toggle/Toggle';\r\nimport Trigger from 'toggle/Trigger';\r\nimport Cookies from 'utils/Cookies';\r\n\r\nclass CookieBar {\r\n\r\n\t/**\r\n\t * @class CookieBar\r\n\t * @constructor\r\n\t */\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = options;\r\n\r\n\t\tthis._toggle = null;\r\n\t\tthis._trigger = null;\r\n\t\tthis._onConsentBind = this._onConsent.bind(this);\r\n\r\n\t\tthis._initialize();\r\n\r\n\t}\r\n\r\n /**\r\n * Initialization method\r\n * @method _initialize\r\n * @private\r\n */\r\n _initialize() {\r\n\r\n var consent = Cookies.hasItem('cookies-allowed'),\r\n triggerElement;\r\n\r\n if (consent) {\r\n this._element.parentNode.removeChild(this._element);\r\n return;\r\n }\r\n\r\n // Setup toggle & trigger, so we can animate the consent bar away\r\n triggerElement = this._element.querySelector('button');\r\n if (!triggerElement) { return; }\r\n this._toggle = new Toggle(this._element, {});\r\n this._trigger = new Trigger(triggerElement, { targets: this._element.id, preventDefault:true });\r\n\r\n this._bindEvents();\r\n\r\n }\r\n\r\n /**\r\n * Bind events\r\n * @method _bindEvents\r\n * @private\r\n */\r\n _bindEvents() {\r\n Observer.subscribe(this._toggle, 'active', this._onConsentBind);\r\n }\r\n\r\n /**\r\n * Set cookie on user consent and reload the page after the animation\r\n * @method _initialize\r\n * @private\r\n */\r\n _onConsent() {\r\n // The user consented\r\n Cookies.setItem('cookies-allowed', 'yes', Infinity, '/');\r\n setTimeout(function() {\r\n window.location.reload();\r\n }, 350);\r\n }\r\n\r\n /**\r\n * Unload and reset everything if conditions no longer apply.\r\n * @method unload\r\n * @public\r\n */\r\n unload() {\r\n\r\n this._toggle.unload();\r\n this._trigger.unload();\r\n\r\n Observer.unsubscribe(this._toggle, 'active', this._onConsentBind);\r\n\r\n }\r\n\r\n}\r\n\r\nexport default CookieBar;\r\n","import DataStore from 'data/DataStore';\r\nimport observer from 'utils/Observer';\r\n\r\nclass DataBinding {\r\n\r\n // Element may be null as well\r\n // In that case only an observer publication is published\r\n constructor(element, options = {}) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(DataBinding.options, options);\r\n\r\n this._store = DataStore.getSingleton();\r\n\r\n this._onChange = this._onChange.bind(this);\r\n\r\n // Match\r\n this._dependencies = this._options.string.match(/\\[\\[\\s?(.*?)\\s?\\]\\]/g) || [];\r\n this._dependencies = this._dependencies.map(dep => dep.replace(/(\\[\\[|\\]\\])/g, '').trim());\r\n\r\n this._store.watch(this._dependencies, this._onChange, this._options.optional);\r\n\r\n }\r\n\r\n static get options() {\r\n return {\r\n string: ''\r\n };\r\n }\r\n\r\n _onChange() {\r\n\r\n const output = this._dependencies.reduce((output, path) => {\r\n\r\n const regex = new RegExp(`\\\\[\\\\[\\\\s?${ path }\\\\s?\\\\]\\\\]`, 'g');\r\n const value = this._store.get(path);\r\n\r\n if (typeof value === 'undefined') {\r\n console.warn('value [[' + path + ']] is undefined');\r\n return '';\r\n }\r\n\r\n return output.replace(regex, value);\r\n\r\n }, this._options.string);\r\n\r\n this._updateOutput(output);\r\n\r\n }\r\n\r\n _updateOutput(output) {\r\n\r\n observer.publish(this, 'change', output);\r\n\r\n if (!this._element) return;\r\n\r\n if (this._element.tagName.toLowerCase === 'input') {\r\n this._element.value = output;\r\n } else {\r\n this._element.innerHTML = output;\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default DataBinding;\r\n","import Map from 'map/Map';\r\n\r\nclass DetailMap {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(DetailMap.options, options);\r\n\r\n\t\tthis._map = new Map(this._element, {\r\n\t\t\toffsetX: this._options.offsetX,\r\n\t\t\toffsetY: this._options.offsetY,\r\n\t\t\tcontrolPosition: 'RIGHT_TOP',\r\n\t\t\tzoom: 11,\r\n\t\t\tmarkerData: [{\r\n\t\t\t\tmarker: 'detailMarker',\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tlat: this._options.latitude,\r\n\t\t\t\t\tlng: this._options.longitude\r\n\t\t\t\t},\r\n\t\t\t\tsrc: this._options.imageSrc\r\n\t\t\t}]\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\timageSrc: null,\r\n latitude: null,\r\n longitude: null,\r\n\t\t\toffsetX: 0,\r\n\t\t\toffsetY: 0\r\n\t\t};\r\n\t}\r\n\r\n}\r\n\r\nexport default DetailMap;\r\n","/**\r\n * When using hashes, there is no way to define whether the hash you are going to is a 'next' or 'previous' hash.\r\n * This module can be used to provide hashes with a sense of direction, by providing a context.\r\n * It also exposes next() and previous() public functions to trigger navigation and has a status property giving some\r\n * insight into the state.\r\n */\r\n\r\nclass HashNavigation {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(HashNavigation.options, (element.dataset || {}), options);\r\n\r\n\t\tthis._hashes = this._options.hashes.split(',').map(hash => hash.trim());\r\n\t\tthis._ignore = this._options.ignore.split(',').map(hash => hash.trim());\r\n\t\tthis._elements = this._hashes.map(hash => document.getElementById(hash));\r\n\r\n\t\tsetTimeout(() => this._setInitialHash(), 1);\r\n\r\n\t\tthis._index = this._hashes.indexOf(this.hash);\r\n\r\n\t\tthis._update = this._update.bind(this);\r\n\r\n\t\twindow.addEventListener('hashchange', this._update);\r\n\r\n\t\tthis._update();\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\thashes: '', // Comma seperated list of hashes\r\n\t\t\tinitialHash: null,\r\n\t\t\tignore: ''\r\n\t\t};\r\n\t}\r\n\r\n\tget hash() {\r\n\t\treturn window.location.hash.replace('#', '');\r\n\t}\r\n\r\n\tget activeElement() {\r\n\t\tconst hash = this.hash;\r\n\t\treturn this._elements.filter(element => element.id === hash)[0];\r\n\t}\r\n\r\n\tget status() {\r\n\t\treturn {\r\n\t\t\tprogress: this._index / (this._elements.length - 1),\r\n\t\t\tstep: this._index + 1,\r\n\t\t\ttotal: this._elements.length\r\n\t\t};\r\n\t}\r\n\t\r\n\t_update() {\r\n\r\n\t\tconst index = this._hashes.indexOf(this.hash);\r\n\t\tconst dir = index - this._index >= 0 ? 'forwards' : 'backwards';\r\n\t\t\r\n\t\tthis._index = index;\r\n\t\t\r\n\t\tthis._elements.forEach((element, i) => {\r\n\r\n\t\t\tif (!element) return;\r\n\r\n\t\t\telement.setAttribute('data-hash-direction', dir);\r\n\r\n\t\t\tif (i < this._index) {\r\n\t\t\t\telement.setAttribute('data-hash-position', 'before-hash');\r\n\t\t\t} else if (i > this._index) {\r\n\t\t\t\telement.setAttribute('data-hash-position', 'after-hash');\r\n\t\t\t} else {\r\n\t\t\t\telement.setAttribute('data-position', 'hash');\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t_setInitialHash() {\r\n\t\tif (this._ignore.indexOf(this.hash) !== -1) return;\r\n\t\twindow.location.hash = this._options.initialHash || this._hashes[0];\r\n\t}\r\n\r\n}\r\n\r\nexport default HashNavigation;","import Toggle from 'toggle/Toggle';\r\nimport Trigger from 'toggle/Trigger';\r\nimport Controller from 'toggle/Controller';\r\nimport Observer from 'utils/Observer';\r\nimport { setVendor } from 'utils/DOMHelpers';\r\nimport eventHelpers from 'utils/eventHelpers';\r\n\r\nfunction reflow(elem) { return elem.offsetHeight; }\r\n\r\nclass InlineHelp {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n //this._options = options;\r\n this._options = Object.assign(InlineHelp.options, options);\r\n\r\n if (!this._options.triggerWord) {\r\n throw new Error('ui/InlineHelp: options.triggerWord is not defined');\r\n }\r\n\r\n if (!this._element.id) {\r\n throw new Error('ui/InlineHelp: element doesn\\'t have an id attribute');\r\n }\r\n\r\n if (!this._options.group) {\r\n // default group is prefixed with __inline-helps to prevent conflicts\r\n this._options.group = '__inline-helps';\r\n }\r\n\r\n this._initializeTrigger(element.parentNode, this._options.triggerWord)\r\n\r\n .then(triggerId => {\r\n this._triggerElement = document.getElementById(triggerId);\r\n this._trigger = new Trigger(this._triggerElement, Object.assign(options, { toggle: true }));\r\n // The expandToggle makes room for the inline help balloon\r\n this._expandToggle = Controller.getToggles(triggerId).pop();\r\n // The balloonToggle shows and hides the actual inline help balloon\r\n this._balloonToggle = new Toggle(element, {});\r\n\r\n this._resize();\r\n this._bindEvents();\r\n });\r\n\r\n }\r\n\r\n static get options() {\r\n return {\r\n margin: 32,\r\n triggerClassName: 'inline-help-trigger'\r\n }\r\n }\r\n\r\n _initializeTrigger(context, triggerWord) {\r\n\r\n let wordRegx = new RegExp(`\\\\b(${ triggerWord })\\\\b`, 'i'),\r\n triggerId = this._element.id + '-trigger',\r\n triggerHTML,\r\n triggerContainer;\r\n\r\n for (let i = 0, l = context.children.length; i < l; i++) {\r\n if (!triggerContainer && wordRegx.test(context.children[i].innerHTML)) {\r\n triggerContainer = context.children[i];\r\n }\r\n }\r\n\r\n if (!triggerContainer) {\r\n // Reject if the trigger word isn't found, initialization won't be continued\r\n return Promise.reject();\r\n }\r\n\r\n // Make sure we keep the trigger word's formatting as it appears in the text\r\n triggerWord = triggerContainer.innerHTML.match(wordRegx).pop();\r\n triggerHTML = `${ triggerWord }`;\r\n\r\n // We replace on the triggerContainer, not on context, to leave bindings from other modules intact\r\n triggerContainer.innerHTML = triggerContainer.innerHTML.replace(wordRegx, triggerHTML);\r\n\r\n return Promise.resolve(triggerId);\r\n\r\n }\r\n\r\n _bindEvents() {\r\n\r\n this._onResize = eventHelpers.raf(this._onResize.bind(this));\r\n this._position = this._position.bind(this);\r\n this._onActive = this._onActive.bind(this);\r\n this._onInactive = this._onInactive.bind(this);\r\n\r\n window.addEventListener('resize', this._onResize);\r\n Observer.subscribe(this._expandToggle, 'active', this._onActive);\r\n Observer.subscribe(this._expandToggle, 'inactive', this._onInactive);\r\n\r\n }\r\n\r\n _onActive() {\r\n\r\n this._triggerElement.style.marginBottom = this._height + 'px';\r\n\r\n eventHelpers.listenOnce(this._triggerElement, eventHelpers.getTransitionEvent(), () => {\r\n this._position();\r\n this._balloonToggle.activate();\r\n })\r\n }\r\n\r\n _onInactive() {\r\n this._triggerElement.style.marginBottom = '';\r\n this._balloonToggle.deactivate();\r\n }\r\n\r\n _resize() {\r\n this._height = this._element.children[0].offsetHeight + this._options.margin * 2;\r\n this._element.style.width = this._element.parentNode.offsetWidth;\r\n\r\n if (this._expandToggle.active) {\r\n this._triggerElement.style.marginBottom = this._height + 'px';\r\n }\r\n }\r\n\r\n _position() {\r\n\r\n let rRct, rct, diff;\r\n\r\n //DOMHelper.setVendor(this._element, 'transform', '');\r\n setVendor(this._element, 'transform', '');\r\n reflow(this._element);\r\n\r\n rRct = this._triggerElement.getBoundingClientRect();\r\n rct = this._element.getBoundingClientRect();\r\n diff = rRct.top - rct.top + this._options.margin;\r\n\r\n //DOMHelper.setVendor(this._element, 'transform', `translateY(${ diff }px)`);\r\n setVendor(this._element, 'transform', `translateY(${ diff }px)`);\r\n\r\n this._element.children[0].style.left = rRct.left - rct.left + this._triggerElement.offsetWidth / 2 + 'px';\r\n\r\n }\r\n\r\n _onResize() {\r\n this._resize();\r\n this._position();\r\n }\r\n\r\n unload() {\r\n\r\n this._balloonToggle.unload();\r\n this._trigger.unload();\r\n\r\n window.removeEventListener('resize', this._onResize);\r\n Observer.unsubscribe(this._balloonToggle, 'active', this._onActive);\r\n Observer.unsubscribe(this._balloonToggle, 'inactive', this._onInactive);\r\n\r\n //DOMHelper.setVendor(this._element, 'transform', '');\r\n setVendor(this._element, 'transform', '');\r\n this._element.children[0].style.left = '';\r\n this._triggerElement.outerHTML = this._triggerElement.innerHTML;\r\n\r\n }\r\n\r\n}\r\n\r\nexport default InlineHelp;\r\n","// Todo: add options for AJAX and a static container version\r\nimport Observer from 'utils/Observer';\r\nimport Toggle from 'toggle/Toggle';\r\nimport Trigger from 'toggle/Trigger';\r\n\r\nclass Lightbox {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(Lightbox.options, options);\r\n\r\n this._lightbox = null;\r\n this._iframe = null;\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n static get options() {\r\n \t\treturn {\r\n iDPrefix: 'lightbox-',\r\n className: 'lightbox',\r\n closeLabel: '',\r\n overflowClassName: 'fixed'\r\n \t\t};\r\n \t}\r\n\r\n _initialize() {\r\n\r\n const id = this._options.iDPrefix + this._element.id;\r\n\r\n this._lightbox = document.createElement('div');\r\n this._lightbox.id = id;\r\n this._lightbox.className = this._options.className;\r\n\r\n const buttonClose = document.createElement('button');\r\n buttonClose.className = 'btn-close';\r\n buttonClose.innerHTML = this._options.closeLabel;\r\n this._lightbox.appendChild(buttonClose);\r\n\r\n document.body.appendChild(this._lightbox);\r\n\r\n new Trigger(this._element, { targets: id });\r\n new Trigger(buttonClose, { targets: id });\r\n const toggle = new Toggle(this._lightbox);\r\n\r\n Observer.subscribe(toggle, toggle.activeEvent, () => this._setup());\r\n Observer.subscribe(toggle, toggle.inActiveEvent, () => this._deactivate());\r\n\r\n }\r\n\r\n _setup() {\r\n\r\n switch(this._options.lightboxType) {\r\n case 'iframe':\r\n default:\r\n this._setupIframe();\r\n }\r\n\r\n }\r\n\r\n _setupIframe() {\r\n\r\n //if (this._iframe) { return; }\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.src = this._element.href;\r\n this._lightbox.appendChild(iframe);\r\n\r\n document.documentElement.classList.add(this._options.overflowClassName);\r\n\r\n }\r\n\r\n _deactivate() {\r\n document.documentElement.classList.remove(this._options.overflowClassName);\r\n }\r\n\r\n}\r\n\r\nexport default Lightbox;","import DataStore from 'data/DataStore';\r\n\r\nclass ProgressIndicator {\r\n\r\n\tconstructor(element, options = {}) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(ProgressIndicator.options, (element.dataset || {}), options);\r\n\r\n\t\tthis._store = DataStore.getSingleton();\r\n\r\n\t\tthis._input = JSON.parse(this._options.input || \"{}\");\r\n\r\n\t\tthis._updateProgression = this._updateProgression.bind(this);\r\n\t\tthis._store.subscribe(this._input.progress, this._updateProgression);\r\n\r\n\t\tthis._updateProgression(0);\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {};\r\n\t}\r\n\r\n\t_updateProgression(p) {\r\n\t\tthis._element.style.right = 100 - p * 100 + '%';\r\n\t}\r\n\r\n}\r\n\r\nexport default ProgressIndicator;\r\n","import Trigger from 'toggle/Trigger';\r\nimport MediaQuery from 'monitors/MediaQuery';\r\n\r\nclass ResponsiveTrigger {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(ResponsiveTrigger.options, options);\r\n\r\n this._triggerFn = this._triggerFn.bind(this);\r\n this._cleanup = this._cleanup.bind(this);\r\n\r\n this._trigger = new Trigger(element, Object.assign(options, { event: 'proxied' + this._options.event }));\r\n this._mediaQuery = new MediaQuery(this._options.mediaQuery, null, this._cleanup);\r\n\r\n if (!options.mediaQuery) {\r\n console.warn('Consider using a regular toggle/Trigger component, since no media query is provided:', element)\r\n }\r\n\r\n this._element.addEventListener(this._options.event, this._triggerFn);\r\n\r\n }\r\n\r\n static get options() {\r\n return {\r\n mediaQuery: 'all',\r\n event: 'click'\r\n }\r\n }\r\n\r\n _triggerFn(e) {\r\n\r\n if (!this._mediaQuery.matches) return;\r\n\r\n e.preventDefault();\r\n\r\n this._element.dispatchEvent(new CustomEvent('proxied' + this._options.event, {\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n\r\n }\r\n\r\n _cleanup() {\r\n const targets = this._trigger.getTargets();\r\n targets && targets.forEach(target => target.deactivate());\r\n }\r\n\r\n}\r\n\r\nexport default ResponsiveTrigger;","import eventHelpers from 'utils/eventHelpers';\r\nimport scrollTo from 'utils/scrollTo';\r\n\r\nclass ScrollSpy {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(ScrollSpy.options, options);\r\n\t\t\r\n\t\tthis._triggers = Array.from(document.querySelectorAll(this._options.triggers));\r\n\t\tthis._closest = null;\r\n\r\n\t\tthis._onClick = this._onClick.bind(this);\r\n\t\tthis._updateData = this._updateData.bind(this);\r\n\t\tthis._onScrollRaf = eventHelpers.raf(this._onScroll.bind(this));\r\n this._onScrollStart = eventHelpers.debounceStart(this._updateData, 1000);\r\n\r\n\t\tthis._element.addEventListener('click', this._onClick);\r\n\t\twindow.addEventListener('resize', this._updateData);\r\n\t\twindow.addEventListener('scroll', this._onScrollRaf, { passive: true });\r\n\t\twindow.addEventListener('scroll', this._onScrollStart, { passive: true });\r\n\r\n\r\n\t\t// Trigger initially\r\n this._updateData();\r\n\t\tthis._onScroll();\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tthreshold: 200\r\n\t\t};\r\n\t}\r\n\r\n\t_onClick(e) {\r\n\r\n\t\te.preventDefault();\r\n\r\n\t\tconst clickedId = this._getIdFromHref(e.target);\r\n\t\tconst target = this._data\r\n\t\t\t.map(data => data.target)\r\n\t\t\t.find(target => target.id === clickedId);\r\n\r\n\t\tif (target) scrollTo(target);\r\n\r\n\t}\r\n\r\n\t_onScroll() {\r\n\r\n\t\tconst closest = this._getClosest();\r\n\r\n // Bailout if nothing changed\r\n\t\tif (closest === this._closest) return;\r\n\r\n\t\t// Set the previous closest trigger to data-closest=\"false\"\r\n if (this._closest) {\r\n \tthis._closest.trigger.setAttribute('data-closest', 'false');\r\n }\r\n\r\n // Set the new closest trigger to data-closest=\"true\"\r\n\t\tif (closest) {\r\n closest.trigger.setAttribute('data-closest', 'true');\r\n }\r\n\r\n this._closest = closest;\r\n\r\n\t}\r\n\r\n\t_updateData() {\r\n\r\n\t\tconst scrollY = window.pageYOffset || window.scrollY;\r\n\r\n\t\tthis._data = this._triggers.map(trigger => {\r\n\r\n const id = trigger.href && trigger.href.split('#')[1];\r\n const target = id && document.getElementById(id);\r\n\r\n if (target) {\r\n \treturn {\r\n trigger,\r\n target,\r\n scrollTop: target.getBoundingClientRect().top + scrollY\r\n };\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}).filter(data => data);\r\n\r\n\t}\r\n\r\n\t_getClosest() {\r\n\r\n\t\tconst scrollY = window.pageYOffset || window.scrollY;\r\n\t\tconst initialValue = { scrollTop: Infinity };\r\n\r\n if ((window.innerHeight + scrollY) >= document.body.scrollHeight) {\r\n return this._data[this._data.length - 1];\r\n }\r\n\r\n\t\tconst closest = this._data.reduce((closest, current) => {\r\n\r\n\t\t\tif (current.scrollTop - this._options.threshold > scrollY) {\r\n\t\t\t\treturn closest;\r\n\t\t\t}\r\n\r\n\t\t\tconst diffClosest = Math.abs(closest.scrollTop - scrollY);\r\n\t\t\tconst diffCurrent = Math.abs(current.scrollTop - scrollY);\r\n\r\n\t\t\treturn diffCurrent < diffClosest ? current : closest;\r\n\r\n\t\t}, initialValue);\r\n\r\n if (closest !== initialValue) return closest;\r\n\r\n\t}\r\n\r\n\t_getIdFromHref(triggerElement) {\r\n\t\treturn triggerElement.getAttribute('href').replace('#', '');\r\n\t}\r\n\r\n}\r\n\r\nexport default ScrollSpy;\r\n","import eventHelpers from 'utils/eventHelpers';\r\nimport MediaQuery from 'monitors/MediaQuery';\r\n\r\nconst reflow = element => element.offsetTop;\r\nconst isNumber = n => !isNaN(n);\r\nconst scrollY = () => window.pageYOffset || window.scrollY;\r\n\r\nconst NOT_STICKY = 0;\r\nconst STICKY_TOP_FROM = 1;\r\nconst STICKY_TOP_UNTILL = 2;\r\nconst STICKY_BOTTOM_FROM = 3;\r\nconst STICKY_BOTTOM_UNTILL = 4;\r\n\r\nconst noStyles = {\r\n position: '',\r\n top: '',\r\n bottom: '',\r\n transform: ''\r\n};\r\n\r\nclass Sticky {\r\n\r\n\tconstructor(element, options) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(Sticky.options, options);\r\n\r\n\t\tthis._element.style.zIndex = this._options.zIndex;\r\n\r\n\t\tthis._sticky = NOT_STICKY;\r\n\t\tthis._scrollTriggers = {};\r\n\r\n\t\tthis._stickyTopUntill = document.querySelector(this._options.stickyTopUntill);\r\n\t\tthis._stickyBottomUntill = document.querySelector(this._options.stickyBottomUntill);\r\n\r\n\t\tthis._offsets = this._getOffsets();\r\n\r\n\t\tthis._createPlaceholder();\r\n\t\tthis._bindFunctions();\r\n\r\n\t\t// improvement: Maybe consider switching to a composable EventStream syntax to allow composing with other monitors\r\n\t\tthis._options.mediaQuery\r\n\t\t\t? new MediaQuery(this._options.mediaQuery, this._resume, this._halt)\r\n\t\t\t: this._resume();\r\n\r\n\t}\r\n\r\n\t// Usage\r\n\r\n\t// The Sticky component is NOT sticky by default\r\n\t// Specify whether is sticks to the top and or the bottom of the screen using data-sticky-top='true' and data-sticky-bottom='true'\r\n\t// Since we check for truthy values, data-sticky-top='false' will still evaluate to true\r\n\t// Use data-sticky-top-untill='.selector-query' and data-sticky-bottom-untill='.selector-query' to define boundaries for the sticky behaviour\r\n\t// Use data-offset-top='10' and data-offset-bottom='.selectory-query' to define an offset relative to the top or bottom of the window\r\n\t// A number value evaluates to a px value, a selector query will measure the height of the first matching element and use that value. This is useful when dealing with a fixed header for instance.\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tstickyTop: null, // 'Boolean' (thruthy value)\r\n\t\t\tstickyBottom: null, // 'Boolean' (thruthy value)\r\n\t\t\tstickyTopUntill: null, // 'Element'\r\n\t\t\tstickyBottomUntill: null, // 'Element'\r\n\t\t\toffsetTop: 0, // Comma seperated numbers and/or Elements\r\n\t\t\toffsetBottom: 0, // Comma seperated numbers and/or Elements\r\n\t\t\tzIndex: 10,\r\n\t\t\tstickClassName: 'sticky',\r\n\t\t\tplaceHolderClassName: 'sticky-placeholder'\r\n\t\t};\r\n\t}\r\n\r\n\t_resume() {\r\n\t\tthis._setupEvents(true);\r\n\t\tthis._updateMetrics();\r\n\t}\r\n\r\n\t_halt() {\r\n\t\tthis._setupEvents(false);\r\n\t\tthis._unstick();\r\n\t\tthis._element.style.width = '';\r\n\t}\r\n\r\n\t_bindFunctions() {\r\n\r\n\t\tthis._resume = this._resume.bind(this);\r\n\t\tthis._halt = this._halt.bind(this);\r\n\t\tthis._updateMetrics = this._updateMetrics.bind(this);\r\n\t\tthis._updateStickyness = this._updateStickyness.bind(this);\r\n\r\n\t\tthis._onResize = eventHelpers.debounce(this._updateMetrics, 300);\r\n\t\tthis._onScroll = eventHelpers.raf(this._updateStickyness);\r\n\t\tthis._onScrollStart = eventHelpers.debounceStart(this._updateMetrics, 1000);\r\n\t\t\r\n\t}\r\n\r\n\t_setupEvents(bind) {\r\n\r\n\t\tconst action = bind ? 'addEventListener' : 'removeEventListener';\r\n\r\n\t\twindow[action]('resize', this._onResize);\r\n\t\twindow[action]('scroll', this._onScroll, { passive: true });\r\n\t\twindow[action]('scroll', this._onScrollStart, { passive: true });\r\n\r\n\t}\r\n\r\n\t_createPlaceholder() {\r\n\r\n\t\tthis._placeholder = document.createElement('div');\r\n\t\tthis._placeholder.className = this._options.placeHolderClassName;\r\n\t\tthis._placeholder.style.display = 'none';\r\n\r\n\t\tthis._element.parentNode.insertBefore(this._placeholder, this._element.nextSibling);\r\n\r\n\t}\r\n\r\n\t_updateStickyness() {\r\n\r\n\t\tif (this._options.stickyTop && scrollY() > this._scrollTriggers.top.from && scrollY() < this._scrollTriggers.top.untill) {\r\n return this._stickTopFrom();\r\n\t\t}\r\n\r\n\t\tif (this._options.stickyBottom && scrollY() < this._scrollTriggers.bottom.from && scrollY() > this._scrollTriggers.bottom.untill) {\r\n return this._stickBottomFrom();\r\n\t\t}\r\n\r\n\t\tif (this._options.stickyTop && scrollY() > this._scrollTriggers.top.from && scrollY() > this._scrollTriggers.top.untill) {\r\n return this._stickTopUntill();\r\n\t\t}\r\n\r\n\t\tif (this._options.stickyBottom && scrollY() < this._scrollTriggers.bottom.from && scrollY() < this._scrollTriggers.bottom.untill) {\r\n return this._stickBottomUntill();\r\n\t\t}\r\n\r\n\t\tthis._unstick();\r\n\r\n\t}\r\n\r\n\t_updateMetrics() {\r\n\r\n\t\tthis._unstick();\r\n\t\tthis._element.style.width = '';\r\n\r\n\t\treflow(this._element);\r\n\t\treflow(this._placeholder);\r\n\r\n\t\tthis._element.style.width = this._element.offsetWidth + 'px';\r\n\r\n\t\tthis._placeholder.style.width = this._element.offsetWidth + 'px';\r\n\t\tthis._placeholder.style.height = this._element.offsetHeight + 'px';\r\n\r\n\t\tthis._scrollTriggers = {\r\n\t\t\ttop: {\r\n\t\t\t\tfrom: this._scrollTriggerTopFrom(),\r\n\t\t\t\tuntill: this._scrollTriggerTopUntill()\r\n\t\t\t},\r\n bottom: {\r\n from: this._scrollTriggerBottomFrom(),\r\n untill: this._scrollTriggerBottomUntill()\r\n }\r\n\t\t};\r\n\r\n\t\tthis._updateStickyness();\r\n\r\n\t}\r\n\r\n\t_stickTopFrom() {\r\n\r\n\t\tif (this._sticky === STICKY_TOP_FROM) return;\r\n\t\tthis._sticky = STICKY_TOP_FROM;\r\n\r\n\t\tthis._stickFrom('top');\r\n\r\n\t}\r\n\r\n\t_stickTopUntill() {\r\n\r\n\t\tif (this._sticky === STICKY_TOP_UNTILL) return;\r\n\t\tthis._sticky = STICKY_TOP_UNTILL;\r\n\r\n this._stickUntill('top');\r\n\r\n\t}\r\n\r\n\t_stickBottomFrom() {\r\n\r\n\t\tif (this._sticky === STICKY_BOTTOM_FROM) return;\r\n\t\tthis._sticky = STICKY_BOTTOM_FROM;\r\n\r\n\t\tthis._stickFrom('bottom');\r\n\r\n\t}\r\n\r\n\t_stickBottomUntill() {\r\n\r\n\t\tif (this._sticky === STICKY_BOTTOM_UNTILL) return;\r\n\t\tthis._sticky = STICKY_BOTTOM_UNTILL;\r\n\r\n\t\tthis._stickUntill('bottom');\r\n\r\n\t}\r\n\r\n\t_stickFrom(pos) {\r\n\r\n\t\t// bottom\r\n\t\tconst styles = {\r\n position: 'fixed',\r\n };\r\n\r\n styles[pos] = this._offset(pos) + 'px';\r\n\r\n Object.assign(this._element.style, noStyles, styles);\r\n\r\n this._placeholder.style.display = 'block';\r\n this._element.classList.add(this._options.stickClassName);\r\n\r\n\t}\r\n\r\n\t_stickUntill(pos) {\r\n\r\n const translation = this._scrollTriggers[pos].untill - this._scrollTriggers[pos].from;\r\n\r\n Object.assign(this._element.style, noStyles, {\r\n position: 'absolute',\r\n transform: `translateY(${ translation }px)`,\r\n });\r\n\r\n this._placeholder.style.display = 'block';\r\n this._element.classList.add(this._options.stickClassName);\r\n\r\n\t}\r\n\r\n\t_unstick() {\r\n\r\n\t\tif (this._sticky === NOT_STICKY) return;\r\n\t\tthis._sticky = NOT_STICKY;\r\n\r\n Object.assign(this._element.style, noStyles);\r\n\r\n\t\tthis._placeholder.style.display = 'none';\r\n\t\tthis._element.classList.remove(this._options.stickClassName);\r\n\r\n\t}\r\n\r\n _offset(pos) {\r\n return this._offsets[pos].reduce((result, o) => result + (isNumber(o) ? o : o.offsetHeight), 0);\r\n }\r\n\r\n\t_scrollTriggerTopFrom() {\r\n\t\tif (!this._options.stickyTop) return Infinity;\r\n\t\treturn this._element.getBoundingClientRect().top + scrollY() - this._offset('top');\r\n\t}\r\n\r\n\t_scrollTriggerTopUntill() {\r\n\t\tif (!this._stickyTopUntill) return Infinity;\r\n\t\treturn this._stickyTopUntill.getBoundingClientRect().top + scrollY() - this._element.offsetHeight - this._offset('top') - this._offset('bottom');\r\n\t}\r\n\r\n\t_scrollTriggerBottomUntill() {\r\n\t\tif (!this._stickyBottomUntill) return -Infinity;\r\n\t\treturn this._stickyBottomUntill.getBoundingClientRect().bottom + scrollY() + this._element.offsetHeight - window.innerHeight + this._offset('top') + this._offset('bottom');\r\n\t}\r\n\r\n\t_scrollTriggerBottomFrom() {\r\n\t\tif (!this._options.stickyBottom) return -Infinity;\r\n\t\treturn this._element.getBoundingClientRect().bottom + scrollY() - window.innerHeight + this._offset('bottom');\r\n\t}\r\n\r\n _getOffsets() {\r\n\r\n const offsets = {\r\n top: [],\r\n bottom: []\r\n };\r\n\r\n if (this._options.offsetTop) {\r\n offsets.top = this._options.offsetTop\r\n .split(',')\r\n .map(o => isNumber(o) ? +o : document.querySelector(o));\r\n }\r\n\r\n if (this._options.offsetBottom) {\r\n offsets.bottom = this._options.offsetBottom\r\n .split(',')\r\n .map(o => isNumber(o) ? +o : document.querySelector(o));\r\n }\r\n\r\n return offsets;\r\n\r\n }\r\n\r\n}\r\n\r\nexport default Sticky;","import Toggle from 'toggle/Toggle';\r\nimport Trigger from 'toggle/Trigger';\r\nimport Collapsible from 'ui/Collapsible';\r\nimport Observer from 'utils/Observer';\r\n\r\n/**\r\n * Default values for attribute and states.\r\n * @constant\r\n */\r\nconst TRIGGER_METHOD = 'switch',\r\n TOGGLE_TYPE = 'Toggle',\r\n TOGGLE = {\r\n Toggle: Toggle,\r\n Collapsible: Collapsible\r\n };\r\n\r\n/**\r\n * Class ToggleGroup that handles base functionality for ToggleGroups like Tabs and Accordions.\r\n * @class\r\n */\r\nclass ToggleGroup {\r\n\r\n /**\r\n * Make a new ToggleGroup.\r\n * @constructs\r\n * @param element\r\n * @param options\r\n */\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n /**\r\n * Initialize\r\n * @private\r\n */\r\n _initialize() {\r\n\r\n // collect the dom elements and options\r\n let triggerElements = document.querySelectorAll(this._options.triggerSelector),\r\n panelElements = document.querySelectorAll(this._options.panelSelector),\r\n triggerMethod = this._options.triggerMethod || TRIGGER_METHOD,\r\n toggleType = this._options.toggleType || TOGGLE_TYPE,\r\n id = this._element.id || '',\r\n i = 0, l = triggerElements.length,\r\n panelElement, triggerElement, panel;\r\n\r\n for (; i < l; i++) {\r\n\r\n panelElement = panelElements[i];\r\n triggerElement = triggerElements[i];\r\n\r\n // check if the elements are containing ids\r\n this._checkId(panelElement, 'panel', i);\r\n this._checkId(triggerElement, 'trigger', i);\r\n\r\n // create instances for triggers and toggles according to the options\r\n let toggle = new TOGGLE[toggleType](panelElement, {\"group\":id + \"-group\",\"attribute\":\"aria-hidden\",\"activeState\":\"false\",\"inActiveState\":\"true\"});\r\n new Trigger(triggerElement, {\"targets\":panelElement.id,\"group\":id + \"-panel-group\",\"attribute\":\"aria-selected\",\"method\":triggerMethod,\"toggle\":\"true\"});\r\n\r\n Observer.subscribe(toggle, toggle.activeEvent, target => {\r\n Observer.publish(this, 'change', target)\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Check if the element contains an id otherwise create and set one.\r\n * @private\r\n */\r\n _checkId(element, addition, index) {\r\n\r\n if (!element.id) {\r\n element.id = this._element.id + '-' + addition + '-' + index;\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default ToggleGroup;\r\n","import FormItem from 'ui/form/FormItem';\r\nimport scrollTo from 'utils/scrollTo';\r\nimport Observer from 'utils/Observer';\r\n\r\nclass Form {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options || {};\r\n\r\n if (!this._element) {\r\n return;\r\n }\r\n\r\n // Class params\r\n this._formItems = [];\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n /**\r\n * Initialize form component\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _initialize() {\r\n\r\n this._initializeFormItems();\r\n\r\n // find submit buttons\r\n this._buttons = this._element.querySelectorAll('[type=\"submit\"]');\r\n\r\n // toggle submit\r\n this._options.disableSubmitUntilValid && this._toggleSubmit();\r\n\r\n // bind events\r\n this._bindEvents();\r\n\r\n }\r\n\r\n /**\r\n * Bind events for the module\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _bindEvents() {\r\n\r\n this._element.addEventListener('submit', e => this._onSubmit(e));\r\n this._element.addEventListener('invalid', e => this._onInvalid(e));\r\n\r\n // if there is a submit prevent default html5 validation messages and set custom ones\r\n for (let i = 0, l = this._buttons.length; i < l; i++) {\r\n\r\n let button = this._buttons[i];\r\n\r\n button.addEventListener('click', e => {\r\n\r\n if (!this.isValid()) {\r\n e.preventDefault();\r\n this._formItems.forEach(formItem => formItem.validate());\r\n scrollTo(this._element.querySelector('[aria-invalid=true]')); // scroll to the first invalid element\r\n }\r\n\r\n }, true);\r\n }\r\n\r\n // attach change listeners when we keep the submit disabled until valid\r\n this._options.disableSubmitUntilValid && this._formItems.forEach(formItem => {\r\n Observer.subscribe(formItem, 'change', () => this._toggleSubmit());\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Initialize FormItem modules for the inputs\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _initializeFormItems() {\r\n\r\n let elements = this._element.querySelectorAll('input,select,textarea');\r\n\r\n for (let i = 0, length = elements.length; i < length; i++) {\r\n\r\n let element = elements[i],\r\n type = element.getAttribute('type');\r\n\r\n if (type !== 'hidden') {\r\n\r\n let formItem = new FormItem(element);\r\n\r\n this._formItems.push(formItem);\r\n\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the instance of FormItem related to the element\r\n * @memberof Form\r\n * @static\r\n * @public\r\n */\r\n getFormItemByElement(element) {\r\n\r\n for (let formItem of this._formItems) {\r\n\r\n if (formItem.getItem() === element) {\r\n return formItem;\r\n }\r\n\r\n }\r\n }\r\n\r\n /**\r\n * Disable or enable submit button\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _toggleSubmit() {\r\n\r\n let valid = this.isValid();\r\n\r\n // disable submits\r\n for (let button of this._buttons) {\r\n valid ? button.removeAttribute('disabled') : button.setAttribute('disabled', 'disabled');\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Fires when the form is submitted.\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _onSubmit(e) {\r\n let preventDefault = this._options.preventDefault !== true ? false : this._options.preventDefault;\r\n if (preventDefault) {\r\n e.preventDefault();\r\n }\r\n Observer.publish(this, 'submitForm', this);\r\n }\r\n\r\n /**\r\n * Fires when the form is invalid.\r\n * @memberof Form\r\n * @static\r\n * @private\r\n */\r\n _onInvalid() {\r\n Observer.publish(this, 'invalidForm', this);\r\n }\r\n\r\n /**\r\n * Checks each form item for its validity\r\n * @memberof Form\r\n * @returns {Boolean} Valid state of this form\r\n * @static\r\n * @public\r\n */\r\n isValid(items = this._formItems) {\r\n return items.reduce((valid, formItem) => {\r\n return (formItem.isValid() || formItem.isIgnored()) && valid;\r\n //return (formItem.isValid().then(response => { console.log(response); return response; }) || formItem.isIgnored()) && valid;\r\n }, true);\r\n }\r\n\r\n submit() {\r\n this._element.submit();\r\n }\r\n\r\n getForm() {\r\n return this;\r\n }\r\n\r\n}\r\n\r\nexport default Form;","// todo: handle radio buttons (validation) as a group instead of separate form-items\r\nimport Observer from 'utils/Observer';\r\nimport { closest, insertAfter } from 'utils/DOMHelpers';\r\nimport FormField from 'form/FormField';\r\n//import request from 'data/request';\r\n\r\nconst DATA_FILTER_ATTR = 'data-filter-pattern',\r\n DATA_VALID_ATTR = 'aria-invalid',\r\n DATA_VALID_VAL = 'false',\r\n DATA_INVALID_VAL = 'true',\r\n DATA_MATCHES_ATTR = 'data-matches',\r\n DATA_ERROR_ATTR = 'data-error',\r\n DATA_ERROR_CLASS = 'error',\r\n DATA_REQUIRED_ATTR = 'data-required'/*,\r\n DATA_VALIDATION_URI = 'data-validation-uri'*/;\r\n\r\nclass FormItem {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n\r\n // Form items also create a form field, to enable the use of data/ApiValue anywhere\r\n new FormField(this._element, options);\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n /**\r\n * Initialize form-item component\r\n * @static\r\n * @private\r\n */\r\n\r\n _initialize() {\r\n\r\n this._label = null;\r\n\r\n // Has an existing error label\r\n if (this._element.nextElementSibling && this._element.nextElementSibling.classList.contains(DATA_ERROR_CLASS)) {\r\n this._label = this._element.nextElementSibling;\r\n }\r\n\r\n // Regexes\r\n this._validateRegex = new RegExp(this._element.getAttribute('pattern'));\r\n if (this._element.hasAttribute(DATA_FILTER_ATTR)) {\r\n this._filterRegex = new RegExp(this._element.getAttribute(DATA_FILTER_ATTR), 'g');\r\n }\r\n\r\n // Element to match value against\r\n this._matchingElement = this._element.hasAttribute(DATA_MATCHES_ATTR) ? document.getElementById(this._element.getAttribute(DATA_MATCHES_ATTR)) : null;\r\n //this._validationURI = this._element.getAttribute(DATA_VALIDATION_URI);\r\n //this._currentValue = '';\r\n\r\n // Messages\r\n this._errorMessage = this._element.getAttribute(DATA_ERROR_ATTR);\r\n this._requiredMessage = this._element.getAttribute(DATA_REQUIRED_ATTR) || 'Verplicht veld';\r\n\r\n // Bind events\r\n this._bindEvents();\r\n\r\n }\r\n\r\n /**\r\n * Bind events for the module\r\n * @static\r\n * @private\r\n */\r\n\r\n _bindEvents() {\r\n\r\n this._element.addEventListener('blur', e => {\r\n if (e.target.value !== '') { this._onChange() }\r\n });\r\n\r\n this._element.addEventListener('input', e => this._onInput());\r\n\r\n /*if (!this._validationURI) {\r\n this._element.addEventListener('input', e => this._onInput());\r\n }*/\r\n\r\n // Also bind to the element we match against\r\n this._matchingElement && this._matchingElement.addEventListener('input', this._onMatchingElementInput.bind(this));\r\n\r\n }\r\n\r\n /**\r\n * Validate this form-item\r\n * @static\r\n * @private\r\n */\r\n\r\n _onChange() {\r\n this._element.setCustomValidity('');\r\n this.validate();\r\n Observer.publish(this, 'change');\r\n }\r\n\r\n /**\r\n * Validate this form-item (only to valid, not invalid)\r\n * @static\r\n * @private\r\n */\r\n\r\n _onInput() {\r\n this._element.setCustomValidity('');\r\n this.isValid() && this.setValid();\r\n Observer.publish(this, 'change');\r\n }\r\n\r\n /**\r\n * Validate this form-item when the matching element input changes\r\n * @static\r\n * @public\r\n */\r\n\r\n _onMatchingElementInput() {\r\n this._element.value && this.validate();\r\n }\r\n\r\n /**\r\n * Public function to set the validation status of this form-item\r\n * @static\r\n * @public\r\n */\r\n\r\n validate() {\r\n if (this.isIgnored()) { return; }\r\n this.isValid() ? this.setValid() : this.setInvalid();\r\n }\r\n\r\n /**\r\n * Checks this form item for its validity\r\n * @returns {Boolean} Valid state of this form item\r\n * @static\r\n * @public\r\n */\r\n\r\n /*_test() {\r\n if (this._element.value !== this._currentValue) {\r\n this._currentValue = this._element.value;\r\n return request(this._validationURI).then(response => JSON.parse(response).valid || false );\r\n }\r\n }*/\r\n\r\n isValid() {\r\n\r\n /*if (this._validationURI) {\r\n if (this._element.value !== this._currentValue) {\r\n this._currentValue = this._element.value;\r\n return request(this._validationURI).then(response => JSON.parse(response).valid || false );\r\n }\r\n }\r\n\r\n if (this._filterRegex) {\r\n // When a filter regex is given, filter first then check the validate regex\r\n let filteredValue = this._element.value.replace(this._filterRegex, '');\r\n return Promise.resolve(this._validateRegex.test(filteredValue));\r\n }\r\n\r\n if (this._matchingElement) {\r\n return Promise.resolve(this._element.value === this._matchingElement.value && this._element.value !== '');\r\n }\r\n\r\n // Return the html5 form item valid state\r\n return Promise.resolve(this._element.checkValidity());*/\r\n\r\n if (this._filterRegex) {\r\n // When a filter regex is given, filter first then check the validate regex\r\n let filteredValue = this._element.value.replace(this._filterRegex, '');\r\n return this._validateRegex.test(filteredValue);\r\n }\r\n\r\n if (this._matchingElement) {\r\n const valid = this._element.value === this._matchingElement.value && this._element.value !== '';\r\n if (!valid) this._element.setCustomValidity('Invalid');\r\n return valid;\r\n }\r\n\r\n // Return the html5 form item valid state\r\n return this._element.checkValidity();\r\n\r\n }\r\n\r\n /**\r\n * Whether this input should be ignored when validating the form, because it's not required AND empty\r\n * @returns {Boolean} Required\r\n * @static\r\n * @public\r\n */\r\n\r\n isIgnored() {\r\n return this._element.value === '' && !this._element.hasAttribute('required');\r\n }\r\n\r\n /**\r\n * Set state of this form-item\r\n * @static\r\n * @public\r\n */\r\n\r\n setValid() {\r\n\r\n if (!this._label && this._element.type === 'radio') {\r\n this._label = this._getRadioErrorLabel();\r\n }\r\n\r\n if (this._label && this._label.parentNode) {\r\n this._label.parentNode.removeChild(this._label);\r\n this._label = null;\r\n }\r\n\r\n if (this._element.value) {\r\n // We entered a valid value\r\n this._element.setAttribute(DATA_VALID_ATTR, DATA_VALID_VAL);\r\n } else {\r\n // We entered nothing, but the field wasn't required\r\n this._element.removeAttribute(DATA_VALID_ATTR);\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Set invalid state of this form-item\r\n * @static\r\n * @public\r\n */\r\n\r\n setInvalid() {\r\n\r\n let error;\r\n\r\n // Set element state to invalid\r\n this._element.setAttribute(DATA_VALID_ATTR, DATA_INVALID_VAL);\r\n\r\n // Empty && invalid -> Fields is not filled, required?\r\n // Just invalid -> Format doesn't match requested format\r\n if (this._element.type !== 'radio' && this._element.value) {\r\n error = this._errorMessage;\r\n } else if (this._element.hasAttribute('required')) {\r\n error = this._requiredMessage;\r\n }\r\n\r\n // If our error message is empty, don't attach an error element\r\n // The timeout enables other form events to be handled before displaying the error messages\r\n error && setTimeout(() => this._setErrorMessage(error), 1);\r\n\r\n }\r\n\r\n /**\r\n * Retrieve the error label for a radio type input (grouped)\r\n * @returns {Element}\r\n * @private\r\n */\r\n _getRadioErrorLabel() {\r\n let parent = closest(this._element, '.form-items-radio');\r\n\r\n if (parent) {\r\n return parent.querySelector('.' + DATA_ERROR_CLASS);\r\n }\r\n }\r\n\r\n /**\r\n * Update or create the error message\r\n * @param {String} error - The error message to display\r\n * @private\r\n *\r\n */\r\n _setErrorMessage(error) {\r\n\r\n if (!this._label && this._element.type === 'radio') {\r\n this._label = this._getRadioErrorLabel();\r\n }\r\n\r\n // Update the existing error element, if there is one\r\n if (this._label) {\r\n this._label.textContent = error;\r\n return; // The bouncer\r\n }\r\n\r\n // Create a new error element\r\n this._label = document.createElement('label');\r\n this._label.setAttribute('for', this._element.getAttribute('id'));\r\n this._label.className = DATA_ERROR_CLASS;\r\n this._label.textContent = error;\r\n\r\n // Append it\r\n if (this._element.type === 'checkbox') {\r\n this._element.parentNode.appendChild(this._label);\r\n }\r\n else if (this._element.type === 'radio') {\r\n closest(this._element, '.form-items-radio').appendChild(this._label);\r\n }\r\n else {\r\n closest(this._element, '.form-item').appendChild(this._label);\r\n }\r\n }\r\n\r\n /**\r\n * Get the element for this form-item.\r\n * @return {Element}\r\n * @public\r\n *\r\n */\r\n\r\n getItem() {\r\n return this._element;\r\n }\r\n\r\n}\r\n\r\nexport default FormItem;\r\n","class PasswordIndicator {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(PasswordIndicator.options, options);\r\n this._values = JSON.parse(this._options.values);\r\n\r\n this._visible = null;\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n static get options() {\r\n \t\treturn {\r\n attribute: 'data-strength'\r\n };\r\n }\r\n\r\n get visible() {\r\n return this._visible;\r\n }\r\n\r\n set visible(bool) {\r\n if (this._visible === bool) return;\r\n this._visible = bool;\r\n this._input.type = bool ? 'text' : 'password';\r\n }\r\n\r\n _initialize() {\r\n\r\n this._indicator = document.createElement('div');\r\n this._indicator.className = 'password-indicator';\r\n this._element.appendChild(this._indicator);\r\n\r\n this._visibilityToggle = document.createElement('button');\r\n this._visibilityToggle.className = 'password-visibility-toggle';\r\n this._visibilityToggle.type = 'button'\r\n this._visibilityToggle.setAttribute('aria-hidden', 'true');\r\n this._element.appendChild(this._visibilityToggle);\r\n\r\n this._input = this._element.querySelector('input')\r\n this._input.addEventListener('input', e => this._onInput(e.target.value));\r\n this._visibilityToggle.addEventListener('click', () => this.visible = !this.visible);\r\n\r\n }\r\n\r\n _onInput(input) {\r\n\r\n for (let value of this._values) {\r\n\r\n if (new RegExp(value.pattern).test(input)) {\r\n this._indicator.setAttribute(this._options.attribute, value.strength);\r\n this._indicator.textContent = value.label;\r\n return;\r\n }\r\n\r\n this._indicator.setAttribute(this._options.attribute, '');\r\n this._indicator.textContent = this._options.defaultLabel;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default PasswordIndicator;","import DataStore from 'data/DataStore';\r\nimport ScriptLoader from 'utils/ScriptLoader';\r\nimport io from 'utils/ioHelpers';\r\n\r\nclass Directions {\r\n\r\n\tconstructor(element, options = {}) {\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign(Directions.options, (element.dataset || {}), options);\r\n\r\n\t\tthis._store = DataStore.getSingleton();\r\n\r\n\t\tthis._input = io.parse(this._options.input);\r\n\t\tthis._output = io.parse(this._options.output);\r\n\t\t\r\n\t\tthis._geocoder = null;\r\n\t\tthis._directionsService = null;\r\n\r\n\t\tScriptLoader.load('https://maps.google.com/maps/api/js?key=' + this._options.apiKey)\r\n\t\t\t.then(() => this._initialize());\r\n\r\n\t}\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tapiKey: window.GOOGLE_MAPS_API_KEY || 'AIzaSyC00PNATIMijnNvnUEI5P6MFAk5DGk-aPI',\r\n\t\t\torigin: null,\r\n\t\t\tdestination: null,\r\n\t\t\ttravelMode: 'TRANSIT'\r\n\t\t};\r\n\t}\r\n\r\n\tget query() {\r\n\r\n\t\treturn {\r\n\t\t\torigin: this._store.get(this._input[0].storeKey) || this._options.origin,\r\n\t\t\tdestination: this._options.destination,\r\n travelMode: this._options.travelMode\r\n\t\t};\r\n\r\n\t}\r\n\r\n\t_initialize() {\r\n\r\n\t\tthis._geocoder = new google.maps.Geocoder;\r\n\t\tthis._directionsService = new google.maps.DirectionsService;\r\n\r\n\t\tthis._calculate = this._calculate.bind(this);\r\n\r\n\t\tthis._store.watch(io.storeKeys(this._input), this._calculate);\r\n\r\n\t}\r\n\r\n\t_getDirection(query) {\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tthis._directionsService.route(query, (response, status) => {\r\n\t\t\t\tif (status === 'OK') {\r\n\t\t\t\t\tresolve({\r\n\t\t\t\t\t\tpath: response.routes[0].overview_path,\r\n\t\t\t\t\t\tduration: Math.round(response.routes[0].legs[0].duration.value / 60)\r\n\t\t\t\t\t})\r\n } else {\r\n\t\t\t\t\treject();\r\n\t\t\t\t}\r\n });\r\n\t\t});\r\n\t}\r\n\r\n\t_getCoords(value) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tthis._geocoder.geocode({address: value}, (results, status) => {\r\n\t\t\t\tif (status === 'OK') {\r\n\t\t\t\t\tresolve({\r\n\t\t\t\t\t\tpath: results[0].geometry.location,\r\n\t\t\t\t\t\tduration: 0\r\n\t\t\t\t\t})\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(result.status)\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t})\r\n\t}\r\n\r\n\t_calculate() {\r\n\r\n\t\tlet directions;\r\n\t\tthis._getDirection(this.query)\r\n\t\t\t.then(values => directions = values)\r\n\t\t\t.catch(() => this._getCoords(this.query.origin).then(values => directions = values))\r\n\t\t\t.then(() => this._outputToStore(directions))\r\n\r\n\t}\r\n\r\n\t_outputToStore(directions) {\r\n\t\tio.output(this._store, this._output, directions);\r\n\t}\r\n\r\n}\r\n\r\nexport default Directions;","//import Maps from 'async!https://maps.google.com/maps/api/js?key=AIzaSyAC7Zx7HMMgbRp3SBcXjivwTjRfQ7UgzBc';\r\nimport MapMarkerClusterer from 'ui/map/MapMarkerClusterer';\r\nimport mapMarkers from 'ui/map/MapMarkers';\r\nimport latLngHelpers from 'utils/latLngHelpers';\r\nimport ScriptLoader from 'utils/ScriptLoader';\r\nimport mapStyles from 'ui/map/mapStyles';\r\nimport MapOverlay from 'ui/map/MapOverlay';\r\nimport Timeline from 'motion/Timeline';\r\n\r\nclass Map {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(Map.options, options);\r\n \r\n this._latLngs = [];\r\n this._markers = [];\r\n\r\n this.isReady = new Promise(resolve => this._ready = resolve);\r\n\r\n this.isReady.catch(console.error);\r\n\r\n ScriptLoader.load('https://maps.google.com/maps/api/js?key=' + this._options.apiKey)\r\n .then(() => this._initialize());\r\n\r\n }\r\n\r\n\tstatic get options() {\r\n\t\treturn {\r\n apiKey: window.GOOGLE_MAPS_API_KEY || 'AIzaSyC00PNATIMijnNvnUEI5P6MFAk5DGk-aPI',\r\n\t\t\tcluster: false,\r\n offsetX: 0,\r\n offsetY: 0,\r\n zoom: 15,\r\n style: 'pink',\r\n center: null,\r\n controlPosition: 'RIGHT_BOTTOM',\r\n markerData: [],\r\n fallbackCenterLatLng: typeof google !== typeof undefined ? new google.maps.LatLng(51.436270, 5.478170) : { lat: -34.397, lng: 150.644 } // Fallback Wal 2, 5611 GG Eindhoven (Vestide)\r\n };\r\n }\r\n\r\n get markers() {\r\n return this._markers;\r\n }\r\n\r\n get map() {\r\n return this._map;\r\n }\r\n\r\n _initialize() {\r\n\r\n this._latLngs = latLngHelpers.parseCoordinates(this._options.markerData.map(data => data.position) || []);\r\n const center = this._latLngs.length\r\n ? latLngHelpers.centerOfLatLngs(this._latLngs)\r\n : this._options.center;\r\n\r\n this._map = this._setup(center);\r\n this._markers = this._createMarkers(this._latLngs, this._options.markerData);\r\n\r\n this._onResize = this._onResize.bind(this);\r\n window.addEventListener('resize', this._onResize);\r\n\r\n this._positionMap();\r\n\r\n if (this._options.cluster) {\r\n this._clusterer = new MapMarkerClusterer({ map: this._map, markers: this._markers });\r\n }\r\n\r\n this._ready();\r\n\r\n }\r\n\r\n _onResize() {\r\n\r\n if (!this._resizing) {\r\n this._centerBeforeResize = this._map.getCenter();\r\n }\r\n\r\n clearTimeout(this._resizing);\r\n this._resizing = setTimeout(() => {\r\n\r\n google.maps.event.trigger(this._map, 'resize');\r\n\r\n this._map.setCenter(this._centerBeforeResize);\r\n this._resizing = null;\r\n this._centerBeforeResize = null;\r\n\r\n }, 150);\r\n\r\n }\r\n\r\n _positionMap() {\r\n\r\n if (this._latLngs.length > 1) {\r\n this._map.fitBounds(latLngHelpers.getBounds(this._latLngs));\r\n } else if (this._latLngs.length == 1) {\r\n this._map.panTo(this._latLngs[0]);\r\n }\r\n else {\r\n this._map.panTo(this._options.fallbackCenterLatLng);\r\n }\r\n\r\n this._map.panBy(-parseFloat(this._options.offsetX), -parseFloat(this._options.offsetY));\r\n }\r\n \r\n _setup(center) {\r\n\r\n const opts = {\r\n center,\r\n scrollwheel: false,\r\n minZoom: 6,\r\n zoom: this._options.zoom,\r\n disableDefaultUI: true,\r\n zoomControl: true,\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition[this._options.controlPosition]\r\n }\r\n };\r\n\r\n if (mapStyles[this._options.style]) {\r\n opts.styles = mapStyles[this._options.style];\r\n }\r\n\r\n return new google.maps.Map(this._element, opts);\r\n\r\n }\r\n\r\n _createMarkers(latLngs = [], markerData) {\r\n\r\n const markers = latLngs\r\n .map((latLng, i) => this._addMarker(this._map, latLng, Object.assign(markerData[i], { delay: i * 75 })));\r\n\r\n return markers;\r\n\r\n }\r\n\r\n _addMarker(map, latLng, markerData) {\r\n\r\n const marker = new MapOverlay({\r\n map,\r\n position: latLng,\r\n body: mapMarkers[markerData.marker](markerData),\r\n delay: markerData.delay || 0\r\n });\r\n\r\n marker.markerData = markerData;\r\n\r\n if (!markerData.url) return marker;\r\n\r\n // Make sure click doesn't do anything when we dragged the map\r\n let position;\r\n marker.getDOMTarget().addEventListener('mousedown', () => position = map.getCenter());\r\n marker.getDOMTarget().addEventListener('click', () => position === map.getCenter() && (window.location.href = markerData.url));\r\n\r\n return marker;\r\n\r\n }\r\n\r\n addMarker(map, latLng, icon, url) {\r\n const marker = this._addMarker(map, latLng, icon, url);\r\n this._markers.push(marker);\r\n this._latLngs.push(latLng);\r\n return marker;\r\n }\r\n\r\n animateTo(latLng, duration = 1000) {\r\n\r\n const ease = t => t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1;\r\n\r\n const start = this._map.getCenter();\r\n\r\n this._positionAnimation && this._positionAnimation.cancel();\r\n this._positionAnimation = new Timeline(duration, f => {\r\n\r\n f = ease(f);\r\n\r\n const lat = start.lat() + (latLng.lat() - start.lat()) * f;\r\n const lng = start.lng() + (latLng.lng() - start.lng()) * f;\r\n\r\n this._map.setCenter(new google.maps.LatLng(lat, lng));\r\n\r\n });\r\n\r\n }\r\n\r\n}\r\n\r\nexport default Map;","import mapMarkers from 'ui/map/MapMarkers';\r\nimport latLngHelpers from 'utils/latLngHelpers';\r\nimport MapOverlay from 'ui/map/MapOverlay';\r\n\r\n// todo: fix bug in Safari\r\n\r\nconst CLUSTER_DISTANCE = 50;\r\n\r\nconst distance = (point1, point2) => {\r\n\r\n const dx = point1[0] - point2[0];\r\n const dy = point1[1] - point2[1];\r\n\r\n return Math.sqrt(dx * dx + dy * dy);\r\n\r\n};\r\n\r\nclass MapMarkerClusterer {\r\n\r\n\tconstructor(options) {\r\n\r\n\t\tthis._options = options;\r\n\r\n\t\tthis._map = options.map;\r\n\t\tthis._markers = options.markers;\r\n\r\n\t\tthis._clusters = [];\r\n\r\n this._cluster = this._cluster.bind(this);\r\n\r\n\t\tgoogle.maps.event.addListenerOnce(this._map, 'projection_changed', () => this._initialize());\r\n\r\n\t}\r\n\r\n\t_initialize() {\r\n\t\tthis._map.addListener('zoom_changed', this._cluster);\r\n\t\tthis._cluster();\r\n\t}\r\n\r\n\t_cluster() {\r\n\r\n\t\tthis._clearClusters();\r\n\r\n\t\tthis._markers.forEach(marker => {\r\n\t\t\tmarker.point = this._convertToPoint(marker.getPosition());\r\n\t\t\tmarker.clustered = false;\r\n });\r\n\r\n\t\tfor (let i = this._markers.length - 1; i >= 0; i--) {\r\n\r\n const markerA = this._markers[i];\r\n\t\t\tif (markerA.clustered) continue;\r\n\r\n\t\t\tlet cluster;\r\n\r\n for (let j = this._markers.length - 1; j >= 0; j--) {\r\n\r\n \tconst markerB = this._markers[j];\r\n \tif (i === j || markerB.clustered) continue;\r\n\r\n\t\t\t\tif (cluster) {\r\n\r\n\t\t\t\t\tconst dist = distance(markerB.point, cluster.point);\r\n if (dist > CLUSTER_DISTANCE) continue;\r\n\r\n cluster.markers.push(markerB);\r\n markerB.clustered = true;\r\n\r\n\t\t\t\t} else {\r\n\r\n const dist = distance(markerA.point, markerB.point);\r\n if (dist > CLUSTER_DISTANCE) continue;\r\n\r\n\t\t\t\t\tcluster = {\r\n markers: [ markerA, markerB ],\r\n point: markerA.point,\r\n latLng: markerA.getPosition(),\r\n marker: null,\r\n unbindEvents: null\r\n };\r\n\r\n markerA.clustered = true;\r\n markerB.clustered = true;\r\n\r\n this._clusters.push(cluster);\r\n\r\n }\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Set visiblity\r\n\t\tthis._markers.forEach(marker => marker.setVisible(!marker.clustered));\r\n this._clusters.forEach((cluster, i) => this._createClusterMarker(cluster, i));\r\n\r\n\t}\r\n\r\n\t_clearClusters() {\r\n\r\n\t\tthis._clusters.forEach(cluster => {\r\n\t\t\tcluster.unbindEvents && cluster.unbindEvents();\r\n cluster.marker.setMap(null);\r\n });\r\n\r\n\t\tthis._clusters = [];\r\n\r\n\t}\r\n\r\n\t_createClusterMarker(cluster, i) {\r\n\r\n\t\tconst bounds = new google.maps.LatLngBounds();\r\n\r\n\t\tcluster.markers.forEach(marker => bounds.extend(marker.getPosition()));\r\n\r\n\t\tif (this._map.getZoom() < 21) {\r\n\r\n cluster.marker = new MapOverlay({\r\n map: this._map,\r\n position: bounds.getCenter(),\r\n body: mapMarkers.clusterMarker(cluster.markers.length),\r\n\t\t\t\tdelay: i * 75\r\n });\r\n\r\n const openCluster = () => this._openCluster(cluster);\r\n\r\n cluster.marker.getDOMTarget().addEventListener('click', openCluster);\r\n cluster.unbindEvents = () => cluster.marker.getDOMTarget().removeEventListener('click', openCluster);\r\n\r\n } else {\r\n\r\n\t\t\tcluster.marker = new MapOverlay({\r\n map: this._map,\r\n position: bounds.getCenter(),\r\n body: mapMarkers.expandedClusterMarker(cluster.markers.map(marker => marker.markerData))\r\n });\r\n\r\n\t\t}\r\n\r\n\t\treturn cluster.marker;\r\n\r\n\t}\r\n\t\r\n\t_openCluster(cluster) {\r\n\r\n\t\tconst latLngs = cluster.markers.map(marker => marker.getPosition());\r\n\t\tthis._map.fitBounds(latLngHelpers.getBounds(latLngs));\r\n\t\tthis._map.setZoom(this._map.getZoom() - 1);\r\n\r\n\t}\r\n\r\n\t_convertToPoint(latLng) {\r\n\r\n\t\tconst projection = this._map.getProjection();\r\n\t\tconst bounds = this._map.getBounds();\r\n\t\tconst topRight = projection.fromLatLngToPoint(bounds.getNorthEast());\r\n\t\tconst bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest());\r\n\t\tconst scale = Math.pow(2, this._map.getZoom());\r\n\t\tconst worldPoint = projection.fromLatLngToPoint(latLng);\r\n\r\n\t\treturn [Math.floor((worldPoint.x - bottomLeft.x) * scale), Math.floor((worldPoint.y - topRight.y) * scale)];\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default MapMarkerClusterer","const b64 = str => {\r\n\treturn btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {\r\n\t\treturn String.fromCharCode('0x' + p1);\r\n\t}));\r\n};\r\n\r\nconst createMarker = (w, h, svg) => {\r\n\tconst dataUri = 'data:image/svg+xml;base64,' + b64(svg);\r\n const img = new Image(w, h);\r\n img.src = dataUri;\r\n\treturn {\r\n url: dataUri,\r\n size: new google.maps.Size(w, h),\r\n scaledSize: new google.maps.Size(w, h)\r\n };\r\n};\r\n\r\nconst mapMarkers = {\r\n\r\n\thousingMarker: ({ area, cost, url }) => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t${ area }m2\r\n\t\t\t${ cost }\r\n\t\t\t\r\n\t\t\r\n\t`,\r\n\r\n\texpandedClusterMarker: housingMarkers => `\r\n\t\t
\r\n\t\t\t\t\t\r\n\t\t
\t\t\r\n\t`,\r\n\r\n\tclusterMarker: count => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t${ count }\r\n\t\t\t\t\t\r\n\t`,\r\n\r\n\tdetailMarker: ({ src }) => `\r\n\t\t
\r\n\t\t\t
\t\t\t\r\n\t\t
\r\n\t`,\r\n\r\n\toriginMarker: () => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t`,\r\n\r\n\tdestinationMarker: () => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t`\r\n\r\n};\r\n\r\nexport default mapMarkers;\r\n","import { setPrefixedStyle } from 'utils/DOMHelpers'\r\n\r\nclass MapOverlay {\r\n\r\n\tconstructor(options) {\r\n\r\n\t\tthis._options = options;\r\n\r\n\t\tObject.setPrototypeOf(this, Object.assign(new google.maps.OverlayView(), {\r\n\t\t\tonAdd: this.onAdd.bind(this),\r\n\t\t\tdraw: this.draw.bind(this),\r\n\t\t\tonRemove: this.onRemove.bind(this),\r\n\t\t\tgetPosition: this.getPosition.bind(this),\r\n\t\t\tsetPosition: this.setPosition.bind(this),\r\n\t\t\tsetVisible: this.setVisible.bind(this),\r\n\t\t\tgetDOMTarget: this.getDOMTarget.bind(this)\r\n\t\t}));\r\n\r\n\t\tthis._latLng = options.position;\r\n\t\tthis._view = document.createElement('div');\r\n\t\tthis._view.innerHTML = options.body;\r\n\r\n\t\tthis.setMap(options.map);\r\n\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\treturn this._latLng;\r\n\t}\r\n\r\n\tsetPosition(position) {\r\n\t\tthis._latLng = position;\r\n\t\tthis.draw();\r\n\t}\r\n\r\n\tsetVisible(bool) {\r\n this._view.style.display = bool ? '' : 'none';\r\n\t}\r\n\r\n\tgetDOMTarget() {\r\n\t\treturn this._view;\r\n\t}\r\n\r\n\tonAdd() {\r\n\t\tthis._view.style.position = 'absolute';\r\n setPrefixedStyle(this._view, 'animation-delay', (Number(this._options.delay) || 0) + 'ms');\r\n this.getPanes().overlayMouseTarget.appendChild(this._view);\r\n\t}\r\n\r\n\tdraw() {\r\n\r\n\t\tconst overlayProjection = this.getProjection();\r\n\t\tconst point = overlayProjection.fromLatLngToDivPixel(this._latLng);\r\n\r\n\t\tthis._view.style.left = point.x + 'px';\r\n\t\tthis._view.style.top = point.y + 'px';\r\n\r\n\t}\r\n\r\n\tonRemove() {\r\n\t\tthis._view.parentNode.removeChild(this._view);\r\n\t\tthis._view = null;\r\n\t}\r\n\r\n}\r\n\r\nexport default MapOverlay;","class MapPolyline {\r\n\r\n\tconstructor(options = {}) {\r\n\t\t\r\n\t\tthis._options = Object.assign(MapPolyline.options, options);\r\n\r\n\t\tthis._map = this._options.map;\r\n\r\n\t}\r\n\t\r\n\tstatic get options() {\r\n\t\treturn {\r\n\t\t\tanimationDuration: 3500,\r\n\t\t\tpolylines: [\r\n\t\t\t\t{\r\n\t\t\t\t\tstrokeColor: \"#407380\",\r\n\t\t\t\t\tstrokeOpacity: .8,\r\n\t\t\t\t\tstrokeWeight: 10\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tstrokeColor: \"#00ccff\",\r\n\t\t\t\t\tstrokeOpacity: 1.0,\r\n\t\t\t\t\tstrokeWeight: 8\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t}; \r\n\t}\r\n\r\n\tset path(path) {\r\n\t\tthis._clearPath();\r\n\t\tthis._path = path;\r\n\t}\r\n\r\n\tget path() {\r\n\t\treturn this._path;\r\n\t}\r\n\r\n\tanimatePolyline(duration) {\r\n\r\n\t\treturn this._map.isReady.then(() => {\r\n\t\t\tthis._animatePath(this._path, duration)\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t_clearPath() {\r\n\r\n\t\tif (!this._polylines) return;\r\n\r\n\t\tthis._polylines.forEach(poly => poly.setMap(null));\r\n\t\tthis._polylines = null;\r\n\t\t\r\n\t}\r\n\r\n\t_animatePath(path, duration) {\r\n\r\n\t\tthis._polylines = this._polylines || this._options.polylines.map(polyline => {\r\n\t\t\treturn new google.maps.Polyline(Object.assign(polyline, { map: this._map.map }));\r\n\t\t});\r\n\r\n\t\treturn new Promise(resolve => {\r\n\r\n\t\t\tconst ease = t => Math.sin(t * (Math.PI/2));\r\n\r\n\t\t\tconst renderStep = p => {\r\n\r\n\t\t\t\tconst i = Math.round(ease(p / path.length) * path.length);\r\n\r\n\t\t\t\tthis._polylines.forEach(poly => poly.setPath(path.slice(0, i + 1)));\r\n\r\n\t\t\t\tif (p < path.length) {\r\n\t\t\t\t\trequestAnimationFrame(() => renderStep(p + path.length / (duration / 16.66)));\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresolve();\r\n\r\n\t\t\t};\r\n\r\n\t\t\trenderStep(0);\r\n\r\n\t\t\tthis._map.map.setCenter(path[path.length - 1]);\r\n\t\t\t//this._animatePositionTo(path[path.length - 1], duration * 1.05);\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default MapPolyline;","const b64 = str => {\r\n\treturn btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {\r\n\t\treturn String.fromCharCode('0x' + p1);\r\n\t}));\r\n};\r\n\r\nconst createMarker = (w, h, svg) => {\r\n\tconst dataUri = 'data:image/svg+xml;base64,' + b64(svg);\r\n const img = new Image(w, h);\r\n img.src = dataUri;\r\n\treturn {\r\n url: dataUri,\r\n size: new google.maps.Size(w, h),\r\n scaledSize: new google.maps.Size(w, h)\r\n };\r\n};\r\n\r\nconst mapMarkers = {\r\n\r\n\thousingMarker: ({ area, cost, url }) => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t${ area }m2\r\n\t\t\t${ cost }\r\n\t\t\t\r\n\t\t\r\n\t`,\r\n\r\n\texpandedClusterMarker: housingMarkers => `\r\n\t\t
\r\n\t\t\t\t\t\r\n\t\t
\t\t\r\n\t`,\r\n\r\n\tclusterMarker: count => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t${ count }\r\n\t\t\t\t\t\r\n\t`,\r\n\r\n\tdetailMarker: ({ src }) => `\r\n\t\t
\r\n\t\t\t
\t\t\t\r\n\t\t
\r\n\t`,\r\n\r\n\toriginMarker: () => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t`,\r\n\r\n\tdestinationMarker: () => `\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t`\r\n\r\n};\r\n\r\nexport default mapMarkers;\r\n","const mapStyles = {\r\n\r\n\tpink: [\r\n\t\t{\r\n\t\t\t\"featureType\": \"administrative\",\r\n\t\t\t\"elementType\": \"geometry\",\r\n\t\t\t\"stylers\": [{\"color\": \"#34556f\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"administrative\",\r\n\t\t\t\"elementType\": \"labels.text.fill\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"color\": \"#34556f\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"landscape\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"color\": \"#fdf3f7\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"landscape\",\r\n\t\t\t\"elementType\": \"geometry.stroke\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"color\": \"#f7c1d6\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"poi\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"saturation\": \"7\"}, {\"hue\": \"#ff0063\"}, {\"lightness\": \"37\"}]\r\n\t\t}, {\"featureType\": \"poi\", \"elementType\": \"labels\", \"stylers\": [{\"visibility\": \"off\"}]}, {\r\n\t\t\t\"featureType\": \"poi\",\r\n\t\t\t\"elementType\": \"labels.icon\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"off\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road\",\r\n\t\t\t\"elementType\": \"labels.text.fill\",\r\n\t\t\t\"stylers\": [{\"color\": \"#34556f\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road\",\r\n\t\t\t\"elementType\": \"labels.icon\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"off\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road.highway\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"color\": \"#ffffff\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road.highway\",\r\n\t\t\t\"elementType\": \"geometry.stroke\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"color\": \"#b3b3b3\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road.arterial\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"color\": \"#ffffff\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road.arterial\",\r\n\t\t\t\"elementType\": \"geometry.stroke\",\r\n\t\t\t\"stylers\": [{\"color\": \"#f7c1d6\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"road.local\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"visibility\": \"on\"}, {\"color\": \"#ffffff\"}, {\"weight\": 1.8}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"transit\",\r\n\t\t\t\"elementType\": \"all\",\r\n\t\t\t\"stylers\": [{\"color\": \"#808080\"}, {\"visibility\": \"off\"}]\r\n\t\t}, {\r\n\t\t\t\"featureType\": \"water\",\r\n\t\t\t\"elementType\": \"geometry.fill\",\r\n\t\t\t\"stylers\": [{\"hue\": \"#008fff\"}, {\"lightness\": \"0\"}, {\"gamma\": \"1\"}]\r\n\t\t}\r\n\t]\r\n\r\n};\r\n\r\nexport default mapStyles;","import OverviewDataProvider from 'ui/overview/OverviewDataProvider';\r\nimport { overviewItem } from 'ui/overview/overviewItem';\r\n\r\nclass Overview {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n this._count = parseInt(this._options.number);\r\n this._trigger = this._element.querySelector(this._options.trigger);\r\n this._max = false;\r\n this._container = document.querySelector(this._options.container);\r\n\r\n this._trigger.addEventListener('click', e => this._onTrigger(e));\r\n\r\n }\r\n\r\n _onTrigger(e) {\r\n\r\n e.preventDefault();\r\n\r\n if (!this._max) {\r\n this._addItems();\r\n }\r\n\r\n }\r\n\r\n _addItems() {\r\n\r\n OverviewDataProvider.getData(this._options.url).then(data => {\r\n\r\n const to = this._count + parseInt(this._options.number);\r\n const documentFragment = document.createDocumentFragment();\r\n\r\n data.slice(this._count, to).forEach(item => {\r\n documentFragment.appendChild(overviewItem(item, this._options.uriBase));\r\n });\r\n\r\n this._container.appendChild(documentFragment);\r\n\r\n this._count = to;\r\n\r\n if (this._count >= data.length) {\r\n this._max = true;\r\n this._trigger.classList.add('hide');\r\n }\r\n\r\n });\r\n\r\n }\r\n}\r\nexport default Overview;","// todo: if this is it it could be generic instead of part of overview\r\nimport { requestJson } from 'data/request';\r\n\r\nclass OverviewDataProvider {\r\n\r\n constructor() {\r\n this._data = null;\r\n }\r\n\r\n getData(url) {\r\n\r\n if (this._data) {\r\n return Promise.resolve(this._data);\r\n }\r\n else {\r\n // todo: if there's a request the requester should probably display a loader\r\n return requestJson(url).then(data => {\r\n this._data = data;\r\n return this._data;\r\n });\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default new OverviewDataProvider();","// Todo: move button/toggle/collapsible logic to separate class\r\nimport OverviewDataProvider from 'ui/overview/OverviewDataProvider';\r\nimport Trigger from 'toggle/Trigger';\r\nimport Collapsible from 'ui/Collapsible';\r\nimport Map from 'ui/map/Map';\r\nimport mapMarkers from 'ui/map/mapMarkers';\r\nimport Observer from 'utils/Observer';\r\nimport ScriptLoader from 'utils/ScriptLoader';\r\n\r\nclass OverviewMap {\r\n\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = Object.assign(OverviewMap.options, options);\r\n this._trigger = null;\r\n this._toggle = null;\r\n this._container = null;\r\n this._map = null;\r\n this._button = null;\r\n\r\n ScriptLoader.load('https://maps.google.com/maps/api/js?key=' + this._options.apiKey)\r\n .then(() => this._initialize());\r\n\r\n }\r\n\r\n static get options() {\r\n \t\treturn {\r\n apiKey: window.GOOGLE_MAPS_API_KEY || 'AIzaSyC00PNATIMijnNvnUEI5P6MFAk5DGk-aPI',\r\n buttonId: 'map-trigger',\r\n containerId: 'overview-map-container',\r\n\t\t\toffsetX: 0,\r\n\t\t\toffsetY: 0/*,\r\n controlPosition: 'RIGHT_BOTTOM'*/\r\n \t\t};\r\n \t}\r\n\r\n _initialize() {\r\n\r\n this._setup();\r\n\r\n if (this._options.button) {\r\n this._button = JSON.parse(this._options.button);\r\n\r\n this._setupButtons();\r\n\r\n this._toggle.active ? this._onActive() : this._onInactive();\r\n\r\n \t\tthis._onActive = this._onActive.bind(this);\r\n \t\tthis._onInactive = this._onInactive.bind(this);\r\n\r\n \t\tObserver.subscribe(this._toggle, 'active', this._onActive);\r\n \t\tObserver.subscribe(this._toggle, 'inactive', this._onInactive);\r\n }\r\n else {\r\n this._setupMap();\r\n }\r\n\r\n }\r\n\r\n _setup() {\r\n\r\n this._container = document.createElement('div');\r\n this._container.id = this._options.containerId;\r\n this._container.className = this._options.containerId;\r\n this._element.appendChild(this._container);\r\n\r\n }\r\n\r\n _setupButtons() {\r\n const displayOnLoad = this._element.offsetWidth > 960;\r\n\r\n this._btn = document.createElement('button');\r\n //this._btn.textContent = this._options.buttonLabel;\r\n this._btn.id = this._options.buttonId;\r\n this._btn.className = 'btn-alt ' + (displayOnLoad ? 'btn-quaternary' : 'btn-tertiary');\r\n\t\tthis._btn.setAttribute('data-toggle-active', (!displayOnLoad).toString());\r\n this._element.appendChild(this._btn);\r\n\r\n this._container.classList.add('collapsible');\r\n this._container.setAttribute('data-toggle-active', (displayOnLoad).toString());\r\n\r\n this._toggle = new Collapsible(this._container).toggle;\r\n this._trigger = new Trigger(this._btn, { targets:this._options.containerId, toggle:true });\r\n }\r\n\r\n _setupMap() {\r\n\r\n OverviewDataProvider.getData(this._options.url).then(data => {\r\n\r\n const markerData = data.map(item => ({\r\n position: {\r\n lat: item.latitude || this._options.latitude,\r\n lng: item.longitude || this._options.longitude,\r\n },\r\n url: this._options.uriBase + item.id,\r\n area: item.woonoppervlakte,\r\n cost: item.totaleHuur,\r\n marker: 'housingMarker'\r\n }));\r\n\r\n const options = {\r\n markerData,\r\n cluster: true,\r\n controlPosition:\r\n this._options.controlPosition\r\n }\r\n\r\n if (this._options.latitude && this._options.longitude) {\r\n options.center = new google.maps.LatLng(this._options.latitude, this._options.longitude)\r\n }\r\n\r\n this._map = new Map(this._container, options);\r\n\r\n });\r\n\r\n }\r\n\r\n\t_onActive() {\r\n\t\t!this._map && this._setupMap();\r\n this._btn.textContent = this._button['label-active'];\r\n\t\tthis._btn.classList.remove('btn-tertiary');\r\n\t\tthis._btn.classList.add('btn-quaternary');\r\n\t}\r\n\r\n\t_onInactive() {\r\n this._btn.textContent = this._button['label-inactive'];\r\n\t\tthis._btn.classList.remove('btn-quaternary');\r\n\t\tthis._btn.classList.add('btn-tertiary');\r\n\t}\r\n\r\n}\r\n\r\nexport default OverviewMap;","export const overviewItem = (data, uriBase) => {\r\n\r\n const { id, advertentietitel, straatnaamEnHuisnummer, fotoURI, plaatsnaam, woonoppervlakte, totaleHuur } = data;\r\n const article = document.createElement('article');\r\n article.className = 'house-thumb';\r\n article.innerHTML =\r\n\r\n `
\r\n

${advertentietitel}

\r\n

${straatnaamEnHuisnummer} ${plaatsnaam}

\r\n Naar de woning\r\n
\r\n\r\n
\r\n
\r\n Oppervlakte: \r\n ${woonoppervlakte} m2 \r\n
\r\n \r\n
\r\n Prijs: \r\n ${totaleHuur} p/m \r\n
\r\n
`;\r\n\r\n return article;\r\n\r\n};","/**\r\n * Cookies\r\n * A complete cookies reader/writer framework with full unicode support by Mozilla:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\r\n *\r\n *\r\n *\r\n * @module util/Cookies\r\n */\r\n\r\nclass Cookies {\r\n\r\n getItem(sKey) {\r\n if (!sKey) {\r\n return null;\r\n }\r\n return decodeURIComponent(document.cookie.replace(new RegExp(\"(?:(?:^|.*;)\\\\s*\" + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\"), \"$1\")) || null;\r\n }\r\n\r\n setItem(sKey, sValue, vEnd, sPath, sDomain, bSecure) {\r\n if (!sKey || /^(?:expires|max\\-age|path|domain|secure)$/i.test(sKey)) {\r\n return false;\r\n }\r\n var sExpires = \"\";\r\n if (vEnd) {\r\n switch (vEnd.constructor) {\r\n case Number:\r\n sExpires = vEnd === Infinity ? \"; expires=Fri, 31 Dec 9999 23:59:59 GMT\" : \"; max-age=\" + vEnd;\r\n break;\r\n case String:\r\n sExpires = \"; expires=\" + vEnd;\r\n break;\r\n case Date:\r\n sExpires = \"; expires=\" + vEnd.toUTCString();\r\n break;\r\n }\r\n }\r\n document.cookie = encodeURIComponent(sKey) + \"=\" + encodeURIComponent(sValue) + sExpires + (sDomain ? \"; domain=\" + sDomain : \"\") + (sPath ? \"; path=\" + sPath : \"\") + (bSecure ? \"; secure\" : \"\");\r\n return true;\r\n }\r\n\r\n removeItem(sKey, sPath, sDomain) {\r\n if (!this.hasItem(sKey)) {\r\n return false;\r\n }\r\n document.cookie = encodeURIComponent(sKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT\" + (sDomain ? \"; domain=\" + sDomain : \"\") + (sPath ? \"; path=\" + sPath : \"\");\r\n return true;\r\n }\r\n\r\n hasItem(sKey) {\r\n if (!sKey) {\r\n return false;\r\n }\r\n return (new RegExp(\"(?:^|;\\\\s*)\" + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\")).test(document.cookie);\r\n }\r\n\r\n keys() {\r\n var aKeys = document.cookie.replace(/((?:^|\\s*;)[^\\=]+)(?=;|$)|^\\s*|\\s*(?:\\=[^;]*)?(?:\\1|$)/g, \"\").split(/\\s*(?:\\=[^;]*)?;\\s*/);\r\n for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {\r\n aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]);\r\n }\r\n return aKeys;\r\n }\r\n}\r\n\r\nexport default new Cookies();\r\n","export const reflow = element => element.offsetHeight;\r\n\r\nexport const setPrefixedStyle = (element, property, value) => {\r\n\tconst prefixes = ['', '-webkit-', '-moz-', '-ms-'];\r\n\tprefixes.forEach(prefix => element.style[prefix + property] = value);\r\n};\r\n\r\nexport const setVendor = (element, property, value) => {\r\n\tlet prefixes = ['-webkit-', '-moz-', '-ms-'];\r\n \telement.style[property] = value;\r\n\r\n \tprefixes.forEach(prefix => element.style[prefix + property] = value);\r\n};\r\n\r\nexport const insertAfter = (newNode, referenceNode) => {\r\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\r\n};\r\n\r\nexport const closest = (elem, selector) => {\r\n\r\n var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;\r\n\r\n while (elem) {\r\n if (matchesSelector.bind(elem)(selector)) {\r\n return elem;\r\n } else {\r\n elem = elem.parentElement;\r\n }\r\n }\r\n return false;\r\n};","class FormHelper {\r\n\r\n static value(element) {\r\n\r\n if (['checkbox', 'radio'].indexOf(element.type) !== -1) {\r\n return element.checked ? element.value : '';\r\n }\r\n\r\n if (element.tagName.toLowerCase() === 'option') {\r\n return element.parentNode.value;\r\n }\r\n\r\n return element.value;\r\n\r\n }\r\n\r\n static setValue(element, value) {\r\n\r\n if (['checkbox', 'radio'].indexOf(element.type) !== -1) {\r\n element.checked = element.getAttribute('value') === value;\r\n } else if (element.tagName.toLowerCase() === 'option') {\r\n element.parentNode.value = value;\r\n } else {\r\n element.value = value;\r\n }\r\n\r\n }\r\n\r\n // Unused for the moment\r\n\r\n // static eventOrigin(elem) {\r\n //\r\n // if (elem.tagName.toLowerCase() === 'option') {\r\n // return elem.parentNode;\r\n // }\r\n //\r\n // return elem;\r\n //\r\n // }\r\n //\r\n // static serialize(form) {\r\n //\r\n // let s = [];\r\n //\r\n // if (typeof form !== 'object' || form.nodeName !== \"FORM\") {\r\n // return;\r\n // }\r\n //\r\n // const fields = [].slice.call(form.elements);\r\n // fields.forEach(field => {\r\n //\r\n // if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {\r\n // if (field.type == 'select-multiple') {\r\n // for (j=form.elements[i].options.length-1; j>=0; j--) {\r\n // if(field.options[j].selected)\r\n // s[s.length] = encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.options[j].value);\r\n // }\r\n // } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {\r\n // s[s.length] = encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.value);\r\n // }\r\n // }\r\n // });\r\n //\r\n // return s.join('&').replace(/%20/g, '+');\r\n //\r\n // }\r\n\r\n}\r\n\r\nexport default FormHelper;\r\n","/**\r\n * By Peeke Kuepers (https://gist.github.com/peeke/42a3f30c2a3856c65c224cc8a47b95f9)\r\n * Used for inter-object communication.\r\n * (Semi-)drop in replacement for Rik Schennink's Observer (https://github.com/rikschennink/conditioner/blob/master/src/utils/Observer.js)\r\n *\r\n * Implementation differences:\r\n * - ES6\r\n * - The use of WeakMaps\r\n * - inform() and conceal() don't return a boolean indicating success.\r\n * - Subscription fn's are called with seperate arguments, instead of one data parameter. This is backwards compatible.\r\n *\r\n * @name Observer\r\n */\r\n\r\nclass Observer {\r\n\r\n\tconstructor() {\r\n\t\t// We use WeakMaps, so subscriptions get automatically removed when the subject is lost\r\n\t\t// Think DOM elements\r\n\t\tthis._subscriptions = new WeakMap();\r\n\t\tthis._informants = new WeakMap();\r\n\t}\r\n\r\n\t_push(map, key, value) {\r\n\r\n\t\t// Merge new and old values\r\n\t\tlet values = [ value ];\r\n\t\tif (map.has(key)) {\r\n\t\t\tvalues = [ ...values, ...map.get(key) ];\r\n\t\t}\r\n\r\n\t\t// Update set\r\n\t\tmap.set(key, values);\r\n\r\n\t}\r\n\r\n\t_filter(map, key, filterFn) {\r\n\r\n\t\t// Not in -> bailout, there's no need to filter\r\n\t\tif (!map.has(key)) return;\r\n\r\n\t\t// Filter the current values in the set and update the set\r\n\t\tlet values = map.get(key).filter(filterFn);\r\n\t\tmap.set(key, values);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribe to an event\r\n\t * @method subscribe\r\n\t * @memberof Observer\r\n\t * @param {Object} subject - Object to subscribe to.\r\n\t * @param {String} event - Event type to listen for.\r\n\t * @param {Function} fn - Function to call when event published.\r\n\t */\r\n\tsubscribe(subject, event, fn) {\r\n\t\tthis._push(this._subscriptions, subject, { event, fn });\r\n\t}\r\n\r\n\t/**\r\n\t * Unsubscribe from further notifications\r\n\t * @method unsubscribe\r\n\t * @memberof Observer\r\n\t * @param {Object} subject - Object to unsubscribe from.\r\n\t * @param {String} event - Event type to match.\r\n\t * @param {Function} fn - Function to match.\r\n\t */\r\n\tunsubscribe(subject, event, fn) {\r\n\t\tlet filterFn = subscription => subscription.event !== event || subscription.fn !== fn;\r\n\t\tthis._filter(this._subscriptions, subject, filterFn);\r\n\t}\r\n\r\n\t/**\r\n\t * Publish an event\r\n\t * @method publish\r\n\t * @memberof Observer\r\n\t * @param {Object} subject - Object to fire the event on.\r\n\t * @param {String} event - Event type to fire.\r\n\t * @param {...*} args - Parameters to apply to the fn of the subscription object\r\n\t */\r\n\tpublish(subject, event, ...args) {\r\n\r\n\t\tif (this._subscriptions.has(subject)) {\r\n\t\t\tthis._subscriptions.get(subject)\r\n\t\t\t\t.filter(subscription => subscription.event === event)\r\n\t\t\t\t.map(subscription => subscription.fn)\r\n\t\t\t\t.forEach(fn => fn(...args));\r\n\t\t}\r\n\r\n\t\tif (this._informants.has(subject)) {\r\n\t\t\tthis._informants.get(subject)\r\n\t\t\t\t.forEach(_subject => this.publish(_subject, event, ...args));\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Publishes an async event. This means other waiting (synchronous) code is executed first before the event is published.\r\n\t * @method publishAsync\r\n\t * @memberof Observer\r\n\t * @param {Object} subject - Object to fire the event on.\r\n\t * @param {String} event - Event type to fire.\r\n\t * @param {...*} args - Parameters to apply to the fn of the subscription object\r\n\t */\r\n\tpublishAsync(subject, event, ...args) {\r\n\t\tsetTimeout(() => this.publish(subject, event, ...args), 0)\r\n\t}\r\n\r\n\t/**\r\n\t * Setup propagation target for events so they can bubble up the object tree.\r\n\t * @method inform\r\n\t * @memberof Observer\r\n\t * @param {Object} informant - Object to set as origin. Events from this object will also be published on receiver.\r\n\t * @param {Object} receiver - Object to set as target.\r\n\t */\r\n\tinform(informant, receiver) {\r\n\t\tthis._push(this._informants, informant, receiver);\r\n\t}\r\n\r\n\t/**\r\n\t * Remove propagation target\r\n\t * @memberof Observer\r\n\t * @param {Object} informant - Object previously set as origin.\r\n\t * @param {Object} receiver - Object previously set as target.\r\n\t */\r\n\tconceal(informant, receiver) {\r\n\t\tlet filterFn = _receiver => receiver !== _receiver;\r\n\t\tthis._filter(this._informants, informant, filterFn);\r\n\t}\r\n\r\n}\r\n\r\nexport default new Observer();","class ScriptLoader {\r\n\r\n\tconstructor() {\r\n\t\tthis._scripts = new Map();\r\n\t}\r\n\r\n\tload(src) {\r\n\r\n\t\tif (this._scripts.has(src)) {\r\n\t\t\treturn this._scripts.get(src);\r\n\t\t}\r\n\r\n\t\tconst script = new Promise((resolve, reject) => {\r\n\r\n\t\t\tconst tag = document.createElement('script');\r\n\r\n\t\t\ttag.src = src;\r\n\t\t\ttag.onload = resolve;\r\n\t\t\ttag.onerror = reject;\r\n\r\n\t\t\tdocument.body.appendChild(tag);\r\n\r\n\t\t});\r\n\r\n\t\tthis._scripts.set(src, script);\r\n\r\n\t\treturn script;\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default new ScriptLoader();\r\n","const attributeObserver = (element, attr, cb) => {\r\n\r\n const mutObserver = new MutationObserver(mutations => {\r\n mutations.forEach(mut => {\r\n mut.attributeName === attr && cb(element.getAttribute(attr));\r\n });\r\n });\r\n\r\n mutObserver.observe(element, {\r\n attributes: true,\r\n attributeFilter: [ attr ]\r\n });\r\n\r\n return mutObserver;\r\n\r\n};\r\n\r\n// const handleAttrChangeFn = attrValue => console.log(attrValue);\r\n// const ariaHiddenObserver = attributeObserver(document.getElementById('foo'), 'aria-hidden', handleAttrChangeFn);\r\n\r\nexport default attributeObserver;","// todo: rewrite just as domhelpers\r\n\r\nconst eventHelpers = {\r\n\r\n\tthrottle(fn, ms) {\r\n\r\n\t\tlet throttling = false;\r\n\r\n\t\treturn function _throttle() {\r\n\t\t\tif (!throttling) {\r\n\r\n\t\t\t\tthrottling = true;\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthrottling = false;\r\n\t\t\t\t\tfn.apply(arguments);\r\n\t\t\t\t}, ms);\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t},\r\n\r\n\tdebounce(fn, ms) {\r\n\r\n\t\tlet timeout;\r\n\r\n\t\treturn function debounce() {\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttimeout = setTimeout(() => fn.apply(null, arguments), ms);\r\n\t\t};\r\n\r\n\t},\r\n\r\n\tdebounceStart(fn, ms) {\r\n\r\n\t\tlet timeout;\r\n\t\tlet fired = false;\r\n\r\n\t\treturn function debounce() {\r\n\r\n\t\t\tif (!fired) {\r\n\t\t\t\tfired = true;\r\n\t\t\t\tfn.apply(null, arguments);\r\n\t\t\t}\r\n\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttimeout = setTimeout(() => fired = false, ms);\r\n\t\t\t\r\n\t\t};\r\n\r\n\t},\r\n\r\n\traf(fn) {\r\n\r\n\t\tlet raf;\r\n\r\n\t\treturn function _raf() {\r\n\t\t\tcancelAnimationFrame(raf);\r\n\t\t\traf = requestAnimationFrame(() => fn.apply(null, arguments));\r\n\t\t};\r\n\r\n\t},\r\n\r\n\tgetTransitionEvent() {\r\n\r\n\t\tconst el = document.createElement('fakeelement');\r\n\t\tconst transitions = {\r\n\t\t\ttransition: 'transitionend',\r\n\t\t\tOTransition: 'oTransitionEnd',\r\n\t\t\tMozTransition: 'transitionend',\r\n\t\t\tWebkitTransition: 'webkitTransitionEnd'\r\n\t\t};\r\n\r\n\t\tfor (let t in transitions) {\r\n\t\t\tif (typeof el.style[t] !== 'undefined') {\r\n\t\t\t\treturn transitions[t];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tlistenOnce(target, event, fn) {\r\n\t\tconst _fn = function() {\r\n\t\t\tfn.apply(null, arguments);\r\n\t\t\ttarget.removeEventListener(event, _fn);\r\n\t\t};\r\n\r\n\t\treturn target.addEventListener(event, _fn);\r\n\t},\r\n\r\n\taddEventListeners(element, events, fn) {\r\n\t\tevents = [...events];\r\n\t\treturn events.forEach(event => element.addEventListener(event, fn));\r\n\t}\r\n\r\n};\r\n\r\nexport default eventHelpers;\r\n","const ioHelpers = {\r\n\r\n\tparse(json) {\r\n\r\n\t\tconst data = JSON.parse(json);\r\n\r\n\t\treturn Object.keys(data).map(key => {\r\n\t\t\treturn {\r\n\t\t\t\tkey,\r\n\t\t\t\tstoreKey: data[key]\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t},\r\n\r\n\toutput(dataStore, output, data) {\r\n\r\n\t\toutput.forEach(output => {\r\n\t\t\tdataStore.set(output.storeKey, data[output.key]);\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tstoreKeys(input) {\r\n\t\treturn input.map(item => item.storeKey);\r\n\t}\r\n\r\n};\r\n\r\nexport default ioHelpers;\r\n","const latLngHelpers = {\r\n\r\n\tgetBounds(latLngs) {\r\n\t\tconst bounds = new google.maps.LatLngBounds();\r\n\t\tlatLngs.forEach(latLng => bounds.extend(latLng));\r\n\t\treturn bounds;\r\n\t},\r\n\r\n\tcenterOfLatLngs(latLngs) {\r\n\t\tconst bounds = this.getBounds(latLngs);\r\n\t\tconst north = bounds.getNorthEast().lat();\r\n\t\tconst east = bounds.getNorthEast().lng();\r\n\t\tconst south = bounds.getSouthWest().lat();\r\n\t\tconst west = bounds.getSouthWest().lng();\r\n\t\treturn new google.maps.LatLng((north + south) / 2, (east, west) / 2);\r\n\t},\r\n\r\n\tparseCoordinate(coordinate) {\r\n return new google.maps.LatLng(coordinate.lat, coordinate.lng);\r\n\t},\r\n\r\n\tparseCoordinates(coordinates) {\r\n\t\treturn Array.isArray(coordinates)\r\n\t\t\t? coordinates.map(coordinate => this.parseCoordinate(coordinate))\r\n\t\t\t: this.parseCoordinate(coordinates);\r\n\t}\r\n\r\n};\r\n\r\nexport default latLngHelpers;","// todo: use a generic ticker instead of the specific requestAnimationFrame method?\r\n\r\nconst OFFSET = 140,\r\n\tDURATION = 1000,\r\n\tMAX = 0.8,\r\n\tEASING = t => t * (2 - t);\r\n\r\nconst scrollTo = element => {\r\n\r\n\tlet scrollY = window.scrollY || window.pageYOffset,\r\n\t\tscrollTargetY = (element.getBoundingClientRect().top + scrollY) - OFFSET,\r\n\t\tcurrent = 0,\r\n\t\ttime = Math.max(0.1, Math.min(Math.abs(scrollY - scrollTargetY) / DURATION, MAX));\r\n\r\n\tlet tick = () => {\r\n\r\n\t\tcurrent += 1 / 60;\r\n\r\n\t\tlet p = current / time;\r\n\r\n\t\tif (p < 1) {\r\n\t\t\twindow.requestAnimationFrame(tick);\r\n\t\t\twindow.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * EASING(p)));\r\n\t\t}\r\n\t\telse {\r\n\t\t\twindow.scrollTo(0, scrollTargetY);\r\n\t\t}\r\n\r\n\t};\r\n\r\n\ttick();\r\n\r\n};\r\n\r\nexport default scrollTo;","import Observer from 'utils/Observer';\r\n\r\n/**\r\n * Class Controller.\r\n * @class\r\n */\r\nclass Controller {\r\n\r\n /**\r\n * Make a new Controller.\r\n * @constructs\r\n */\r\n constructor() {\r\n this._toggles = [];\r\n this._groupHandlers = [];\r\n }\r\n\r\n /**\r\n * Add the Toggle to the array and subscribe with the Observer for optional group handling\r\n * @public\r\n * @param toggle\r\n */\r\n register(toggle) {\r\n\r\n this._toggles.push(toggle);\r\n\r\n if (toggle.group) {\r\n\r\n let handleGroupFn = toggle => this._handleGroup(toggle);\r\n\r\n // Subscribe and store the groupHandler in a way we can retrieve it with a toggle reference\r\n Observer.subscribe(toggle, toggle.activeEvent, handleGroupFn);\r\n this._groupHandlers[this._toggles.indexOf(toggle)] = handleGroupFn;\r\n\r\n }\r\n\r\n }\r\n\r\n\t/**\r\n * Unregister the toggle from the array. Useful for unloading the toggle module.\r\n * @param toggle\r\n */\r\n unregister(toggle) {\r\n\r\n // retrieve index of the given toggle\r\n let index = this._toggles.indexOf(toggle);\r\n\r\n this._toggles.splice(index, 1);\r\n\r\n if (toggle.group){\r\n\r\n // Retrieve the respective groupHandler function\r\n let handleGroupFn = this._groupHandlers[index];\r\n\r\n // Unsubscribe and remove the groupHandler\r\n Observer.unsubscribe(toggle, toggle.activeEvent, handleGroupFn);\r\n this._groupHandlers.splice(index, 1);\r\n\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Helper method for exposing Toggles.\r\n * @public\r\n * @param {String} targets\r\n */\r\n getToggles(targets) {\r\n\r\n if (!targets) { return []; }\r\n\r\n return targets.split(',').map(element => {\r\n return this._getToggle(element);\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Helper method for getting a toggle by id.\r\n * @private\r\n * @param {String} element\r\n */\r\n _getToggle(element) {\r\n return this._toggles.find(toggle => toggle.id === element);\r\n }\r\n\r\n /**\r\n * If a toggle is a group member deactivate the active toggle within the same group first.\r\n * @private\r\n * @param toggle\r\n */\r\n _handleGroup(toggle) {\r\n this._toggles.forEach((item) => {\r\n if (item !== toggle && item.group === toggle.group && item.active) {\r\n item.deactivate();\r\n }\r\n })\r\n }\r\n\r\n}\r\n\r\n// export as a Singleton\r\nexport default new Controller();\r\n","import Controller from 'toggle/Controller';\r\nimport Observer from 'utils/Observer';\r\n\r\n/**\r\n * Default values for attribute and states.\r\n * @constant\r\n */\r\nconst ATTRIBUTE = 'data-toggle-active',\r\n ACTIVE_STATE = 'true',\r\n INACTIVE_STATE = 'false',\r\n ACTIVE_EVENT = 'active',\r\n INACTIVE_EVENT = 'inactive';\r\n\r\n/**\r\n * Class Toggle.\r\n * @class\r\n */\r\nclass Toggle {\r\n\r\n /**\r\n * Make a new Toggle.\r\n * @constructs\r\n * @param element\r\n * @param options\r\n */\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options || {};\r\n\r\n this._options.attribute = this._options.attribute || ATTRIBUTE;\r\n this._options.activeState = this._options.activeState || ACTIVE_STATE;\r\n this._options.inActiveState = this._options.inActiveState || INACTIVE_STATE;\r\n this._id = this._element.id;\r\n this.active = false;\r\n\r\n this._initialize();\r\n\r\n }\r\n\r\n /**\r\n * Initialize\r\n * @private\r\n */\r\n _initialize() {\r\n\r\n let attr = this._element.getAttribute(this._options.attribute);\r\n\r\n if (!attr) {\r\n this.attribute = this._options.inActiveState;\r\n }\r\n else if (attr === this._options.activeState) {\r\n this.active = true;\r\n }\r\n\r\n Controller.register(this);\r\n\r\n }\r\n\r\n switch() {\r\n !this.active ? this.activate() : this.deactivate();\r\n }\r\n\r\n /**\r\n * Activating the toggle by changing the attribute active value.\r\n * @public\r\n */\r\n activate() {\r\n this.attribute = this._options.activeState;\r\n this.active = true;\r\n Observer.publish(this, ACTIVE_EVENT, this);\r\n }\r\n\r\n /**\r\n * Deactivating the toggle by changing the attribute inactive value.\r\n * @public\r\n */\r\n deactivate() {\r\n this.attribute = this._options.inActiveState;\r\n this.active = false;\r\n Observer.publish(this, INACTIVE_EVENT, this);\r\n }\r\n\r\n /**\r\n * Set te active attribute on the DOM element.\r\n * @public\r\n * @param {String} name\r\n */\r\n set attribute(name) {\r\n this._element.setAttribute(this._options.attribute, name);\r\n }\r\n\r\n /**\r\n * Expose the id.\r\n * @public\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n /**\r\n * Expose the group name.\r\n * @public\r\n */\r\n get group() {\r\n return this._options.group;\r\n }\r\n\r\n /**\r\n * Expose the toggle active event.\r\n * @public\r\n */\r\n get activeEvent() {\r\n return ACTIVE_EVENT;\r\n }\r\n\r\n /**\r\n * Expose the toggle inactive event.\r\n * @public\r\n */\r\n get inActiveEvent() {\r\n return INACTIVE_EVENT;\r\n }\r\n\r\n /**\r\n * Unload and reset everything if conditions no longer apply.\r\n * @method unload\r\n * @public\r\n */\r\n unload() {\r\n\r\n Controller.unregister(this);\r\n this._element.removeAttribute(this._options.attribute);\r\n\r\n }\r\n\r\n}\r\n\r\nexport default Toggle;\r\n","import Controller from 'toggle/Controller';\r\nimport Toggle from 'toggle/Toggle';\r\n\r\n/**\r\n * Default values event and method\r\n * @constant\r\n */\r\nconst EVENT = 'click',\r\n METHOD = 'switch';\r\n\r\n\r\nclass Trigger {\r\n\r\n /**\r\n * Make a new Trigger.\r\n * @constructs\r\n * @param element\r\n * @param options\r\n */\r\n constructor(element, options) {\r\n\r\n this._element = element;\r\n this._options = options;\r\n this._toggle = null;\r\n this._targets = null;\r\n this._triggerFn = null;\r\n\r\n this._intitialize();\r\n\r\n }\r\n\r\n /**\r\n * Initialize\r\n * @private\r\n */\r\n _intitialize() {\r\n\r\n // get optional event and method from options or use default\r\n let event = this._options.event || EVENT;\r\n\r\n if (this._options.toggle) {\r\n this._toggle = new Toggle(this._element, this._options);\r\n }\r\n\r\n // if there is a element bind events\r\n if (this._element) {\r\n this._triggerFn = e => this._trigger(e);\r\n this._element.addEventListener(event, this._triggerFn);\r\n }\r\n\r\n }\r\n\r\n\t/**\r\n * Handles trigger event\r\n * @param e\r\n * @private\r\n */\r\n _trigger(e) {\r\n\r\n let method = this._options.method || METHOD,\r\n preventDefault = this._options.preventDefault !== 'false';\r\n\r\n if (e.type === 'click' && preventDefault) {\r\n e.preventDefault();\r\n }\r\n\r\n if (!this._targets) { this._setTargets(); }\r\n this._targets.forEach((element, index) => {\r\n\r\n // check if there are multiple methods otherwise use one\r\n let arr = method.split(','),\r\n i = arr.length > 1 ? index : 0;\r\n\r\n element[method.split(',')[i]]();\r\n\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Get the toggle targets\r\n * @private\r\n */\r\n _setTargets() {\r\n\r\n // get targets through controller\r\n this._targets = Controller.getToggles(this._options.targets);\r\n if (this._toggle) { this._targets.push(this._toggle); }\r\n\r\n }\r\n\r\n /**\r\n * Expose targets\r\n * @public\r\n */\r\n getTargets() {\r\n return this._targets;\r\n }\r\n\r\n /**\r\n * Unload and reset everything if conditions no longer apply.\r\n * @method unload\r\n * @public\r\n */\r\n unload() {\r\n\r\n if (this._options.toggle) {\r\n this._toggle.unload();\r\n }\r\n\r\n if (this._element) {\r\n // get optional event and method from options or use default\r\n let event = this._options.event || EVENT;\r\n\r\n this._element.removeEventListener(event, this._triggerFn);\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport default Trigger;\r\n"]}